کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

به عنوان بخشی از جلسه 0x0A DC7831 DEF CON نیژنی نووگورود در 16 فوریه، ما گزارشی در مورد اصول اولیه شبیه سازی کد باینری و توسعه خودمان ارائه کردیم - شبیه ساز پلت فرم سخت افزاری کپی کردن.

در این مقاله نحوه اجرای سیستم عامل دستگاه در شبیه ساز، نشان دادن تعامل با دیباگر و انجام یک تجزیه و تحلیل دینامیکی کوچک از سیستم عامل را شرح خواهیم داد.

ماقبل تاریخ

خیلی وقت پیش در یک کهکشان بسیار دور

چند سال پیش در آزمایشگاه ما نیاز به بررسی سیستم عامل یک دستگاه وجود داشت. سیستم عامل فشرده و با بوت لودر باز شد. او این کار را به روشی بسیار پیچیده انجام داد و چندین بار داده ها را در حافظه جابجا کرد. و سپس خود سیستم عامل به طور فعال با دستگاه های جانبی تعامل داشت. و همه اینها روی هسته MIPS.

به دلایل عینی، شبیه سازهای موجود برای ما مناسب نبودند، اما همچنان می خواستیم کد را اجرا کنیم. سپس تصمیم گرفتیم شبیه ساز خودمان را بسازیم، که حداقل کار را انجام می دهد و به ما امکان می دهد فریمور اصلی را باز کنیم. ما آن را امتحان کردیم و کار کرد. فکر کردیم، چه می‌شود اگر برای اجرای سفت‌افزار اصلی، دستگاه‌های جانبی اضافه کنیم. خیلی درد نداشت - و همچنین نتیجه داد. دوباره فکر کردیم و تصمیم گرفتیم یک شبیه ساز کامل بسازیم.

نتیجه یک شبیه ساز سیستم های کامپیوتری بود کپی کردن.

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید
چرا Kopycat؟

بازی با کلمات وجود دارد.

  1. کپی برداری (انگلیسی، اسم [ˈkɒpɪkæt]) - مقلد، مقلد
  2. گربه (انگلیسی، اسم [ˈkæt]) - گربه، گربه - حیوان مورد علاقه یکی از سازندگان پروژه
  3. حرف "K" از زبان برنامه نویسی کاتلین است

کپی کردن

هنگام ایجاد شبیه ساز، اهداف بسیار خاصی تعیین شد:

  • توانایی ایجاد سریع لوازم جانبی، ماژول ها، هسته های پردازنده.
  • امکان مونتاژ یک دستگاه مجازی از ماژول های مختلف؛
  • توانایی بارگیری هر داده باینری (سیستم افزار) در حافظه یک دستگاه مجازی؛
  • توانایی کار با عکس های فوری (عکس های فوری از وضعیت سیستم)؛
  • توانایی تعامل با شبیه ساز از طریق دیباگر داخلی؛
  • زبان مدرن زیبا برای توسعه

در نتیجه، Kotlin برای پیاده سازی، معماری گذرگاه (این زمانی است که ماژول ها از طریق گذرگاه های داده مجازی با یکدیگر ارتباط برقرار می کنند)، JSON به عنوان فرمت توضیحات دستگاه و GDB RSP به عنوان پروتکلی برای تعامل با دیباگر انتخاب شد.

توسعه کمی بیش از دو سال است که ادامه دارد و به طور فعال ادامه دارد. در این مدت هسته های پردازنده MIPS، x86، V850ES، ARM و PowerPC پیاده سازی شدند.

این پروژه در حال رشد است و زمان ارائه آن به عموم مردم فرا رسیده است. بعداً شرح مفصلی از پروژه انجام خواهیم داد، اما در حال حاضر روی استفاده از Kopycat تمرکز خواهیم کرد.

برای بی حوصله ترین ها، نسخه تبلیغاتی شبیه ساز را می توان از آن دانلود کرد پیوند.

راینو در شبیه ساز

به یاد بیاوریم که قبلاً برای کنفرانس SMARTRHINO-2018، یک دستگاه آزمایشی "Rhinoceros" برای آموزش مهارت های مهندسی معکوس ساخته شد. فرآیند تجزیه و تحلیل سیستم عامل استاتیک در شرح داده شد این مقاله.

اکنون بیایید سعی کنیم "بلندگو" را اضافه کنیم و سیستم عامل را در شبیه ساز اجرا کنیم.

