به عنوان بخشی از جلسه 0x0A DC7831
در این مقاله نحوه اجرای سیستم عامل دستگاه در شبیه ساز، نشان دادن تعامل با دیباگر و انجام یک تجزیه و تحلیل دینامیکی کوچک از سیستم عامل را شرح خواهیم داد.
ماقبل تاریخ
خیلی وقت پیش در یک کهکشان بسیار دور
چند سال پیش در آزمایشگاه ما نیاز به بررسی سیستم عامل یک دستگاه وجود داشت. سیستم عامل فشرده و با بوت لودر باز شد. او این کار را به روشی بسیار پیچیده انجام داد و چندین بار داده ها را در حافظه جابجا کرد. و سپس خود سیستم عامل به طور فعال با دستگاه های جانبی تعامل داشت. و همه اینها روی هسته MIPS.
به دلایل عینی، شبیه سازهای موجود برای ما مناسب نبودند، اما همچنان می خواستیم کد را اجرا کنیم. سپس تصمیم گرفتیم شبیه ساز خودمان را بسازیم، که حداقل کار را انجام می دهد و به ما امکان می دهد فریمور اصلی را باز کنیم. ما آن را امتحان کردیم و کار کرد. فکر کردیم، چه میشود اگر برای اجرای سفتافزار اصلی، دستگاههای جانبی اضافه کنیم. خیلی درد نداشت - و همچنین نتیجه داد. دوباره فکر کردیم و تصمیم گرفتیم یک شبیه ساز کامل بسازیم.
نتیجه یک شبیه ساز سیستم های کامپیوتری بود
چرا Kopycat؟
بازی با کلمات وجود دارد.
- کپی برداری (انگلیسی، اسم [ˈkɒpɪkæt]) - مقلد، مقلد
- گربه (انگلیسی، اسم [ˈkæt]) - گربه، گربه - حیوان مورد علاقه یکی از سازندگان پروژه
- حرف "K" از زبان برنامه نویسی کاتلین است
کپی کردن
هنگام ایجاد شبیه ساز، اهداف بسیار خاصی تعیین شد:
- توانایی ایجاد سریع لوازم جانبی، ماژول ها، هسته های پردازنده.
- امکان مونتاژ یک دستگاه مجازی از ماژول های مختلف؛
- توانایی بارگیری هر داده باینری (سیستم افزار) در حافظه یک دستگاه مجازی؛
- توانایی کار با عکس های فوری (عکس های فوری از وضعیت سیستم)؛
- توانایی تعامل با شبیه ساز از طریق دیباگر داخلی؛
- زبان مدرن زیبا برای توسعه
در نتیجه، Kotlin برای پیاده سازی، معماری گذرگاه (این زمانی است که ماژول ها از طریق گذرگاه های داده مجازی با یکدیگر ارتباط برقرار می کنند)، JSON به عنوان فرمت توضیحات دستگاه و GDB RSP به عنوان پروتکلی برای تعامل با دیباگر انتخاب شد.
توسعه کمی بیش از دو سال است که ادامه دارد و به طور فعال ادامه دارد. در این مدت هسته های پردازنده MIPS، x86، V850ES، ARM و PowerPC پیاده سازی شدند.
این پروژه در حال رشد است و زمان ارائه آن به عموم مردم فرا رسیده است. بعداً شرح مفصلی از پروژه انجام خواهیم داد، اما در حال حاضر روی استفاده از Kopycat تمرکز خواهیم کرد.
برای بی حوصله ترین ها، نسخه تبلیغاتی شبیه ساز را می توان از آن دانلود کرد
راینو در شبیه ساز
به یاد بیاوریم که قبلاً برای کنفرانس SMARTRHINO-2018، یک دستگاه آزمایشی "Rhinoceros" برای آموزش مهارت های مهندسی معکوس ساخته شد. فرآیند تجزیه و تحلیل سیستم عامل استاتیک در شرح داده شد
اکنون بیایید سعی کنیم "بلندگو" را اضافه کنیم و سیستم عامل را در شبیه ساز اجرا کنیم.
ما نیاز داریم:
1) جاوا 1.8
2) پایتون و ماژول
برای ویندوز:
1)
2)
برای لینوکس:
1) سوکات
می توانید از Eclipse، IDA Pro یا radare2 به عنوان مشتری GDB استفاده کنید.
چگونه کار می کند؟
برای اجرای سیستم عامل در شبیه ساز، لازم است یک دستگاه مجازی، که آنالوگ یک دستگاه واقعی است، "مونتاژ" شود.
دستگاه واقعی ("کرگدن") را می توان در بلوک دیاگرام نشان داد:
شبیه ساز ساختار ماژولار دارد و دستگاه مجازی نهایی را می توان در یک فایل 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"]
]
}
به پارامتر توجه کنید سفت افزار بخش پارام ها نام فایلی است که می تواند به عنوان سیستم عامل در یک دستگاه مجازی بارگذاری شود.
دستگاه مجازی و تعامل آن با سیستم عامل اصلی را می توان با نمودار زیر نشان داد:
نمونه آزمایشی فعلی شبیه ساز شامل تعامل با پورت های COM سیستم عامل اصلی است (اشکال زدایی UART و UART برای ماژول بلوتوث). اینها می توانند پورت های واقعی باشند که دستگاه ها به آن ها متصل هستند یا پورت های COM مجازی (برای این کار فقط نیاز دارید com0com/socat).
در حال حاضر دو راه اصلی برای تعامل با شبیه ساز از خارج وجود دارد:
- پروتکل GDB RSP (بر این اساس، ابزارهایی که از این پروتکل پشتیبانی می کنند Eclipse / IDA / radare2 هستند).
- خط فرمان شبیه ساز داخلی (Argparse یا Python).
پورت های COM مجازی
به منظور تعامل با UART یک دستگاه مجازی در ماشین محلی از طریق یک ترمینال، باید یک جفت پورت COM مجازی مرتبط ایجاد کنید. در مورد ما، یک پورت توسط شبیه ساز و دومی توسط یک برنامه ترمینال (PuTTY یا صفحه نمایش) استفاده می شود:
با استفاده از com0com
پورت های COM مجازی با استفاده از ابزار راه اندازی از کیت com0com پیکربندی شده اند (نسخه کنسول - C: فایل های برنامه (x86) com0comsetupс.exe، یا نسخه رابط کاربری گرافیکی - C: فایل های برنامه (x86) com0comsetupg.exe):
جعبه ها را علامت بزنید فعال کردن بیش از حد بافر برای تمام پورت های مجازی ایجاد شده، در غیر این صورت شبیه ساز منتظر پاسخ از پورت 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 مربوطه را نصب کنید. ما این کار را کمی برای شما آسان کرده ایم و
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 در فرم استفاده می کنیم
همچنین می توانید از فریمور اصلی بدون اطلاعات متا استفاده کنید.
پس از راهاندازی Kopycat در IDA Pro، در منوی Debugger به آیتم «تغییر اشکالزدا…"و انتخاب کنید"دیباگر از راه دور GDB". سپس، منوی اتصال را تنظیم کنید اشکال زدا - گزینه های پردازش…
مقادیر را تنظیم کنید:
- برنامه - هر مقدار
- نام میزبان: 127.0.0.1 (یا آدرس IP دستگاه راه دوری که Kopycat در آن اجرا می شود)
- بندر: 23946
اکنون دکمه رفع اشکال در دسترس است (کلید F9):
روی آن کلیک کنید تا به ماژول دیباگر در شبیه ساز متصل شوید. IDA وارد حالت اشکالزدایی میشود، پنجرههای اضافی در دسترس میشوند: اطلاعات مربوط به ثبتها، درباره پشته.
اکنون می توانیم از تمام ویژگی های استاندارد دیباگر استفاده کنیم:
- اجرای گام به گام دستورالعمل ها (قدم به и قدم بردار - به ترتیب کلیدهای F7 و F8)؛
- شروع و توقف اجرا؛
- ایجاد نقاط شکست هم برای کد و هم برای داده (کلید F2).
اتصال به دیباگر به معنای اجرای کد میانافزار نیست. موقعیت اجرای فعلی باید آدرس باشد 0x08006A74
- شروع عملکرد Reset_Handler. اگر فهرست را به پایین اسکرول کنید، می توانید فراخوانی عملکرد را ببینید اصلی. می توانید مکان نما را در این خط قرار دهید (آدرس 0x08006ABE
) و عملیات را انجام دهید تا مکان نما اجرا شود (کلید F4).
در مرحله بعد، می توانید F7 را فشار دهید تا عملکرد را وارد کنید اصلی.
اگر دستور را اجرا کنید ادامه روند (کلید F9)، سپس پنجره "Please صبر کنید" با یک دکمه ظاهر می شود معلق:
وقتی فشار می دهید معلق اجرای کد میانافزار به حالت تعلیق درآمده است و میتوان آن را از همان آدرسی که در کدی که قطع شده است ادامه داد.
اگر به اجرای کد ادامه دهید، خطوط زیر را در پایانه های متصل به پورت های COM مجازی مشاهده خواهید کرد:
وجود خط "bypass حالت" نشان می دهد که ماژول بلوتوث مجازی به حالت دریافت داده ها از درگاه COM کاربر تغییر کرده است.
اکنون در ترمینال بلوتوث (COM29 در تصویر) می توانید دستورات را مطابق با پروتکل راینو وارد کنید. به عنوان مثال، دستور "MEOW" رشته "mur-mur" را به ترمینال بلوتوث برمی گرداند:
از من تقلید کن نه کاملا
هنگام ساختن یک شبیه ساز، می توانید سطح جزئیات/شبیه سازی یک دستگاه خاص را انتخاب کنید. به عنوان مثال، ماژول بلوتوث را می توان به روش های مختلفی شبیه سازی کرد:
- دستگاه به طور کامل با مجموعه ای کامل از دستورات شبیه سازی شده است.
- دستورات AT شبیه سازی می شوند و جریان داده از پورت COM سیستم اصلی دریافت می شود.
- دستگاه مجازی هدایت کامل داده ها را به دستگاه واقعی فراهم می کند.
- به عنوان یک خرد ساده که همیشه "OK" را برمی گرداند.
نسخه فعلی شبیه ساز از رویکرد دوم استفاده می کند - ماژول بلوتوث مجازی پیکربندی را انجام می دهد و پس از آن به حالت "پراکسی" داده ها از پورت COM سیستم اصلی به پورت UART شبیه ساز تغییر می کند.
اجازه دهید امکان ابزاردهی ساده کد را در صورتی که بخشی از محیط پیادهسازی نشده باشد، در نظر بگیریم. به عنوان مثال، اگر یک تایمر مسئول کنترل انتقال داده به DMA ایجاد نشده باشد (بررسی در تابع انجام می شود ws2812b_waitواقع شده در 0x08006840
، سپس سیستم عامل همیشه منتظر می ماند تا پرچم بازنشانی شود مشغولواقع شده در 0x200004C4
که اشغال خط داده DMA را نشان می دهد:
ما می توانیم با تنظیم مجدد پرچم به صورت دستی از این وضعیت دور شویم مشغول بلافاصله پس از نصب آن در IDA Pro می توانید یک تابع پایتون ایجاد کنید و آن را در نقطه شکست فراخوانی کنید و پس از نوشتن مقدار 1 روی پرچم، خود نقطه شکست را در کد قرار دهید. مشغول.
کنترل کننده نقطه شکست
ابتدا اجازه دهید یک تابع پایتون در IDA ایجاد کنیم. منو فایل - دستور اسکریپت...
یک قطعه جدید در لیست سمت چپ اضافه کنید، نامی برای آن بگذارید (به عنوان مثال، BPT),
در قسمت متن سمت راست، کد تابع را وارد کنید:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
پس از آن، کلیک کنید دویدن و پنجره اسکریپت را ببندید.
حالا بریم سراغ کد در 0x0800688A
، یک نقطه شکست (کلید F2) تنظیم کنید، آن را ویرایش کنید (منوی زمینه ویرایش نقطه شکست...، فراموش نکنید که نوع اسکریپت را روی پایتون تنظیم کنید:
اگر مقدار پرچم فعلی مشغول برابر 1 است، سپس باید تابع را اجرا کنید skip_dma در خط اسکریپت:
اگر سفتافزار را برای اجرا اجرا کنید، میتوانید راهاندازی کد کنترلکننده نقطه شکست را در پنجره IDA ببینید. تولید توسط خط Skipping wait ws2812...
. اکنون سیستم عامل منتظر بازنشانی پرچم نخواهد بود مشغول.
تعامل با شبیه ساز
تقلید به خاطر تقلید بعید است که باعث لذت و شادی شود. بسیار جالب تر است اگر شبیه ساز به محقق کمک کند تا داده ها را در حافظه ببیند یا تعامل رشته ها را برقرار کند.
ما به شما نشان خواهیم داد که چگونه به صورت پویا تعامل بین وظایف RTOS برقرار کنید. اگر کد در حال اجرا است ابتدا باید اجرای آن را متوقف کنید. اگر به تابع بروید بلوتوث_تسک_ورود به شاخه پردازش فرمان "LED" (آدرس 0x080057B8
، سپس می توانید ببینید که ابتدا چه چیزی ایجاد شده و سپس به صف سیستم ارسال می شود ledControlQueueHandle چند پیام
برای دسترسی به متغیر باید یک نقطه شکست تعیین کنید ledControlQueueHandleواقع شده در 0x20000624
و به اجرای کد ادامه دهید:
در نتیجه، توقف ابتدا در آدرس رخ می دهد 0x080057CA
قبل از فراخوانی تابع osMailAlloc، سپس در آدرس 0x08005806
قبل از فراخوانی تابع osMailPut، سپس پس از مدتی - به آدرس 0x08005BD4
(قبل از فراخوانی تابع osMailGet) که متعلق به تابع است leds_task_entry (LED-task)، یعنی وظایف تغییر کرد و اکنون وظیفه LED کنترل را دریافت کرد.
به این روش ساده می توانید نحوه تعامل وظایف RTOS با یکدیگر را تعیین کنید.
البته، در واقعیت، تعامل وظایف می تواند پیچیده تر باشد، اما با استفاده از یک شبیه ساز، ردیابی این تعامل کار کمتری می شود.
با 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 استفاده خواهیم کرد
برای اینکه شبیهساز سیستمافزاری را که مستقیماً در Eclipse کامپایل شده بارگیری کند، باید پارامتر را اضافه کنید. firmware=null
به فرمان راه اندازی شبیه ساز:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
راه اندازی پیکربندی اشکال زدایی
در Eclipse، منو را انتخاب کنید اجرا - تنظیمات اشکال زدایی... در پنجره ای که باز می شود، در بخش اشکال زدایی سخت افزار GDB شما باید یک پیکربندی جدید اضافه کنید، سپس در برگه "Main" پروژه و برنامه فعلی را برای اشکال زدایی مشخص کنید:
در تب "Debugger" باید دستور GDB را مشخص کنید:
${openstm32_compiler_path}arm-none-eabi-gdb
و همچنین پارامترهای اتصال به سرور GDB (میزبان و پورت) را وارد کنید:
در تب "Startup" باید پارامترهای زیر را مشخص کنید:
- فعال کردن چک باکس بارگذاری تصویر (به طوری که تصویر سیستم عامل مونتاژ شده در شبیه ساز بارگذاری می شود).
- فعال کردن چک باکس بارگذاری نمادها;
- دستور راه اندازی را اضافه کنید:
set $pc = *0x08000004
(رجیستر PC را روی مقدار حافظه در آدرس تنظیم کنید0x08000004
- آدرس در آنجا ذخیره می شود ResetHandler).
یادداشت، اگر نمی خواهید فایل سیستم عامل را از Eclipse دانلود کنید، گزینه ها را انتخاب کنید بارگذاری تصویر и دستورات را اجرا کنید نیازی به نشان دادن نیست
پس از کلیک روی Debug، می توانید در حالت Debugger کار کنید:
- اجرای کد مرحله به مرحله
- تعامل با نقاط شکست
یادداشت. Eclipse، هوم... برخی چیزهای عجیب و غریب دارد... و شما باید با آنها زندگی کنید. برای مثال، اگر هنگام راهاندازی دیباگر پیام «No source available for «0x0» ظاهر شد، سپس دستور Step (F5) را اجرا کنید.
به جای یک نتیجه گیری
شبیه سازی کد بومی چیز بسیار جالبی است. برای توسعه دهنده دستگاه امکان اشکال زدایی سیستم عامل بدون دستگاه واقعی وجود دارد. برای یک محقق، این فرصتی است برای انجام تجزیه و تحلیل کد پویا، که همیشه حتی با یک دستگاه امکان پذیر نیست.
ما می خواهیم ابزاری را به متخصصان ارائه دهیم که راحت، نسبتاً ساده است و راه اندازی و اجرا به تلاش و زمان زیادی نیاز ندارد.
در مورد تجربه خود در استفاده از شبیه سازهای سخت افزاری در نظرات بنویسید. ما شما را به بحث دعوت می کنیم و خوشحال خواهیم شد به سوالات پاسخ دهید.
فقط کاربران ثبت نام شده می توانند در نظرسنجی شرکت کنند.
از شبیه ساز برای چه استفاده می کنید؟
-
من سفت افزار (اشکال زدایی) را توسعه می دهم
-
من در حال تحقیق در مورد فریمور هستم
-
من بازی ها را راه اندازی می کنم (دندی، سگا، پی اس پی)
-
چیز دیگری (در نظرات بنویسید)
7 کاربر رای دادند. 2 کاربر رای ممتنع دادند.
از چه نرم افزاری برای شبیه سازی کدهای بومی استفاده می کنید؟
-
QEMU
-
موتور یونیکورن
-
پروتئوس
-
چیز دیگری (در نظرات بنویسید)
6 کاربر رای دادند. 2 کاربر رای ممتنع دادند.
دوست دارید چه چیزی را در شبیه ساز مورد استفاده خود بهبود دهید؟
-
من سرعت میخواهم
-
من سهولت راه اندازی/راه اندازی می خواهم
-
من گزینه های بیشتری برای تعامل با شبیه ساز می خواهم (API، قلاب)
-
من از همه چیز راضی هستم
-
چیز دیگری (در نظرات بنویسید)
8 کاربر رای دادند. 1 کاربر ممتنع.
منبع: www.habr.com