Дар доираи вохӯрӣ 0x0A DC7831
Дар ин мақола мо тасвир хоҳем кард, ки чӣ тавр ба кор андохтани нармафзори дастгоҳ дар эмулятор, нишон додани ҳамкории мутақобила бо ислоҳкунанда ва таҳлили хурди динамикии нармафзори нармафзор анҷом дода мешавад.
prehistory
Чанде пеш дар галактикаи дур
Якчанд сол пеш аз ин дар лабораторияи мо зарурати тафтиш кардани прошив-раи дастгох ба миён омад. Нармафзор бо боркунак фишурда ва кушода шуд. Вай ин корро ба таври хеле мураккаб анҷом дода, маълумотро дар хотира якчанд маротиба иваз кард. Ва худи микропрограммӣ баъдан бо таҷҳизоти периферӣ фаъолона ҳамкорӣ мекард. Ва ҳамаи ин дар ядрои MIPS.
Бо сабабҳои объективӣ, эмуляторҳои мавҷуда ба мо мувофиқ набуданд, аммо мо ба ҳар ҳол мехостем, ки кодро иҷро кунем. Сипас мо тасмим гирифтем, ки эмулятори худамонро созем, ки он ҳадди ақалро иҷро мекунад ва ба мо имкон медиҳад, ки нармафзори асосиро кушоем. Мо онро кӯшиш кардем ва он кор кард. Мо фикр мекардем, ки агар мо перифериҳоро барои иҷрои нармафзори асосӣ илова кунем, чӣ мешавад? Он чандон дард накард - ва он ҳам кор кард. Мо бори дигар фикр кардем ва тасмим гирифтем, ки эмулятори мукаммал созем.
Натиҷа эмулятори системаҳои компютерӣ буд
Чаро Kopycat?
Бозии калимаҳо вуҷуд дорад.
- љињат (англисӣ, исм [ˈkɒpɪkæt]) - тақлидкунанда, тақлидкунанда
- гурба (англисӣ, исм [ˈkæt]) - гурба, гурба - ҳайвони дӯстдоштаи яке аз созандагони лоиҳа
- Ҳарфи "K" аз забони барномасозии Котлин аст
Нусхабардорӣ
Ҳангоми сохтани эмулятор ҳадафҳои хеле мушаххас гузошта шуданд:
- қобилияти зуд сохтани таҷҳизоти нав, модулҳо, ядроҳои протсессор;
- қобилияти ҷамъ кардани дастгоҳи виртуалӣ аз модулҳои гуногун;
- қобилияти бор кардани ҳама гуна маълумоти дуӣ (прошивка) ба хотираи дастгоҳи виртуалӣ;
- қобилияти кор бо аксҳо (намудҳои ҳолати система);
- қобилияти муошират бо эмулятор тавассути debugger дарунсохт;
- забони зебои муосир барои рушд.
Дар натиҷа, Котлин барои татбиқ, меъмории автобус (ин вақтест, ки модулҳо бо ҳам тавассути автобусҳои виртуалии додаҳо муошират мекунанд), JSON ҳамчун формати тавсифи дастгоҳ ва GDB RSP ҳамчун протокол барои ҳамкорӣ бо debugger интихоб карда шуданд.
Инкишофи он андаке бештар аз ду сол давом дорад ва фаъолона давом дорад. Дар ин муддат ядроҳои протсессори MIPS, x86, V850ES, ARM ва PowerPC амалӣ карда шуданд.
Лоиҳа афзоиш меёбад ва вақти он расидааст, ки онро ба оммаи васеъ пешкаш кунед. Мо тавсифи муфассали лоиҳаро баъдтар иҷро хоҳем кард, аммо ҳоло мо ба истифодаи Kopycat диққат медиҳем.
Барои бесабртаринҳо, версияи промои эмуляторро аз он зеркашӣ кардан мумкин аст
Рино дар эмулятор
Ёдовар мешавем, ки қаблан барои конфронси SMARTRHINO-2018 дастгоҳи санҷишии "Риносерос" барои омӯзиши малакаҳои муҳандисии баръакс сохта шуда буд. Раванди таҳлили нармафзори статикӣ дар
Акнун биёед кӯшиш кунем, ки "гӯякҳо" илова кунем ва нармафзорро дар эмулятор иҷро кунем.
Мо бояд ба:
1) Java 1.8
2) Python ва модул
Барои Windows:
1)
2)
Барои Linux:
1) сот
Шумо метавонед Eclipse, IDA Pro ё radare2-ро ҳамчун муштарии GDB истифода баред.
Чӣ тавр он кор мекунад?
Барои иҷрои нармафзор дар эмулятор, дастгоҳи виртуалиро, ки аналоги дастгоҳи воқеӣ аст, "ҷамъ кардан" лозим аст.
Таҷҳизоти воқеии ("rhino") метавонад дар диаграммаи блок нишон дода шавад:
Эмулятор сохтори модулӣ дорад ва дастгоҳи ниҳоии виртуалиро метавон дар файли 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-и ОС-и асосӣ дар бар мегирад (debug UART ва UART барои модули Bluetooth). Инҳо метавонанд портҳои воқеие бошанд, ки ба онҳо дастгоҳҳо пайвастанд ё портҳои виртуалии COM (барои ин ба шумо танҳо лозим аст com0com/socat).
Дар айни замон ду роҳи асосии ҳамкорӣ бо эмулятор аз берун вуҷуд дорад:
- Протоколи GDB RSP (мувофиқин, асбобҳое, ки ин протоколро дастгирӣ мекунанд, Eclipse / IDA / radare2 мебошанд);
- сатри фармони эмулятори дохилӣ (Argparse ё Python).
Портҳои виртуалии COM
Барои муошират кардан бо UART дастгоҳи виртуалӣ дар мошини маҳаллӣ тавассути терминал, шумо бояд як ҷуфт портҳои COM виртуалии алоқамандро эҷод кунед. Дар ҳолати мо, як порт аз ҷониби эмулятор истифода мешавад ва дуюмаш аз ҷониби барномаи терминал (PuTTY ё экран) истифода мешавад:
Истифодаи com0com
Портҳои виртуалии COM бо истифода аз утилитаи насбкунӣ аз маҷмӯаи com0com танзим карда мешаванд (версияи консол - C: Файлҳои Барнома (x86)com0comsetupс.exe, ё версияи GUI - C: Файлҳои барнома (x86) com0comsetupg.exe):
Қуттиҳоро тафтиш кунед аз ҳад зиёди буферро фаъол созед барои ҳамаи портҳои виртуалии офаридашуда, дар акси ҳол эмулятор посухи порти COM-ро интизор мешавад.
Истифодаи socat
Дар системаҳои UNIX портҳои маҷозии COM аз ҷониби эмулятор бо истифода аз утилитаи socat ба таври худкор эҷод карда мешаванд; барои ин танҳо ҳангоми оғози эмулятор префиксро дар номи порт муайян кунед. socat:
.
Интерфейси сатри фармони дохилӣ (Argparse ё Python)
Азбаски Kopycat як барномаи консолист, эмулятор ду варианти интерфейси сатри фармонро барои ҳамкорӣ бо объектҳо ва тағирёбандаҳои он пешниҳод мекунад: Argparse ва Python.
Argparse як CLI аст, ки дар Kopycat сохта шудааст ва ҳамеша барои ҳама дастрас аст.
CLI алтернативӣ тарҷумони Python мебошад. Барои истифодаи он, шумо бояд модули Jep Python -ро насб кунед ва эмуляторро барои кор бо Python танзим кунед (тарҷумони Python, ки дар системаи асосии корбар насб шудааст, истифода мешавад).
Насб кардани модули Python Jep
Дар зери Linux Jep метавонад тавассути pip насб карда шавад:
pip install jep
Барои насб кардани Jep дар Windows, шумо бояд аввал 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 - барои Windows, нусхабардор - барои Linux) ба рӯйхати параметрҳо DEFAULT_JVM_OPTS
параметри иловагӣ илова кунед Djava.library.path
— он бояд рохро ба модули Jep насбшударо дарбар гирад.
Натиҷа барои Windows бояд як сатри чунин бошад:
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) анҷом дода мешавад.
Фармони иҷро дар Windows:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28
Фармони иҷро кардани Linux бо истифода аз утилитаи 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 ба банди "Ивазкунандаи ислоҳкунанда…"Ва интихоб кунед"Debuger GDB дурдаст". Баъд, пайвастшавиро насб кунед: меню Debugger - Имконоти раванд…
Арзишҳоро таъин кунед:
- Ариза - ҳама гуна арзиш
- Номи асосӣ: 127.0.0.1 (ё суроғаи IP-и мошини дурдаст, ки дар он Kopycat кор мекунад)
- Порт: 23946
Акнун тугмаи ислоҳкунӣ дастрас мешавад (калиди F9):
Барои пайваст шудан ба модули хатогиҳо дар эмулятор, онро клик кунед. IDA ба реҷаи ислоҳкунӣ мегузарад, тирезаҳои иловагӣ дастрас мешаванд: маълумот дар бораи регистрҳо, дар бораи стек.
Акнун мо метавонем ҳамаи хусусиятҳои стандартии ислоҳкунандаро истифода барем:
- зина ба зина иҷро кардани дастурҳо (Қадам ба қадам и Қадам — калидҳои F7 ва F8 мутаносибан);
- оғоз ва таваққуф кардани иҷро;
- эҷод кардани нуқтаҳои танаффус ҳам барои код ва ҳам маълумот (калиди F2).
Пайвастшавӣ ба ислоҳкунанда маънои иҷро кардани коди нармафзорро надорад. Мавқеи иҷроиши ҷорӣ бояд суроға бошад 0x08006A74
— оғози кор Reset_Handler. Агар шумо рӯйхатро ба поён ҳаракат кунед, шумо метавонед занги функсияро бинед асосӣ. Шумо метавонед курсорро дар ин сатр ҷойгир кунед (суроға 0x08006ABE
) ва амалиётро иҷро кунед То курсор иҷро кунед (калиди F4).
Баъдан, шумо метавонед F7-ро пахш кунед, то функсияро ворид кунед асосӣ.
Агар шумо фармонро иҷро кунед Равандро идома диҳед (Тугмаи F9), пас равзанаи "Лутфан интизор шавед" бо як тугма пайдо мешавад Бешубҳа:
Вақте ки шумо пахш мекунед Бешубҳа иҷрои коди нармафзор боздошта мешавад ва онро метавон аз ҳамон суроғае, ки дар коди он қатъ шуда буд, идома дод.
Агар шумо иҷро кардани кодро идома диҳед, шумо дар терминалҳои ба портҳои виртуалии COM пайвастшуда сатрҳои зеринро хоҳед дид:
Мавҷудияти хати "пайванди давлатӣ" аз он шаҳодат медиҳад, ки модули виртуалии Bluetooth ба режими қабули маълумот аз порти COM корбар гузаштааст.
Акнун дар терминали Bluetooth (COM29 дар расм) шумо метавонед фармонҳоро мувофиқи протоколи Rhino ворид кунед. Масалан, фармони "MEOW" сатри "mur-mur" -ро ба терминали Bluetooth бармегардонад:
Ба ман тақлид накунед
Ҳангоми сохтани эмулятор, шумо метавонед сатҳи тафсилот/эмулятсияи дастгоҳи мушаххасро интихоб кунед. Масалан, модули Bluetooth-ро бо роҳҳои гуногун тақлид кардан мумкин аст:
- дастгоҳ пурра бо маҷмӯи пурраи фармонҳо тақлид карда мешавад;
- Фармонҳои AT тақлид карда мешаванд ва ҷараёни маълумот аз порти COM-и системаи асосӣ қабул карда мешавад;
- дастгоҳи виртуалӣ интиқоли пурраи маълумотро ба дастгоҳи воқеӣ таъмин мекунад;
- ҳамчун нотаҳои оддӣ, ки ҳамеша "OK" -ро бармегардонад.
Варианти кунунии эмулятор равиши дуюмро истифода мебарад - модули виртуалии Bluetooth конфигуратсияро иҷро мекунад, ки пас аз он ба ҳолати "прокси" маълумот аз порти COM-и системаи асосӣ ба порти UART-и эмулятор мегузарад.
Имконияти асбобсозии оддии кодро дар сурате дида мебароем, ки ягон қисми периферия иҷро нашавад. Масалан, агар таймер барои назорати интиқоли маълумот ба DMA сохта нашуда бошад (тафтиш дар функсия анҷом дода мешавад ws2812b_waitвоқеъ дар 0x08006840
), он гоҳ нармафзор ҳамеша интизор мешавад, ки парчам барқарор карда шавад бандвоқеъ дар 0x200004C4
ки ишғоли хати маълумоти DMA-ро нишон медиҳад:
Мо метавонем ин вазъиятро тавассути аз нав танзим кардани парчам дастӣ ҳал кунем банд фавран пас аз насб кардани он. Дар IDA Pro, шумо метавонед функсияи Python эҷод кунед ва онро дар нуқтаи танаффус даъват кунед ва пас аз навиштани арзиши 1 ба парчам худи нуқтаи шикастро дар код гузоред. банд.
Коркарди нуқта
Аввалан, биёед дар IDA функсияи Python эҷод кунем. Меню Файл - Фармони скрипт...
Дар рӯйхат дар тарафи чап порчаи нав илова кунед, ба он ном диҳед (масалан, БПТ),
Дар майдони матн дар тарафи рост, рамзи функсияро ворид кунед:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
Пас аз он мо пахш мекунем давидан ва равзанаи скриптро пӯшед.
Акнун биёед ба рамзи дар 0x0800688A
, нуқтаи танаффусро таъин кунед (калиди F2), таҳрир кунед (менюи контекстӣ Таҳрири нуқтаи қатъ...), фаромӯш накунед, ки навъи скриптро ба Python таъин кунед:
Агар арзиши парчами ҷорӣ банд ба 1 баробар аст, пас шумо бояд функсияро иҷро кунед skip_dma дар хати скрипт:
Агар шумо нармафзори нармафзорро барои иҷро иҷро кунед, триггери коди коркарди нуқтаро дар равзанаи IDA дидан мумкин аст. Натиҷаи аз рӯи сатр Skipping wait ws2812...
. Акнун нармафзори нармафзор барои барқарор кардани парчам интизор нахоҳад шуд банд.
Мулоқот бо эмулятор
Тақлид ба хотири тақлид гумон аст, ки боиси лаззат ва шодӣ шавад. Ин хеле ҷолибтар аст, агар эмулятор ба тадқиқотчӣ дар дидани маълумот дар хотира ё муқаррар кардани таъсири мутақобилаи риштаҳо кӯмак кунад.
Мо ба шумо нишон медиҳем, ки чӣ гуна ба таври динамикӣ ҳамкорӣ байни вазифаҳои RTOS барқарор кардан мумкин аст. Шумо бояд аввал иҷрои рамзро таваққуф кунед, агар он иҷро шавад. Агар шумо ба функсия равед Bluetooth_task_entry ба филиали коркарди фармони "LED" (суроға 0x080057B8
), пас шумо метавонед бубинед, ки чӣ аввал офарида шудааст ва сипас ба навбати система фиристода мешавад ledControlQueueHandle баъзе паём.
Шумо бояд нуқтаи танаффусро барои дастрасӣ ба тағирёбанда таъин кунед ledControlQueueHandleвоқеъ дар 0x20000624
ва иҷрои кодро идома диҳед:
Дар натиҷа, истгоҳ аввал дар суроға сурат мегирад 0x080057CA
пеш аз даъват кардани функсия osMailAlloc, баъд ба адреси 0x08005806
пеш аз даъват кардани функсия osMailPut, баъд аз муддате — ба адреси 0x08005BD4
(пеш аз даъват кардани функсия osMailGet), ки ба функсия тааллуқ дорад leds_task_entry (LED-вазифа), яъне вазифаҳо иваз карда шуданд ва ҳоло 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, менюро интихоб кунед Иҷро кардан - Конфигуратсияҳои хатогиҳо... Дар равзанаи кушодашуда, дар бахш Debugging hardware GDB ба шумо лозим аст, ки конфигуратсияи нав илова кунед, пас дар ҷадвали "Асосӣ" лоиҳаи ҷорӣ ва барномаро барои ислоҳи ислоҳ нишон диҳед:
Дар ҷадвали "Debugger" шумо бояд фармони GDB-ро муайян кунед:
${openstm32_compiler_path}arm-none-eabi-gdb
Ва инчунин параметрҳоро барои пайвастшавӣ ба сервери GDB (хост ва порт) ворид кунед:
Дар ҷадвали "Оғоз" шумо бояд параметрҳои зеринро муайян кунед:
- қуттии қайдро фаъол созед Тасвирро бор кунед (то ки тасвири насбшудаи нармафзор ба эмулятор бор карда шавад);
- қуттии қайдро фаъол созед Рамзҳои боркунӣ;
- фармони оғозро илова кунед:
set $pc = *0x08000004
(регистри компютерро ба арзиши хотираи суроға муқаррар кунед0x08000004
- суроға дар он ҷо нигоҳ дошта мешавад ResetHandler).
Диққат диҳед, агар шумо нахоҳед, ки файли нармафзорро аз Eclipse зеркашӣ кунед, пас имконоти Тасвирро бор кунед и Фармонҳоро иҷро кунед нишон додан лозим нест.
Пас аз клик кардани Debug, шумо метавонед дар реҷаи ислоҳкунанда кор кунед:
- қадам ба қадам иҷро кардани код
- мутақобила бо нуқтаҳои қатъ
эрод гирифтан. Eclipse, hmm... баъзе нозукиҳо дорад... ва шумо бояд бо онҳо зиндагӣ кунед. Масалан, агар ҳангоми оғоз кардани ислоҳкунанда паёми "Не манбае дастрас барои "0x0″" пайдо шавад, пас фармони Қадамро иҷро кунед (F5)
Ба ҷои хулоса
Тақлид кардани рамзи модарӣ як чизи хеле ҷолиб аст. Барои таҳиягари дастгоҳ имкон медиҳад, ки нармафзори нармафзорро бе дастгоҳи воқеӣ ислоҳ кунад. Барои тадқиқотчӣ, ин як имконияти гузаронидани таҳлили коди динамикӣ аст, ки ҳатто бо дастгоҳ на ҳамеша имконпазир аст.
Мо мехоҳем ба мутахассисон асбобе пешниҳод кунем, ки қулай, мӯътадил содда ва барои насб кардан ва кор кардан кӯшишу вақти зиёдро талаб намекунад.
Дар шарҳҳо дар бораи таҷрибаи худ бо истифодаи эмуляторҳои сахтафзор нависед. Мо шуморо ба муҳокима даъват менамоем ва бо омодагӣ ба саволҳо ҷавоб хоҳем дод.
Танҳо корбарони сабтиномшуда метавонанд дар пурсиш иштирок кунанд.
Шумо эмуляторро барои чӣ истифода мебаред?
-
Ман нармафзори нармафзорро таҳия мекунам (debug).
-
Ман нармафзори нармафзорро меомӯзам
-
Ман бозиҳоро оғоз мекунам (Dendi, Sega, PSP)
-
чизи дигар (дар шарҳҳо нависед)
7 корбар овоз доданд. 2 корбар худдорӣ карданд.
Шумо кадом нармафзорро барои тақлид кардани рамзи модарӣ истифода мебаред?
-
QEMU
-
Муҳаррики Unicorn
-
Протез
-
чизи дигар (дар шарҳҳо нависед)
6 корбар овоз доданд. 2 корбар худдорӣ карданд.
Шумо чиро дар эмуляторе, ки истифода мекунед, беҳтар кардан мехоҳед?
-
Ман суръат мехоҳам
-
Ман осонии насб кардан / оғоз кардан мехоҳам
-
Ман мехоҳам имконоти бештар барои ҳамкорӣ бо эмулятор (API, қалмоқҳо)
-
Ман аз ҳама чиз қаноатмандам
-
чизи дигар (дар шарҳҳо нависед)
8 корбар овоз доданд. 1 корбар худдорӣ кард.
Манбаъ: will.com