ما نیاز داریم:
1) جاوا 1.8
2) پایتون و ماژول جیپ برای استفاده از پایتون در داخل شبیه ساز. شما می توانید ماژول WHL Jep را برای ویندوز بسازید اینجا را بارگیری کنید.

برای ویندوز:
1) com0com
2) توله سگ

برای لینوکس:
1) سوکات

می توانید از Eclipse، IDA Pro یا radare2 به عنوان مشتری GDB استفاده کنید.

چگونه کار می کند؟

برای اجرای سیستم عامل در شبیه ساز، لازم است یک دستگاه مجازی، که آنالوگ یک دستگاه واقعی است، "مونتاژ" شود.

دستگاه واقعی ("کرگدن") را می توان در بلوک دیاگرام نشان داد:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

شبیه ساز ساختار ماژولار دارد و دستگاه مجازی نهایی را می توان در یک فایل JSON توصیف کرد.

خطوط JSON 105

{
  "top": true,

  // Plugin name should be the same as file name (or full path from library start)
  "plugin": "rhino",

  // Directory where plugin places
  "library": "user",

  // Plugin parameters (constructor parameters if jar-plugin version)
  "params": [
    { "name": "tty_dbg", "type": "String"},
    { "name": "tty_bt", "type": "String"},
    { "name": "firmware", "type": "String", "default": "NUL"}
  ],

  // Plugin outer ports
  "ports": [  ],

  // Plugin internal buses
  "buses": [
    { "name": "mem", "size": "BUS30" },
    { "name": "nand", "size": "4" },
    { "name": "gpio", "size": "BUS32" }
  ],

  // Plugin internal components
  "modules": [
    {
      "name": "u1_stm32",
      "plugin": "STM32F042",
      "library": "mcu",
      "params": {
        "firmware:String": "params.firmware"
      }
    },
    {
      "name": "usart_debug",
      "plugin": "UartSerialTerminal",
      "library": "terminals",
      "params": {
        "tty": "params.tty_dbg"
      }
    },
    {
      "name": "term_bt",
      "plugin": "UartSerialTerminal",
      "library": "terminals",
      "params": {
        "tty": "params.tty_bt"
      }
    },
    {
      "name": "bluetooth",
      "plugin": "BT",
      "library": "mcu"
    },

    { "name": "led_0",  "plugin": "LED", "library": "mcu" },
    { "name": "led_1",  "plugin": "LED", "library": "mcu" },
    { "name": "led_2",  "plugin": "LED", "library": "mcu" },
    { "name": "led_3",  "plugin": "LED", "library": "mcu" },
    { "name": "led_4",  "plugin": "LED", "library": "mcu" },
    { "name": "led_5",  "plugin": "LED", "library": "mcu" },
    { "name": "led_6",  "plugin": "LED", "library": "mcu" },
    { "name": "led_7",  "plugin": "LED", "library": "mcu" },
    { "name": "led_8",  "plugin": "LED", "library": "mcu" },
    { "name": "led_9",  "plugin": "LED", "library": "mcu" },
    { "name": "led_10", "plugin": "LED", "library": "mcu" },
    { "name": "led_11", "plugin": "LED", "library": "mcu" },
    { "name": "led_12", "plugin": "LED", "library": "mcu" },
    { "name": "led_13", "plugin": "LED", "library": "mcu" },
    { "name": "led_14", "plugin": "LED", "library": "mcu" },
    { "name": "led_15", "plugin": "LED", "library": "mcu" }
  ],

  // Plugin connection between components
  "connections": [
    [ "u1_stm32.ports.usart1_m", "usart_debug.ports.term_s"],
    [ "u1_stm32.ports.usart1_s", "usart_debug.ports.term_m"],

    [ "u1_stm32.ports.usart2_m", "bluetooth.ports.usart_m"],
    [ "u1_stm32.ports.usart2_s", "bluetooth.ports.usart_s"],

    [ "bluetooth.ports.bt_s", "term_bt.ports.term_m"],
    [ "bluetooth.ports.bt_m", "term_bt.ports.term_s"],

    [ "led_0.ports.pin",  "u1_stm32.buses.pin_output_a", "0x00"],
    [ "led_1.ports.pin",  "u1_stm32.buses.pin_output_a", "0x01"],
    [ "led_2.ports.pin",  "u1_stm32.buses.pin_output_a", "0x02"],
    [ "led_3.ports.pin",  "u1_stm32.buses.pin_output_a", "0x03"],
    [ "led_4.ports.pin",  "u1_stm32.buses.pin_output_a", "0x04"],
    [ "led_5.ports.pin",  "u1_stm32.buses.pin_output_a", "0x05"],
    [ "led_6.ports.pin",  "u1_stm32.buses.pin_output_a", "0x06"],
    [ "led_7.ports.pin",  "u1_stm32.buses.pin_output_a", "0x07"],
    [ "led_8.ports.pin",  "u1_stm32.buses.pin_output_a", "0x08"],
    [ "led_9.ports.pin",  "u1_stm32.buses.pin_output_a", "0x09"],
    [ "led_10.ports.pin", "u1_stm32.buses.pin_output_a", "0x0A"],
    [ "led_11.ports.pin", "u1_stm32.buses.pin_output_a", "0x0B"],
    [ "led_12.ports.pin", "u1_stm32.buses.pin_output_a", "0x0C"],
    [ "led_13.ports.pin", "u1_stm32.buses.pin_output_a", "0x0D"],
    [ "led_14.ports.pin", "u1_stm32.buses.pin_output_a", "0x0E"],
    [ "led_15.ports.pin", "u1_stm32.buses.pin_output_a", "0x0F"]
  ]
}

