
Kohtumise raames 0x0A DC7831 16. veebruaril esitlesime ettekannet binaarkoodi emulatsiooni pÔhialustest ja meie arengust - riistvaraplatvormide emulaatorist. .
Artiklis kirjeldame seadme pĂŒsivara kĂ€ivitamist emulaatoris, demonstreerime suhtlemist siluri ja teeme vĂ€ikese dĂŒnaamilise analĂŒĂŒsi pĂŒsivara ĂŒle.
Eellugu
Kaua aega tagasi kaugel-galaktikas
MĂ”ni aasta tagasi oli meie laboris vajadus uurida seadme pĂŒsivara. PĂŒsivara oli tihendatud, lahti pakitud bootloader'iga. Ta tegi seda ĂŒsna keerulisel moel, paar korda andmeid mĂ€lus ĂŒmber paigutades. Ja ise pĂŒsivara suhtles aktiivselt perifeeriaga. Ja kĂ”ik see MIPSi tuumal.
KÀesolevad emulaatorid ei rahuldanud meid objektiivsetel pÔhjustel, kuid soovisime ikkagi koodi kÀivitada. Siis otsustasime teha oma emulaatori, mis teeks minimaalselt ja vÔimaldaks pÔhivara lahti pakkida. Proovisime - see töötas. MÔtlesime, mis siis, kui lisada perifeeria, et ka pÔhivara töötlema hakata. See ei olnud eriti keeruline - ja ka see töötas. Taaskord mÔtlesime ja otsustasime teha tÀisfunktsionaalse emulaatori.
Tulemusena saime arvutisĂŒsteemide emulaatori .

Miks Kopycat?
See on sÔnamÀng.
- copycat (inglise, subst. [ËkÉpÉȘkĂŠt]) - imiteerija, jĂ€ljendaja
- cat (inglise, subst. [ËkĂŠt]) - kass, kiisu - ĂŒks projekti looja lemmiklooma nimi
- TĂ€ht âKâ on saadud programmeerimiskeelest Kotlin
Kopycat
Emulaatori loomisel seati tÀiesti konkreetsed eesmÀrgid:
- vĂ”imalus ĂŒsna kiiresti luua uus perifeeria, moodul, protsessorituum;
- vÔimalus kokku panna virtuaalne seade erinevatest moodulitest;
- vĂ”imalus laadida virtuaalse seadme mĂ€llu kĂ”iki binaarseid andmeid (pĂŒsivara);
- vĂ”imalus töötada snapshootidega (sĂŒsteemi olekute pildid);
- vÔimalus suhelda emulaatoriga lÀbi sisseehitatud siluri;
- mugav ja kaasaegne programmeerimiskeel arendamiseks.
LĂ”puks valiti elluviimiseks Kotlin, bussiarhitektuur (see tĂ€hendab, et moodulid ĂŒhendatakse omavahel virtuaalsete andmebusside kaudu), JSON - seadme kirjeldamise formaadina, ja GDB RSP - siluri suhtlusprotokollina.
Arendus on kestnud veidi ĂŒle kahe aasta ja jĂ€tkub aktiivselt. Selle aja jooksul on teostatud MIPS, x86, V850ES, ARM ja PowerPC protsessori tuumad.
Projekt kasvab ja on aeg tutvustada seda laiemale publikule. Projekti ĂŒksikasjalik kirjeldus tuleb hiljem, aga praegu keskendume Kopycat'i kasutamisele.
KĂ”ige kannatamatutele â emulaatori promoversioon on saadaval allalaadimiseks .
Ninasarvik emulaatoris
Kasutame meelde tuletamiseks, et varem loodi konverentsiks SMARTRHINO-2018 testseade "Ninasarvik" reversseerituse oskuste Ă”ppimiseks. Juhendi staatilise analĂŒĂŒsi jaoks kirjeldati. .
KĂ€esolevaga proovime aga lisada "dĂŒnaamikat" ja kĂ€ivitame pĂŒsivara emulaatoris.
Meile on vajalikud:
1) Java 1.8
2) Python ja moodul Python'i kasutamiseks emulaatoris. WHL-ehitatud Jep mooduli versioon Windowsile on saadaval. .
Windowsi jaoks:
1)
2)
Linuxi jaoks:
1) socat
GDB-klientina saab kasutada Eclipse'i, IDA Pro'd vÔi radare2.
Kuidas see töötab?
PĂŒsivara emulaatoris tĂ€itmiseks on vajalik "kokku panna" virtuaalne seade, mis esindab reaalset seadet.
Reaalset seadet ("ninasarvik") saab nÀidata struktuuriskeemis:

Emulaatoril on modulaarne struktuur ning lÔplikku virtuaalset seadet saab kirjeldada JSON-failis.
JSON 105 real
{
"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"]
]
}Pange tĂ€hele parameetrit firmware jaotises params â see on faili nimi, mille saab laadida virtuaalsesse seadmesse pĂŒsivara vormis.
Virtuaalne seade ja selle koostoime pÔhiosakonnaga on esitatud jÀrgmisel skeemil:

Praegune emulaatori testimise eksemplar eeldab koostoimet pĂ”hiosakonna COM-portidega (silumis UART ja UART Bluetooth-mooduli jaoks). Need vĂ”ivad olla reaalsed portid, kuhu seadmed on ĂŒhendatud, vĂ”i siis virtuaalsed COM-portid (just selleks on vajalik com0com / socat).
Praegu on emulaatoriga vÀlise koostoime jaoks kaks peamist viisi:
- GDB RSP protokoll (vastavalt sellele protokollile toetavad tööriistad â Eclipse / IDA / radare2);
- emulaatori sisemine kÀsurea liides (Argparse vÔi Python).
Virtuaalsed COM-portid
Kuna virtuaalse seadme UART-iga koostoime loomiseks kohaliku masina terminaliga on vajalik luua seotud virtuaalsete COM-portide paar. Meie juhul kasutab ĂŒhte porti emulaator ja teist â terminali programm (PuTTY vĂ”i screen):

com0com kasutamine
Virtuaalsed COM-portid seadistatakse com0com komplekti setup-utility abil (konsolversioon â C:Program Files (x86)com0comsetupŃ.exe, vĂ”i GUI-versioon â C:Program Files (x86)com0comsetupg.exe):

