Հանդիպման շրջանակներում 0x0A DC7831
Այս հոդվածում մենք նկարագրելու ենք, թե ինչպես գործարկել սարքի որոնվածը էմուլյատորում, ցուցադրել փոխազդեցությունը կարգաբերիչի հետ և կատարել որոնվածի կարճ դինամիկ վերլուծություն:
նախապատմությանը
Շատ վաղուց հեռու մի գալակտիկայում
Մի քանի տարի առաջ մեր լաբորատորիայում անհրաժեշտություն առաջացավ ուսումնասիրել սարքի որոնվածը։ Որոնվածը սեղմվել և ապափաթեթավորվել է bootloader-ով: Նա դա արեց շատ բարդ ձևով՝ մի քանի անգամ տեղափոխելով տվյալները հիշողության մեջ։ Եվ որոնվածն ինքնին այնուհետև ակտիվորեն համագործակցում էր ծայրամասային սարքերի հետ: Եվ այս ամենը MIPS միջուկի վրա:
Օբյեկտիվ պատճառներով, հասանելի էմուլյատորները մեզ չէին համապատասխանում, բայց մենք դեռ ցանկանում էինք գործարկել կոդը: Այնուհետև մենք որոշեցինք ստեղծել մեր էմուլյատորը, որը թույլ կտա մեզ բացել հիմնական որոնվածը: Մենք փորձեցինք այն և ստացվեց: Մենք մտածեցինք, իսկ եթե ավելացնենք ծայրամասային սարքեր՝ հիմնական որոնվածը նույնպես կատարելու համար: Դա շատ չտուժեց, և դա նույնպես ստացվեց: Մենք նորից մտածեցինք և որոշեցինք ստեղծել լիարժեք էմուլյատոր:
Արդյունքը եղավ համակարգչային համակարգերի էմուլյատորը
Ինչու՞ Kopycat:
Բառախաղ կա.
- copycat (անգլերեն, noun [ˈkɒpɪkæt]) - ընդօրինակող, ընդօրինակող
- կատու (անգլերեն, noun [ˈkæt]) - կատու, կատու - նախագծի ստեղծողներից մեկի սիրելի կենդանին
- «K» տառը Կոտլին ծրագրավորման լեզվից է
Copycat
Էմուլյատորը ստեղծելիս շատ կոնկրետ նպատակներ են դրվել.
- նոր ծայրամասային սարքեր, մոդուլներ, պրոցեսորային միջուկներ արագ ստեղծելու ունակություն.
- տարբեր մոդուլներից վիրտուալ սարք հավաքելու ունակություն.
- ցանկացած երկուական տվյալներ (որոնվածը) վիրտուալ սարքի հիշողության մեջ բեռնելու ունակություն.
- snapshot-ների հետ աշխատելու ունակություն (համակարգի վիճակի նկարներ);
- էմուլյատորի հետ ներկառուցված վրիպազերծիչի միջոցով փոխազդելու ունակություն.
- գեղեցիկ ժամանակակից լեզու զարգացման համար:
Արդյունքում, ներդրման համար ընտրվեց Կոտլինը, ավտոբուսի ճարտարապետությունը (սա այն դեպքում, երբ մոդուլները միմյանց հետ շփվում են վիրտուալ տվյալների ավտոբուսների միջոցով), JSON՝ որպես սարքի նկարագրության ձևաչափ, և GDB RSP՝ որպես վրիպազերծիչի հետ փոխգործակցության արձանագրություն։
Զարգացումը շարունակվում է երկու տարուց մի փոքր ավելի և ակտիվորեն շարունակվում է: Այս ընթացքում ներդրվել են MIPS, x86, V850ES, ARM և PowerPC պրոցեսորային միջուկները։
Նախագիծը գնալով մեծանում է, և ժամանակն է այն ներկայացնել լայն հանրությանը։ Մենք ավելի ուշ կանենք նախագծի մանրամասն նկարագրությունը, բայց առայժմ կկենտրոնանանք Kopycat-ի օգտագործման վրա:
Ամենաանհամբերների համար կարելի է ներբեռնել էմուլյատորի պրոմո տարբերակը
Rhino էմուլյատորում
Հիշեցնենք, որ ավելի վաղ SMARTRHINO-2018 կոնֆերանսի համար ստեղծվել էր «Rhinoceros» թեստային սարք՝ հակադարձ ինժեներական հմտություններ սովորեցնելու համար։ Ստատիկ որոնվածի վերլուծության գործընթացը նկարագրված է
Հիմա եկեք փորձենք ավելացնել «բարձրախոսներ» և գործարկել որոնվածը էմուլատորում:
Մենք պետք է.
1) Java 1.8
2) Python և մոդուլ
Windows- ի համար.
1)
2)
Linux-ի համար.
1) սոցատ
Որպես GDB հաճախորդ կարող եք օգտագործել Eclipse, IDA Pro կամ radare2:
Ինչպես է դա աշխատում.
Էմուլյատորում որոնվածը կատարելու համար անհրաժեշտ է «հավաքել» վիրտուալ սարք, որն իրական սարքի անալոգն է։
Իրական սարքը («ռնգեղջյուր») կարելի է ցույց տալ բլոկային դիագրամում.
Էմուլյատորն ունի մոդուլային կառուցվածք, և վերջնական վիրտուալ սարքը կարելի է նկարագրել 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-ը 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
Windows-ում 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 - 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-ում վերլուծության ձևով
Դուք կարող եք նաև օգտագործել հիմնական որոնվածը առանց մետա տեղեկատվության:
IDA Pro-ում Kopycat-ը գործարկելուց հետո Debugger-ի մենյուում անցեք կետին «Փոխարկել վրիպազերծիչը…«և ընտրիր»Հեռավոր GDB կարգաբերիչ«. Հաջորդը, կարգավորեք կապը. մենյու Վրիպազերծիչ – Գործընթացի ընտրանքներ…
Սահմանեք արժեքները.
- Դիմում - ցանկացած արժեք
- Հոսթի անունը՝ 127.0.0.1 (կամ հեռավոր մեքենայի IP հասցեն, որտեղ աշխատում է Kopycat-ը)
- Port: 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 արժեքը դրոշի վրա գրելուց հետո ինքնին դնել ընդմիջման կետը կոդի մեջ: զբաղված.
Ընդմիջման կետի կարգավորիչ
Նախ, եկեք ստեղծենք Python գործառույթը IDA-ում: Մենյու Ֆայլ - Սցենար հրաման...
Ձախ կողմում գտնվող ցանկում ավելացրեք նոր հատված, անուն տվեք (օրինակ՝ BPT),
Աջ կողմում գտնվող տեքստային դաշտում մուտքագրեք գործառույթի կոդը.
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-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 ապարատային վրիպազերծում դուք պետք է ավելացնեք նոր կոնֆիգուրացիա, այնուհետև «Հիմնական» ներդիրում նշեք ընթացիկ նախագիծը և վրիպազերծման հավելվածը.
«Վրիպազերծիչ» ներդիրում դուք պետք է նշեք GDB հրամանը.
${openstm32_compiler_path}arm-none-eabi-gdb
Եվ նաև մուտքագրեք GDB սերվերին միանալու պարամետրերը (հյուրընկալող և նավահանգիստ).
«Գործարկման» ներդիրում դուք պետք է նշեք հետևյալ պարամետրերը.
- միացնել վանդակը Բեռնել պատկերը (այնպես, որ հավաքված որոնվածի պատկերը բեռնված է էմուլատորի մեջ);
- միացնել վանդակը Բեռնման նշաններ;
- ավելացնել գործարկման հրամանը.
set $pc = *0x08000004
(ՀՀ ռեգիստրը սահմանեք հասցեի հիշողության արժեքին0x08000004
- հասցեն պահվում է այնտեղ ResetHandler).
Խնդրում ենք նկատի ունենալ,, եթե դուք չեք ցանկանում ներբեռնել որոնվածի ֆայլը Eclipse-ից, ապա ընտրանքները Բեռնել պատկերը и Գործարկել հրամանները կարիք չկա նշելու.
«Վրիպազերծում» սեղմելուց հետո կարող եք աշխատել վրիպազերծման ռեժիմում՝
- կոդի քայլ առ քայլ կատարում
- փոխազդեցություն ընդմիջման կետերի հետ
Նշում. Eclipse-ն ունի, հմմ... որոշ տարօրինակություններ... և դու պետք է ապրես դրանցով: Օրինակ, եթե վրիպազերծիչը գործարկելիս հայտնվում է «0x0»-ի համար հասանելի աղբյուր չկա» հաղորդագրությունը, ապա կատարեք «Քայլ» հրամանը (F5)
Փոխարենը մի եզրակացության
Մայրենի կոդի նմանակումը շատ հետաքրքիր բան է: Սարքի մշակողի համար հնարավոր է դառնում կարգավորել որոնվածը առանց իրական սարքի: Հետազոտողի համար դա հնարավորություն է դինամիկ կոդի վերլուծություն իրականացնելու, ինչը միշտ չէ, որ հնարավոր է նույնիսկ սարքի դեպքում։
Մենք ցանկանում ենք մասնագետներին տրամադրել այնպիսի գործիք, որը հարմար է, չափավոր պարզ է և մեծ ջանք ու ժամանակ չի պահանջում տեղադրման և գործարկման համար:
Մեկնաբանություններում գրեք ապարատային էմուլյատորների օգտագործման ձեր փորձի մասին: Հրավիրում ենք ձեզ քննարկելու և սիրով կպատասխանենք հարցերին:
Հարցմանը կարող են մասնակցել միայն գրանցված օգտվողները։
Ինչի՞ համար եք օգտագործում էմուլյատորը:
-
Ես մշակում եմ (վրիպազերծում) որոնվածը
-
Ես ուսումնասիրում եմ որոնվածը
-
Ես գործարկում եմ խաղեր (Dendi, Sega, PSP)
-
ուրիշ բան (գրեք մեկնաբանություններում)
Քվեարկել է 7 օգտատեր։ 2 օգտատեր ձեռնպահ է մնացել։
Ի՞նչ ծրագրաշար եք օգտագործում հայրենի կոդը ընդօրինակելու համար:
-
QEMU
-
Միաեղջյուր շարժիչ
-
Proteus
-
ուրիշ բան (գրեք մեկնաբանություններում)
Քվեարկել է 6 օգտատեր։ 2 օգտատեր ձեռնպահ է մնացել։
Ի՞նչ կցանկանայիք բարելավել ձեր օգտագործած էմուլյատորում:
-
Ես արագություն եմ ուզում
-
Ես ուզում եմ տեղադրման/գործարկման հեշտություն
-
Ես ուզում եմ ավելի շատ տարբերակներ էմուլյատորի հետ շփվելու համար (API, կեռիկներ)
-
Ես գոհ եմ ամեն ինչից
-
ուրիշ բան (գրեք մեկնաբանություններում)
Քվեարկել է 8 օգտատեր։ 1 օգտատեր ձեռնպահ է մնացել։
Source: www.habr.com