به پارامتر توجه کنید سفت افزار بخش پارام ها نام فایلی است که می تواند به عنوان سیستم عامل در یک دستگاه مجازی بارگذاری شود.

دستگاه مجازی و تعامل آن با سیستم عامل اصلی را می توان با نمودار زیر نشان داد:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

نمونه آزمایشی فعلی شبیه ساز شامل تعامل با پورت های COM سیستم عامل اصلی است (اشکال زدایی UART و UART برای ماژول بلوتوث). اینها می توانند پورت های واقعی باشند که دستگاه ها به آن ها متصل هستند یا پورت های COM مجازی (برای این کار فقط نیاز دارید com0com/socat).

در حال حاضر دو راه اصلی برای تعامل با شبیه ساز از خارج وجود دارد:

  • پروتکل GDB RSP (بر این اساس، ابزارهایی که از این پروتکل پشتیبانی می کنند Eclipse / IDA / radare2 هستند).
  • خط فرمان شبیه ساز داخلی (Argparse یا Python).

پورت های COM مجازی

به منظور تعامل با UART یک دستگاه مجازی در ماشین محلی از طریق یک ترمینال، باید یک جفت پورت COM مجازی مرتبط ایجاد کنید. در مورد ما، یک پورت توسط شبیه ساز و دومی توسط یک برنامه ترمینال (PuTTY یا صفحه نمایش) استفاده می شود:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

با استفاده از com0com

پورت های COM مجازی با استفاده از ابزار راه اندازی از کیت com0com پیکربندی شده اند (نسخه کنسول - C: فایل های برنامه (x86) com0comsetupс.exe، یا نسخه رابط کاربری گرافیکی - C: فایل های برنامه (x86) com0comsetupg.exe):

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

جعبه ها را علامت بزنید فعال کردن بیش از حد بافر برای تمام پورت های مجازی ایجاد شده، در غیر این صورت شبیه ساز منتظر پاسخ از پورت COM می ماند.

با استفاده از سوکت

در سیستم‌های یونیکس، پورت‌های COM مجازی به‌طور خودکار توسط شبیه‌ساز با استفاده از ابزار socat ایجاد می‌شوند؛ برای انجام این کار، کافیست در هنگام راه‌اندازی شبیه‌ساز، پیشوند نام پورت را مشخص کنید. socat:.

رابط خط فرمان داخلی (Argparse یا Python)

از آنجایی که Kopycat یک برنامه کنسول است، شبیه ساز دو گزینه رابط خط فرمان را برای تعامل با اشیاء و متغیرهای خود ارائه می دهد: Argparse و Python.

Argparse یک CLI است که در Kopycat ساخته شده است و همیشه در دسترس همه است.

یک CLI جایگزین، مفسر پایتون است. برای استفاده از آن، باید ماژول Jep Python را نصب کرده و شبیه ساز را برای کار با پایتون پیکربندی کنید (مفسر پایتون نصب شده در سیستم اصلی کاربر استفاده خواهد شد).