Tuleb mÀrkida linnukesed enable buffer overrun kÔikide loodud virtuaalsete portide jaoks, vastasel juhul ootab emulaator vastust COM-portidelt.
socat kasutamine
UNIX-sĂŒsteemides luuakse virtuaalsed COM-portid emulaatori poolt automaatselt socat utiliidi abil, selleks piisab emulaatori kĂ€ivitamisel portide nimes prefiksi mÀÀramisest socat:.
Sisemine kÀsurea liides (Argparse vÔi Python)
Kuna Kopycat on konsooli rakendus, pakub emulaator oma objektide ja muutujatega koostoime loomiseks kahte kÀsurea liidese vÔimalust: Argparse ja Python.
Argparse on Kopycati sisse ehitatud CLI, mis on alati ja kÔigile kergesti ligipÀÀsetav.
Alternatiivne CLI on Python'i tÔlk. Selle kasutamiseks tuleb installida Python'i moodul Jep ja seadistada emulaator töötama Pythoniga (kasutatakse kasutaja pÔhiosakonnas installitud Python'i tÔlget).
Python'i mooduli Jep installimine
Linuxis saab Jep'i installida pip'i kaudu:
pip install jepJepi installimiseks Windowsis tuleb eelnevalt installida Windows SDK ja vastav Microsoft Visual Studio. Oleme teie ĂŒlesande pisut lihtsustanud ja teinud JEP aktuaalsete Python versioonide jaoks Windowsis, seega saab mooduli installida failist:
pip install jep-3.8.2-cp27-cp27m-win_amd64.whlJep'i installatsiooni kontrollimiseks peate kÀivitama kÀsureal:
python -c "import jep"Vastuseks peaks tulema sÔnum:
ImportError: Jep ei ole iseseisvas Python'is toetatud, see peab olema Java'sse sisse embeditud.Teie sĂŒsteemi emulaatori kĂ€sklusfailis (kopycat.bat â Windowsi jaoks, kopycat â Linuxi jaoks) lisage parameetrite loendisse DEFAULT_JVM_OPTS lisaks veel ĂŒks parameeter Djava.library.path â see peab sisaldama teed installitud mooduli Jep'i juurde.
Seega peaks Windowsi jaoks saama jÀrgmine rida:
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"Kopycat'i kÀivitamine
Emulaator on konsoolipĂ”hine JVM rakendus. KĂ€ivitamine toimub operatsioonisĂŒsteemi kĂ€surea skripti kaudu (sh/cmd).
KÀivitamis kÀsk Windowsis:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28KÀivitamis kÀsk Linuxis, kasutades utiliiti 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-port, mis avatakse GDB-serveri juurde pÀÀsemiseks;-n rhinoâ pĂ”hikomplekti seadme nimi;-l userâ pĂ”hikomplekti otsingu raamatukogu nimi;-y libraryâ seadme moodulite otsingu tee;firmwarerhino_pass.binâ muudete faili tee;- COM26 ja COM28 â virtuaalsed COM-pordid.
Tulemuseks on vÀljund: Python > (vÔi Argparse >):
18:07:59 INFO [eFactoryBuilder.create]: Moodul top loodi edukalt kui top
18:07:59 INFO [Module.initializeAndRes]: Seadistatakse core top.u1_stm32.cortexm0.arm jaoks
18:07:59 INFO [Module.initializeAndRes]: Seadistatakse debugeerija top.u1_stm32.dbg jaoks
18:07:59 WARN [Module.initializeAndRes]: Tracerit ei leitud top'i...
18:07:59 INFO [Module.initializeAndRes]: Portide ja busside algatamine...
18:07:59 WARN [Module.initializePortsA]: TĂHELEPANU: MĂ”nedel portidel on hoiatuseid, kasutage printModulesPortsWarnings neid nĂ€ha...
18:07:59 FINE [ARMv6CPU.reset]: Sisendpunkti aadress on seatud 08006A75
18:07:59 INFO [Module.initializeAndRes]: Moodul top on edukalt algatatud ja lÀhtestatud kui top rakk!
18:07:59 INFO [Kopycat.open]: Alustatakse plaadi top[rhino] virtualiseerimist arm[ARMv6Core]
18:07:59 INFO [GDBServer.debuggerModule]: Uus debugeerija moodul top.u1_stm32.dbg on seadistatud GDB_SERVER(port=23946,alive=true)
Python >Koostoime IDA Pro-ga
AnalĂŒĂŒsi lĂ€htefailina IDAs kasutame testimise lihtsustamiseks «Rhinole» mĂ”eldud firmware'i (seal on salvestatud metaainfo).
Samuti vÔite kasutada pÔhifirmware'i ilma metaandmeteta.
PĂ€rast Kopycat'i kĂ€ivitamist IDA Pro's liigume Debugger menĂŒĂŒs punkti «Switch debuggerâŠÂ» ja valime «Kaug-GDB debugger«. JĂ€tkame ĂŒhenduse seadistamist: menĂŒĂŒ Debugeerija â Protsessi valikudâŠ
Seame vÀÀrtused:
- Rakendus â ĂŒkskĂ”ik milline vÀÀrtus
- Hostname: 127.0.0.1 (vÔi kaugmasina IP-aadress, kus Kopycat on kÀimas)
- Port: 23946

NĂŒĂŒd on kĂ€ivitamise nupp (klahv F9) saadaval:
![]()
Klikkame sellele â ĂŒhendame debugeerimise mooduliga emulaatoris. IDA lĂ€heb debugeerimise reĆŸiimi, avanevad lisakraanid: registerteave, stek.
NĂŒĂŒd saame kasutada kĂ”iki standardseid debugeerimisvĂ”imalusi:
- juhuslikult teostada juhiseid (Step into ja Step over â klahvid F7 ja F8, vastavalt);
- kÀivitamine ja tÀitmise peatamine;
- looge peatuspunkte nii koodi kui ka andmete jaoks (klahv F2).
Debugeerijaga ĂŒhendamine ei tĂ€henda, et koodiraamat kĂ€ivitub. TĂ€itmiseks peab hetke aadress olema 0x08006A74 â funktsiooni algus Reset_Handler. Kui kerida loetelu alla, siis on nĂ€ha funktsiooni kutset main. Kursor vĂ”ib sellel real seista (aadress 0x08006ABE) ja teostada toimingu Run until cursor (klahv F4).

JÀtkamiseks vÔib vajutada F7, et siseneda funktsiooni main.
Kui tÀita kÀsk Continue process (klahv F9), siis ilmub aken "Palun oota" ainulaadse nupuga Suspend:

Kuna vajutatakse, Suspend koodi tÀitmine peatub ja seda saab jÀtkata samalt aadressilt koodis, kus see katkestati.
Kui jĂ€tkata koodi tĂ€itmist, siis virtuaalsetes COM-portides ĂŒhendatud terminalides vĂ”ib nĂ€ha jĂ€rgmisi ridu:


Rida "state bypass" nĂ€itab, et virtuaalne Bluetooth-moodul on lĂ€inud kasutaja COM-portide andmete vastuvĂ”tmise reĆŸiimi.
NĂŒĂŒd saab Bluetooth-terminalis (pildil â COM29) sisestada kĂ€ske vastavalt "NorsupĂ€tsi" protokollile. NĂ€iteks kĂ€sule "MEOW" tagastatakse Bluetooth-terminalis rida "mur-mur":

Emuleeri mind mitte tÀielikult
Emulaatori loomisel saab valida seadme detailituse/emuletuse taset. NĂ€iteks Bluetooth-moodulit saab emuleerida erinevalt:
- emuleeritakse seadet tÀielikult koos tÀieliku kÀsu kogumiga;
- emuleeritakse AT-kĂ€ske, samas kui andmevoog vĂ”etakse peamise sĂŒsteemi COM-portist;
- virtuaalne seade tagab tÀieliku andmete edastamise reaalsele seadmele;
- lihtsa stubina, mis alati tagastab "OK".
KĂ€esolevas emulaatori versioonis kasutatakse teist lĂ€henemist â virtuaalne Bluetooth-modul konfigureerib, seejĂ€rel lĂ€heb andmete "proximeerimise" reĆŸiimi COM-pordist pĂ”h sĂŒsteemist emulaatori UART-porda.

Vaatame vĂ”imalust lihtsaks koodi instrumenteerimiseks, juhul kui mĂ”ni perifeeria osa ei ole teostatud. NĂ€iteks, kui taimerit, mis vastutab andmete edastamise ĂŒle DMA, ei ole loodud (kontrollimine toimub funktsioonis ws2812b_wait, mis asub aadressil 0x08006840), siis jÀÀb firmware alati ootama lipu lĂ€htestamist busy, mis asub aadressil 0x200004C4, mis nĂ€itab DMA andmeliini hĂ”ivatust:

Saame selle olukorra vÀltida, "manuaalselt" lipu lÀhtestamisega busy koheselt pÀrast selle seadistamist. IDA Pro-s saab luua Python-funktsiooni ja seda kutsuda breakpoint'is, samas kui breakpoint tuleb paigutada koodi pÀrast vÀÀrtuse 1 kirjutamist lipule busy.
Breakpoint'i töötleja
Esiteks loome Python-funktsiooni IDA-s. MenĂŒĂŒ File â Script commandâŠ
Lisame uue lÔigu vasakpoolse nimekirja, anname sellele nime (nÀiteks, BPT),
ja parempoolsesse tekstivÀljadese sisestame funktsiooni koodi:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False 
PĂ€rast seda vajutame KĂ€ita ja sulgeme skripti akna.
NĂŒĂŒd liikume aadressile 0x0800688A, paigaldame breakpoint'i (klahv F2), redigeerime seda (konteksimenĂŒĂŒ Edit breakpointâŠ), Ă€rge unustage seada skripti tĂŒĂŒpi â Python:


Kui lipu praegune vÀÀrtus busy on 1, siis tuleb kutsuda funktsioon skip_dma skripti ridas:

Kui kĂ€ivitada firmware'i tĂ€itmine, siis saab breakpoint'i töötleja koodi aktiveerimist nĂ€ha IDA-s aknas VĂ€ljund rea jĂ€rgi Skipping wait ws2812.... NĂŒĂŒd ei ootata lipu lĂ€htestamist busy.
Suhtlemine emulaatoriga
Emuleerimine emuleerimise nimel tÔenÀoliselt ei tekita rÔÔmu. Tunduvalt huvitavam on, kui emulaator aitab uurijal vaadata mÀlu andmeid vÔi luua voogude vahel suhtlemist.
KĂ€tkeme, kuidas dĂŒnaamiliselt seada RTOS-i ĂŒlesannete vahelisi suhteid. Eelnevalt tuleks koodi tĂ€itmine peatada, kui see on kĂ€ivitunud. Kui minna funktsiooni bluetooth_task_entry LED kĂ€sitlemisvĂ”sasse (aadress 0x080057B8), siis vĂ”ib nĂ€ha, et esmalt luuakse ja seejĂ€rel saadetakse sĂŒsteemi jĂ€rjekorda ledControlQueueHandle mingi sĂ”num.

Tuleb paigaldada breakpoint muutuja seuradele ja jÀtkata koodi tÀitmist: ledControlQueueHandle, mis asub aadressil 0x20000624 ja jÀtkata koodi tÀitmist:

Seega toimub esmalt peatamine aadressil 0x080057CA enne funktsiooni kutsumist osMailAlloc, seejĂ€rel aadressil 0x08005806 enne funktsiooni kutsumist osMailPut, hiljem mĂ”ne aja pĂ€rast aadressil 0x08005BD4 (enne funktsiooni kutsumist osMailGet), mis kuulub funktsioonile leds_task_entry (LED-ĂŒlesanne), st toimus ĂŒlesannete vahetus ja nĂŒĂŒd sai juhtimise LED-ĂŒlesanne.

Nii lihtsal viisil saab mÀÀrata, kuidas RTOS-i ĂŒlesanded ĂŒksteisega suhtlevad.
TĂ”enĂ€oliselt on ĂŒlesannete vaheline suhtlemine keerulisem, kuid simulaatori abil on selle jĂ€lgimine vĂ€hem koormav.
VÔite vaadata vÀikest videot simulaatori kÀivitamisest ja selle suhtlemisest IDA Pro-ga.
KĂ€ivitamine Radare2 abil
Ei saa ĂŒle vaadata sellist universaalset tööriista nagu Radare2.
Emulaatoriga ĂŒhendamiseks r2 abil nĂ€eb kĂ€sk vĂ€lja jĂ€rgmiselt:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elfPraegu on saadaval kÀivitamine (dc) ja kÀivitamise peatamine (Ctrl+C).
Kahjuks on r2-ga hetkel probleeme, kui töötada riistvara gdb-serveriga ja mÀlu kaardistamisega, seetÔttu ei tööta peatumise punktid ja Step'id (kÀsk ds). Loodame, et see parandatakse lÀhitulevikus.
KĂ€ivitamine Eclipse'iga
Ăks vĂ”imalus simulaatori kasutamiseks on arendatava seadme pĂŒsivara silumine. Selguse huvides kasutame ka pĂŒsivara 'Norsut'. PĂŒsivara lĂ€htekoodi saab alla laadida .
IDE-na kasutame Eclipse'i komplektist .
Kuna kĂ€ivitamiseks peab simulaatorisse laadima Eclipse'is otse kompileeritud pĂŒsivara, on vajalik lisada parameeter firmware=null simulaatori kĂ€ivitamiskĂ€sule:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28Silumisprotsessi seadistamine
Eclipse'is valime menĂŒĂŒst Run â Debug Configurations⊠Avanevas aknas jaotises GDB Hardware Debugging on vajalik lisada uus konfigureerimine, mille jĂ€rel vahekaardil 'Main' tuleb mÀÀrata praegune projekt ja silumisrakendus:

Vahekaardil 'Debugger' on vajalik mÀÀrata GDB-kÀsk:
${openstm32_compiler_path}arm-none-eabi-gdb
Ja ka sisestada parameetrid GDB-serveriga ĂŒhendamiseks (host ja port):

Vahekaardil 'Startup' on vajalik mÀÀrata jÀrgmised parameetrid:
- mĂ€rkida linnuke Load image (et simulaatorisse laaditaks kokku pandud pĂŒsivara kuva);
- mÀrkida linnuke Load symbols;
- lisada kÀivitamiskÀsk:
set $pc = *0x08000004(mÀÀrata PC registrisse vÀÀrtus mĂ€lust aadressilt0x08000004â seal on salvestatud aadress ResetHandlerâi).
Pange tĂ€hele, kui te ei soovi laadida pĂŒsivara faili Eclipseâist, siis parameetreid Load image ja KĂ€ivita kĂ€sud mĂ€rkida ei ole vaja.

PĂ€rast Debug nuppu vajutamist saab töötada silumine reĆŸiimis:
- koodi samm-sammuline tÀitmine

- koostöö peatuspunktega

MĂ€rkus. Eclipseâis on, hmm⊠mĂ”ned eripĂ€rad⊠ning nendega tuleb ellu jÀÀda. NĂ€iteks, kui silumi kĂ€ivitamisel ilmub sĂ”num âNo source available for â0x0âłâ, siis tĂ€itke kĂ€sk Step (F5)

LÔpetuseks
Natiivse koodi emuleerimine on vĂ€ga huvitav asi. Seadmete arendajale annab see vĂ”imaluse siluda pĂŒsivara ilma reaalse seadmeta. Uurijale â vĂ”imalus lĂ€bi viia koodi dĂŒnaamiline analĂŒĂŒs, mis ei ole alati vĂ”imalik isegi seadmega.
Me tahame pakkuda spetsialistidele tööriista, mis oleks mugav, piisavalt lihtne ja ei nÔuaks palju jÔudu ja aega seadistamiseks ja kÀivitamiseks.
Kirjutage kommentaarides oma kogemustest riistvara emulaatorite kasutamisel. Ootame arutelu ja vastame rÔÔmuga kĂŒsimustele.
Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. , palun.
Milleks kasutate emulaatorit?
arendan (silun) pĂŒsivara
uurin pĂŒsivara
kÀivitan mÀnge (Dendi, Sega, PSP)
midagi muud (kirjutage kommentaaridesse)
HÀÀletas 7 kasutajat. 2 kasutajat jÀid erapooletuks.
Millist tarkvara kasutate natiivse koodi emuleerimiseks?
QEMU
Unicorn engine
Proteus
midagi muud (kirjutage kommentaaridesse)
HÀÀletanud 6 kasutajat. 2 kasutajat hoidusid.
Mida sooviksite parandada kasutatavas emulaatoris?
soovin kiirus
soovin seadistamise/kÀivitamise mugavust
soovin rohkem vÔimalusi emulaatoriga suhtlemiseks (API, hookid)
olen rahul kÔigega
midagi muud (kirjutage kommentaaridesse)
HÀÀletas 8 kasutajat. 1 kasutaja jÀi erapooletuks.
Allikas: habr.com