نصب ماژول پایتون Jep

تحت لینوکس Jep را می توان از طریق pip نصب کرد:

pip install jep

برای نصب Jep در ویندوز، ابتدا باید Windows SDK و Microsoft Visual Studio مربوطه را نصب کنید. ما این کار را کمی برای شما آسان کرده ایم و WHL می سازد JEP برای نسخه های فعلی پایتون برای ویندوز، بنابراین ماژول را می توان از فایل نصب کرد:

pip install jep-3.8.2-cp27-cp27m-win_amd64.whl

برای بررسی نصب Jep، باید در خط فرمان اجرا کنید:

python -c "import jep"

در پاسخ باید پیام زیر دریافت شود:

ImportError: Jep is not supported in standalone Python, it must be embedded in Java.

در فایل دسته ای شبیه ساز برای سیستم شما (copycat.bat - برای ویندوز، کپی - برای لینوکس) به لیست پارامترها DEFAULT_JVM_OPTS یک پارامتر اضافی اضافه کنید Djava.library.path - باید شامل مسیر ماژول Jep نصب شده باشد.

نتیجه برای ویندوز باید یک خط مانند زیر باشد:

set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"

راه اندازی Kopycat

شبیه ساز یک برنامه JVM کنسول است. راه اندازی از طریق اسکریپت خط فرمان سیستم عامل (sh/cmd) انجام می شود.

دستور اجرا در ویندوز:

binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28

دستور اجرای تحت لینوکس با استفاده از ابزار socat:

./bin/kopycat -g 23946 -n rhino -l user -y library -p firmware=./firmware/rhino_pass.bin, tty_dbg=socat:./COM26,tty_bt=socat:./COM28

  • -g 23646 - پورت TCP که برای دسترسی به سرور GDB باز خواهد شد.
  • -n rhino - نام ماژول سیستم اصلی (دستگاه مونتاژ شده)؛
  • -l user - نام کتابخانه برای جستجوی ماژول اصلی؛
  • -y library - مسیر جستجوی ماژول های موجود در دستگاه؛
  • firmwarerhino_pass.bin - مسیر فایل سیستم عامل؛
  • COM26 و COM28 پورت های COM مجازی هستند.

در نتیجه یک اعلان نمایش داده می شود Python > (یا Argparse >):

18:07:59 INFO [eFactoryBuilder.create ]: Module top successfully created as top
18:07:59 INFO [ Module.initializeAndRes]: Setup core to top.u1_stm32.cortexm0.arm for top
18:07:59 INFO [ Module.initializeAndRes]: Setup debugger to top.u1_stm32.dbg for top
18:07:59 WARN [ Module.initializeAndRes]: Tracer wasn't found in top...
18:07:59 INFO [ Module.initializeAndRes]: Initializing ports and buses...
18:07:59 WARN [ Module.initializePortsA]: ATTENTION: Some ports has warning use printModulesPortsWarnings to see it...
18:07:59 FINE [ ARMv6CPU.reset ]: Set entry point address to 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Module top is successfully initialized and reset as a top cell!
18:07:59 INFO [ Kopycat.open ]: Starting virtualization of board top[rhino] with arm[ARMv6Core]
18:07:59 INFO [ GDBServer.debuggerModule ]: Set new debugger module top.u1_stm32.dbg for GDB_SERVER(port=23946,alive=true)
Python >

تعامل با IDA Pro

برای ساده سازی تست، ما از سیستم عامل Rhino به عنوان فایل منبع برای تجزیه و تحلیل در IDA در فرم استفاده می کنیم فایل ELF (اطلاعات متا در آنجا ذخیره می شود).

همچنین می توانید از فریمور اصلی بدون اطلاعات متا استفاده کنید.

پس از راه‌اندازی Kopycat در IDA Pro، در منوی Debugger به آیتم «تغییر اشکال‌زدا…"و انتخاب کنید"دیباگر از راه دور GDB". سپس، منوی اتصال را تنظیم کنید اشکال زدا - گزینه های پردازش…

مقادیر را تنظیم کنید:

  • برنامه - هر مقدار
  • نام میزبان: 127.0.0.1 (یا آدرس IP دستگاه راه دوری که Kopycat در آن اجرا می شود)
  • بندر: 23946

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

اکنون دکمه رفع اشکال در دسترس است (کلید F9):

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

روی آن کلیک کنید تا به ماژول دیباگر در شبیه ساز متصل شوید. IDA وارد حالت اشکال‌زدایی می‌شود، پنجره‌های اضافی در دسترس می‌شوند: اطلاعات مربوط به ثبت‌ها، درباره پشته.

اکنون می توانیم از تمام ویژگی های استاندارد دیباگر استفاده کنیم:

  • اجرای گام به گام دستورالعمل ها (قدم به и قدم بردار - به ترتیب کلیدهای F7 و F8)؛
  • شروع و توقف اجرا؛
  • ایجاد نقاط شکست هم برای کد و هم برای داده (کلید F2).

اتصال به دیباگر به معنای اجرای کد میان‌افزار نیست. موقعیت اجرای فعلی باید آدرس باشد 0x08006A74 - شروع عملکرد Reset_Handler. اگر فهرست را به پایین اسکرول کنید، می توانید فراخوانی عملکرد را ببینید اصلی. می توانید مکان نما را در این خط قرار دهید (آدرس 0x08006ABE) و عملیات را انجام دهید تا مکان نما اجرا شود (کلید F4).

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

در مرحله بعد، می توانید F7 را فشار دهید تا عملکرد را وارد کنید اصلی.

اگر دستور را اجرا کنید ادامه روند (کلید F9)، سپس پنجره "Please صبر کنید" با یک دکمه ظاهر می شود معلق:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

وقتی فشار می دهید معلق اجرای کد میان‌افزار به حالت تعلیق درآمده است و می‌توان آن را از همان آدرسی که در کدی که قطع شده است ادامه داد.

اگر به اجرای کد ادامه دهید، خطوط زیر را در پایانه های متصل به پورت های COM مجازی مشاهده خواهید کرد:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

وجود خط "bypass حالت" نشان می دهد که ماژول بلوتوث مجازی به حالت دریافت داده ها از درگاه COM کاربر تغییر کرده است.

اکنون در ترمینال بلوتوث (COM29 در تصویر) می توانید دستورات را مطابق با پروتکل راینو وارد کنید. به عنوان مثال، دستور "MEOW" رشته "mur-mur" را به ترمینال بلوتوث برمی گرداند:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

از من تقلید کن نه کاملا

هنگام ساختن یک شبیه ساز، می توانید سطح جزئیات/شبیه سازی یک دستگاه خاص را انتخاب کنید. به عنوان مثال، ماژول بلوتوث را می توان به روش های مختلفی شبیه سازی کرد:

  • دستگاه به طور کامل با مجموعه ای کامل از دستورات شبیه سازی شده است.
  • دستورات AT شبیه سازی می شوند و جریان داده از پورت COM سیستم اصلی دریافت می شود.
  • دستگاه مجازی هدایت کامل داده ها را به دستگاه واقعی فراهم می کند.
  • به عنوان یک خرد ساده که همیشه "OK" را برمی گرداند.

نسخه فعلی شبیه ساز از رویکرد دوم استفاده می کند - ماژول بلوتوث مجازی پیکربندی را انجام می دهد و پس از آن به حالت "پراکسی" داده ها از پورت COM سیستم اصلی به پورت UART شبیه ساز تغییر می کند.

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

اجازه دهید امکان ابزاردهی ساده کد را در صورتی که بخشی از محیط پیاده‌سازی نشده باشد، در نظر بگیریم. به عنوان مثال، اگر یک تایمر مسئول کنترل انتقال داده به DMA ایجاد نشده باشد (بررسی در تابع انجام می شود ws2812b_waitواقع شده در 0x08006840، سپس سیستم عامل همیشه منتظر می ماند تا پرچم بازنشانی شود مشغولواقع شده در 0x200004C4که اشغال خط داده DMA را نشان می دهد:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

ما می توانیم با تنظیم مجدد پرچم به صورت دستی از این وضعیت دور شویم مشغول بلافاصله پس از نصب آن در IDA Pro می توانید یک تابع پایتون ایجاد کنید و آن را در نقطه شکست فراخوانی کنید و پس از نوشتن مقدار 1 روی پرچم، خود نقطه شکست را در کد قرار دهید. مشغول.

کنترل کننده نقطه شکست

ابتدا اجازه دهید یک تابع پایتون در IDA ایجاد کنیم. منو فایل - دستور اسکریپت...

یک قطعه جدید در لیست سمت چپ اضافه کنید، نامی برای آن بگذارید (به عنوان مثال، BPT),
در قسمت متن سمت راست، کد تابع را وارد کنید:

def skip_dma():
    print "Skipping wait ws2812..."
    value = Byte(0x200004C4)
    if value == 1:
        PatchDbgByte(0x200004C4, 0)
return False

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

پس از آن، کلیک کنید دویدن و پنجره اسکریپت را ببندید.

حالا بریم سراغ کد در 0x0800688A، یک نقطه شکست (کلید F2) تنظیم کنید، آن را ویرایش کنید (منوی زمینه ویرایش نقطه شکست...، فراموش نکنید که نوع اسکریپت را روی پایتون تنظیم کنید:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید
کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

اگر مقدار پرچم فعلی مشغول برابر 1 است، سپس باید تابع را اجرا کنید skip_dma در خط اسکریپت:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

اگر سفت‌افزار را برای اجرا اجرا کنید، می‌توانید راه‌اندازی کد کنترل‌کننده نقطه شکست را در پنجره IDA ببینید. تولید توسط خط Skipping wait ws2812.... اکنون سیستم عامل منتظر بازنشانی پرچم نخواهد بود مشغول.

تعامل با شبیه ساز

تقلید به خاطر تقلید بعید است که باعث لذت و شادی شود. بسیار جالب تر است اگر شبیه ساز به محقق کمک کند تا داده ها را در حافظه ببیند یا تعامل رشته ها را برقرار کند.

ما به شما نشان خواهیم داد که چگونه به صورت پویا تعامل بین وظایف RTOS برقرار کنید. اگر کد در حال اجرا است ابتدا باید اجرای آن را متوقف کنید. اگر به تابع بروید بلوتوث_تسک_ورود به شاخه پردازش فرمان "LED" (آدرس 0x080057B8، سپس می توانید ببینید که ابتدا چه چیزی ایجاد شده و سپس به صف سیستم ارسال می شود ledControlQueueHandle چند پیام

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

برای دسترسی به متغیر باید یک نقطه شکست تعیین کنید ledControlQueueHandleواقع شده در 0x20000624 و به اجرای کد ادامه دهید:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

در نتیجه، توقف ابتدا در آدرس رخ می دهد 0x080057CA قبل از فراخوانی تابع osMailAlloc، سپس در آدرس 0x08005806 قبل از فراخوانی تابع osMailPut، سپس پس از مدتی - به آدرس 0x08005BD4 (قبل از فراخوانی تابع osMailGet) که متعلق به تابع است leds_task_entry (LED-task)، یعنی وظایف تغییر کرد و اکنون وظیفه LED کنترل را دریافت کرد.

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

به این روش ساده می توانید نحوه تعامل وظایف RTOS با یکدیگر را تعیین کنید.

البته، در واقعیت، تعامل وظایف می تواند پیچیده تر باشد، اما با استفاده از یک شبیه ساز، ردیابی این تعامل کار کمتری می شود.

اینجا می‌توانید ویدیوی کوتاهی از راه‌اندازی و تعامل شبیه‌ساز با IDA Pro تماشا کنید.

با Radare2 راه اندازی کنید

شما نمی توانید چنین ابزار جهانی مانند Radare2 را نادیده بگیرید.

برای اتصال به شبیه ساز با استفاده از r2، دستور به شکل زیر است:

radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf

راه اندازی اکنون در دسترس است (dc) و اجرای مکث (Ctrl+C).

متأسفانه در حال حاضر، r2 هنگام کار با سرور سخت افزار gdb و چیدمان حافظه مشکل دارد؛ به همین دلیل، نقاط شکست و مراحل کار نمی کنند (فرمان) ds). امیدواریم به زودی این مشکل برطرف شود.

دویدن با Eclipse

یکی از گزینه های استفاده از شبیه ساز، اشکال زدایی سیستم عامل دستگاه در حال توسعه است. برای وضوح، ما همچنین از سیستم عامل Rhino استفاده خواهیم کرد. می توانید منابع سیستم عامل را دانلود کنید از این رو.

ما از Eclipse از مجموعه به عنوان یک IDE استفاده خواهیم کرد میز کار سیستم برای STM32.

برای اینکه شبیه‌ساز سیستم‌افزاری را که مستقیماً در Eclipse کامپایل شده بارگیری کند، باید پارامتر را اضافه کنید. firmware=null به فرمان راه اندازی شبیه ساز:

binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28

راه اندازی پیکربندی اشکال زدایی

در Eclipse، منو را انتخاب کنید اجرا - تنظیمات اشکال زدایی... در پنجره ای که باز می شود، در بخش اشکال زدایی سخت افزار GDB شما باید یک پیکربندی جدید اضافه کنید، سپس در برگه "Main" پروژه و برنامه فعلی را برای اشکال زدایی مشخص کنید:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

در تب "Debugger" باید دستور GDB را مشخص کنید:
${openstm32_compiler_path}arm-none-eabi-gdb

و همچنین پارامترهای اتصال به سرور GDB (میزبان و پورت) را وارد کنید:

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

در تب "Startup" باید پارامترهای زیر را مشخص کنید:

  • فعال کردن چک باکس بارگذاری تصویر (به طوری که تصویر سیستم عامل مونتاژ شده در شبیه ساز بارگذاری می شود).
  • فعال کردن چک باکس بارگذاری نمادها;
  • دستور راه اندازی را اضافه کنید: set $pc = *0x08000004 (رجیستر PC را روی مقدار حافظه در آدرس تنظیم کنید 0x08000004 - آدرس در آنجا ذخیره می شود ResetHandler).

یادداشت، اگر نمی خواهید فایل سیستم عامل را از Eclipse دانلود کنید، گزینه ها را انتخاب کنید بارگذاری تصویر и دستورات را اجرا کنید نیازی به نشان دادن نیست

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

پس از کلیک روی Debug، می توانید در حالت Debugger کار کنید:

  • اجرای کد مرحله به مرحله
    کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید
  • تعامل با نقاط شکست
    کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

یادداشت. Eclipse، هوم... برخی چیزهای عجیب و غریب دارد... و شما باید با آنها زندگی کنید. برای مثال، اگر هنگام راه‌اندازی دیباگر پیام «No source available for «0x0» ظاهر شد، سپس دستور Step (F5) را اجرا کنید.

کرگدن درون یک گربه - سیستم عامل را در شبیه ساز Kopycat اجرا کنید

به جای یک نتیجه گیری

شبیه سازی کد بومی چیز بسیار جالبی است. برای توسعه دهنده دستگاه امکان اشکال زدایی سیستم عامل بدون دستگاه واقعی وجود دارد. برای یک محقق، این فرصتی است برای انجام تجزیه و تحلیل کد پویا، که همیشه حتی با یک دستگاه امکان پذیر نیست.

ما می خواهیم ابزاری را به متخصصان ارائه دهیم که راحت، نسبتاً ساده است و راه اندازی و اجرا به تلاش و زمان زیادی نیاز ندارد.

در مورد تجربه خود در استفاده از شبیه سازهای سخت افزاری در نظرات بنویسید. ما شما را به بحث دعوت می کنیم و خوشحال خواهیم شد به سوالات پاسخ دهید.

فقط کاربران ثبت نام شده می توانند در نظرسنجی شرکت کنند. ورود، لطفا.

از شبیه ساز برای چه استفاده می کنید؟

  • من سفت افزار (اشکال زدایی) را توسعه می دهم

  • من در حال تحقیق در مورد فریمور هستم

  • من بازی ها را راه اندازی می کنم (دندی، سگا، پی اس پی)

  • چیز دیگری (در نظرات بنویسید)

7 کاربر رای دادند. 2 کاربر رای ممتنع دادند.

از چه نرم افزاری برای شبیه سازی کدهای بومی استفاده می کنید؟

  • QEMU

  • موتور یونیکورن

  • پروتئوس

  • چیز دیگری (در نظرات بنویسید)

6 کاربر رای دادند. 2 کاربر رای ممتنع دادند.

دوست دارید چه چیزی را در شبیه ساز مورد استفاده خود بهبود دهید؟

  • من سرعت میخواهم

  • من سهولت راه اندازی/راه اندازی می خواهم

  • من گزینه های بیشتری برای تعامل با شبیه ساز می خواهم (API، قلاب)

  • من از همه چیز راضی هستم

  • چیز دیگری (در نظرات بنویسید)

8 کاربر رای دادند. 1 کاربر ممتنع.

منبع: www.habr.com

اضافه کردن نظر