Sapulces ietvaros 0x0A DC7831
Å ajÄ rakstÄ mÄs aprakstÄ«sim, kÄ emulatorÄ palaist ierÄ«ces programmaparatÅ«ru, demonstrÄt mijiedarbÄ«bu ar atkļūdotÄju un veikt nelielu programmaparatÅ«ras dinamisku analÄ«zi.
AizvÄsture
Sen tÄlu galaktikÄ
Pirms pÄris gadiem mÅ«su laboratorijÄ radÄs nepiecieÅ”amÄ«ba izpÄtÄ«t kÄdas ierÄ«ces programmaparatÅ«ru. ProgrammaparatÅ«ra tika saspiesta un izpakota ar sÄknÄÅ”anas ielÄdÄtÄju. ViÅÅ” to izdarÄ«ja ļoti sarežģītÄ veidÄ, vairÄkas reizes pÄrvietojot datus atmiÅÄ. Un pati programmaparatÅ«ra pÄc tam aktÄ«vi mijiedarbojÄs ar perifÄrijas ierÄ«cÄm. Un tas viss uz MIPS kodola.
ObjektÄ«vu iemeslu dÄļ esoÅ”ie emulatori mums nederÄja, bet mÄs joprojÄm gribÄjÄm palaist kodu. Tad mÄs nolÄmÄm izveidot savu emulatoru, kas darÄ«tu minimÄlu un ļautu mums izpakot galveno programmaparatÅ«ru. MÄs to izmÄÄ£inÄjÄm, un tas strÄdÄja. MÄs domÄjÄm, kÄ bÅ«tu, ja pievienotu perifÄrijas ierÄ«ces, lai veiktu arÄ« galveno programmaparatÅ«ru. Tas ļoti nesÄpÄja - un tas arÄ« izdevÄs. MÄs vÄlreiz pÄrdomÄjÄm un nolÄmÄm izveidot pilnvÄrtÄ«gu emulatoru.
RezultÄts bija datorsistÄmu emulators
KÄpÄc Kopycat?
Notiek vÄrdu spÄle.
- atdarinÄjumu (angļu valodÄ, lietvÄrds [ĖkÉpÉŖkƦt]) - atdarinÄtÄjs, atdarinÄtÄjs
- kaÄ·is (angļu valodÄ, lietvÄrds [ĖkƦt]) - kaÄ·is, kaÄ·is - mīļÄkais dzÄ«vnieks vienam no projekta veidotÄjiem
- Burts āKā ir no Kotlin programmÄÅ”anas valodas
Copycat
Veidojot emulatoru, tika izvirzÄ«ti ļoti konkrÄti mÄrÄ·i:
- iespÄja Ätri izveidot jaunas perifÄrijas ierÄ«ces, moduļus, procesora kodolus;
- iespÄja salikt virtuÄlo ierÄ«ci no dažÄdiem moduļiem;
- iespÄja ielÄdÄt jebkÄdus binÄros datus (programmaparatÅ«ru) virtuÄlÄs ierÄ«ces atmiÅÄ;
- prasme strÄdÄt ar momentuzÅÄmumiem (sistÄmas stÄvokļa momentuzÅÄmumiem);
- spÄja mijiedarboties ar emulatoru, izmantojot iebÅ«vÄto atkļūdotÄju;
- jauka mūsdienu valoda attīstībai.
RezultÄtÄ Kotlin tika izvÄlÄts ievieÅ”anai, kopnes arhitektÅ«ra (tas ir, kad moduļi sazinÄs viens ar otru, izmantojot virtuÄlÄs datu kopnes), JSON kÄ ierÄ«ces apraksta formÄts un GDB RSP kÄ protokols mijiedarbÄ«bai ar atkļūdotÄju.
AttÄ«stÄ«ba notiek nedaudz vairÄk kÄ divus gadus un aktÄ«vi turpinÄs. Å ajÄ laikÄ tika ieviesti MIPS, x86, V850ES, ARM un PowerPC procesoru kodoli.
Projekts aug un ir pienÄcis laiks ar to iepazÄ«stinÄt plaÅ”Äku sabiedrÄ«bu. DetalizÄtu projekta aprakstu sniegsim vÄlÄk, bet pagaidÄm koncentrÄsimies uz Kopycat lietoÅ”anu.
NepacietÄ«gÄkajiem emulatora reklÄmas versiju var lejupielÄdÄt no
Rhino emulatorÄ
AtgÄdinÄsim, ka iepriekÅ” konferencei SMARTRHINO-2018 tika izveidota testa iekÄrta āDegunradzisā reversÄs inženierijas prasmju mÄcÄ«Å”anai. StatiskÄs programmaparatÅ«ras analÄ«zes process tika aprakstÄ«ts
Tagad mÄÄ£inÄsim pievienot āskaļruÅusā un palaist programmaparatÅ«ru emulatorÄ.
Mums ir nepiecieŔams:
1) Java 1.8
2) Python un modulis
OperÄtÄjsistÄmai Windows:
1)
2)
OperÄtÄjsistÄmai Linux:
1) socat
KÄ GDB klientu varat izmantot Eclipse, IDA Pro vai radare2.
KÄ tas strÄdÄ?
Lai emulatorÄ veiktu programmaparatÅ«ru, ir nepiecieÅ”ams āsamontÄtā virtuÄlo ierÄ«ci, kas ir reÄlas ierÄ«ces analogs.
ÄŖsto ierÄ«ci ("rhino") var parÄdÄ«t blokshÄmÄ:
Emulatoram ir modulÄra struktÅ«ra, un galÄ«go virtuÄlo ierÄ«ci var aprakstÄ«t JSON failÄ.
JSON 105 rindas
{
"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"]
]
}
PievÄrsiet uzmanÄ«bu parametram programmaparatÅ«ra daļa parametri ir faila nosaukums, ko var ielÄdÄt virtuÄlajÄ ierÄ«cÄ kÄ programmaparatÅ«ru.
VirtuÄlo ierÄ«ci un tÄs mijiedarbÄ«bu ar galveno operÄtÄjsistÄmu var attÄlot ar Å”Ädu diagrammu:
PaÅ”reizÄjais emulatora testa gadÄ«jums ietver mijiedarbÄ«bu ar galvenÄs OS COM portiem (UART un UART atkļūdoÅ”ana Bluetooth modulim). Tie var bÅ«t reÄli porti, kuriem ir pievienotas ierÄ«ces, vai virtuÄlie COM porti (Å”im nolÅ«kam jums vienkÄrÅ”i nepiecieÅ”ams com0com/socat).
PaÅ”laik ir divi galvenie veidi, kÄ mijiedarboties ar emulatoru no Ärpuses:
- GDB RSP protokols (attiecīgi rīki, kas atbalsta Ŕo protokolu, ir Eclipse / IDA / radare2);
- iekÅ”ÄjÄ emulatora komandrinda (Argparse vai Python).
VirtuÄlie COM porti
Lai mijiedarbotos ar vietÄjÄs maŔīnas virtuÄlÄs ierÄ«ces UART, izmantojot terminÄli, ir jÄizveido pÄris saistÄ«to virtuÄlo COM portu. MÅ«su gadÄ«jumÄ vienu portu izmanto emulators, bet otro izmanto terminÄļa programma (PuTTY vai ekrÄns):
Izmantojot com0com
VirtuÄlie COM porti tiek konfigurÄti, izmantojot iestatÄ«Å”anas utilÄ«tu no com0com komplekta (konsoles versija - C:Program Files (x86)com0comsetupŃ.exe, vai GUI versija - C:Program Files (x86)com0comsetupg.exe):
AtzÄ«mÄjiet izvÄles rÅ«tiÅas iespÄjot bufera pÄrtÄriÅu visiem izveidotajiem virtuÄlajiem portiem, pretÄjÄ gadÄ«jumÄ emulators gaidÄ«s atbildi no COM porta.
Izmantojot socat
UNIX sistÄmÄs emulators automÄtiski izveido virtuÄlos COM portus, izmantojot utilÄ«tu socat; lai to izdarÄ«tu, vienkÄrÅ”i norÄdiet prefiksu porta nosaukumÄ, startÄjot emulatoru. socat:
.
IekÅ”Äjais komandrindas interfeiss (Argparse vai Python)
TÄ kÄ Kopycat ir konsoles lietojumprogramma, emulators nodroÅ”ina divas komandrindas saskarnes opcijas, lai mijiedarbotos ar tÄ objektiem un mainÄ«gajiem: Argparse un Python.
Argparse ir CLI, kas iebÅ«vÄts Kopycat un vienmÄr ir pieejams ikvienam.
AlternatÄ«va CLI ir Python tulks. Lai to izmantotu, jÄinstalÄ Jep Python modulis un jÄkonfigurÄ emulators darbam ar Python (tiks izmantots lietotÄja galvenajÄ sistÄmÄ instalÄtais Python tulks).
Python moduļa Jep instalÄÅ”ana
Linux sistÄmÄ Jep var instalÄt, izmantojot pip:
pip install jep
Lai instalÄtu Jep operÄtÄjsistÄmÄ Windows, vispirms jÄinstalÄ Windows SDK un atbilstoÅ”Ä Microsoft Visual Studio. MÄs esam jums to padarÄ«juÅ”i nedaudz vieglÄk un
pip install jep-3.8.2-cp27-cp27m-win_amd64.whl
Lai pÄrbaudÄ«tu Jep instalÄÅ”anu, jums ir jÄpalaiž komandrindÄ:
python -c "import jep"
AtbildÄ ir jÄsaÅem Å”Äds ziÅojums:
ImportError: Jep is not supported in standalone Python, it must be embedded in Java.
JÅ«su sistÄmas emulatora sÄrijveida failÄ (copycat.bat - operÄtÄjsistÄmai Windows, kopÄt - Linux) uz parametru sarakstu DEFAULT_JVM_OPTS
pievienojiet papildu parametru Djava.library.path
ā tajÄ jÄietver ceļŔ uz instalÄto Jep moduli.
Windows rezultÄtam jÄbÅ«t Å”Ädai rindai:
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"
Tiek palaists Kopycat
Emulators ir konsoles JVM lietojumprogramma. PalaiÅ”ana tiek veikta, izmantojot operÄtÄjsistÄmas komandrindas skriptu (sh/cmd).
Komanda, lai palaistu operÄtÄjsistÄmÄ Windows:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28
Komanda, lai palaistu operÄtÄjsistÄmÄ Linux, izmantojot socat utilÄ«tu:
./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 ports, kas bÅ«s atvÄrts piekļuvei GDB serverim;-n rhino
ā galvenÄ sistÄmas moduļa (samontÄtÄs ierÄ«ces) nosaukums;-l user
ā bibliotÄkas nosaukums, kurÄ meklÄt galveno moduli;-y library
ā ceļŔ, lai meklÄtu ierÄ«cÄ iekļautos moduļus;firmwarerhino_pass.bin
ā ceļŔ uz programmaparatÅ«ras failu;- COM26 un COM28 ir virtuÄlie COM porti.
TÄ rezultÄtÄ tiks parÄdÄ«ta uzvedne Python >
(Vai 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 >
Mijiedarbība ar IDA Pro
Lai vienkÄrÅ”otu testÄÅ”anu, mÄs izmantojam Rhino programmaparatÅ«ru kÄ avota failu analÄ«zei IDA veidlapÄ
Varat arÄ« izmantot galveno programmaparatÅ«ru bez metainformÄcijas.
PÄc Kopycat palaiÅ”anas programmÄ IDA Pro izvÄlnÄ AtkļūdotÄjs dodieties uz vienumu āPÄrslÄgt atkļūdotÄjuā¦"un izvÄlieties"AttÄlais GDB atkļūdotÄjs". PÄc tam iestatiet savienojumu: izvÄlni AtkļūdotÄjs ā procesa opcijasā¦
Iestatiet vÄrtÄ«bas:
- Pielietojums - jebkura vÄrtÄ«ba
- Resursdatora nosaukums: 127.0.0.1 (vai tÄs attÄlÄs iekÄrtas IP adrese, kurÄ darbojas Kopycat)
- Ports: 23946
Tagad ir pieejama atkļūdoÅ”anas poga (taustiÅÅ” F9):
NoklikŔķiniet uz tÄ, lai izveidotu savienojumu ar atkļūdotÄja moduli emulatorÄ. IDA pÄriet atkļūdoÅ”anas režīmÄ, kļūst pieejami papildu logi: informÄcija par reÄ£istriem, par steku.
Tagad mÄs varam izmantot visas atkļūdotÄja standarta funkcijas:
- soli pa solim instrukciju izpilde (IekÄp Šø PÄrkÄpt pÄri ā attiecÄ«gi taustiÅi F7 un F8);
- izpildes sÄkÅ”ana un apturÄÅ”ana;
- izveidojot pÄrtraukuma punktus gan kodam, gan datiem (taustiÅÅ” F2).
Savienojuma izveide ar atkļūdotÄju nenozÄ«mÄ programmaparatÅ«ras koda palaiÅ”anu. PaÅ”reizÄjai izpildes pozÄ«cijai ir jÄbÅ«t adresei 0x08006A74
ā funkcijas sÄkums Reset_Handler. Ritinot sarakstu uz leju, varat redzÄt funkcijas izsaukumu galvenais. Kursoru var novietot uz Ŕīs rindas (adrese 0x08006ABE
) un veikt operÄciju Palaist lÄ«dz kursoram (taustiÅÅ” F4).
PÄc tam varat nospiest F7, lai ievadÄ«tu funkciju galvenais.
Ja palaižat komandu TurpinÄt procesu (taustiÅÅ” F9), tad ar vienu pogu parÄdÄ«sies logs āLÅ«dzu, uzgaidietā. ApturÄt:
Nospiežot ApturÄt programmaparatÅ«ras koda izpilde tiek apturÄta, un to var turpinÄt no tÄs paÅ”as adreses kodÄ, kurÄ tÄ tika pÄrtraukta.
Ja turpinÄsiet izpildÄ«t kodu, terminÄļos, kas savienoti ar virtuÄlajiem COM portiem, redzÄsit Å”Ädas rindas:
āStÄvokļa apieÅ”anasā lÄ«nijas klÄtbÅ«tne norÄda, ka virtuÄlais Bluetooth modulis ir pÄrslÄdzies uz datu saÅemÅ”anas režīmu no lietotÄja COM porta.
Tagad Bluetooth terminÄlÄ« (COM29 attÄlÄ) varat ievadÄ«t komandas saskaÅÄ ar Rhino protokolu. PiemÄram, komanda āMEOWā atgriezÄ«s virkni āmur-murā Bluetooth terminÄlÄ«:
AtdarinÄt mani ne pilnÄ«bÄ
Veidojot emulatoru, var izvÄlÄties konkrÄtas ierÄ«ces detalizÄcijas/emulÄcijas lÄ«meni. PiemÄram, Bluetooth moduli var emulÄt dažÄdos veidos:
- ierÄ«ce ir pilnÄ«bÄ emulÄta ar pilnu komandu komplektu;
- AT komandas tiek emulÄtas, un datu plÅ«sma tiek saÅemta no galvenÄs sistÄmas COM porta;
- virtuÄlÄ ierÄ«ce nodroÅ”ina pilnÄ«gu datu novirzÄ«Å”anu uz reÄlo ierÄ«ci;
- kÄ vienkÄrÅ”s stubs, kas vienmÄr atgriež "OK".
PaÅ”reizÄjÄ emulatora versijÄ tiek izmantota otrÄ pieeja - virtuÄlais Bluetooth modulis veic konfigurÄciju, pÄc kura tas pÄrslÄdzas uz datu āstarpniekserverÄÅ”anasā režīmu no galvenÄs sistÄmas COM porta uz emulatora UART portu.
ApsvÄrsim koda vienkÄrÅ”as instrumentÄÅ”anas iespÄju gadÄ«jumÄ, ja kÄda perifÄrijas daļa netiek realizÄta. PiemÄram, ja nav izveidots taimeris, kas atbild par datu pÄrsÅ«tÄ«Å”anas kontroli uz DMA (pÄrbaude tiek veikta funkcijÄ ws2812b_waitAtrodas 0x08006840
), programmaparatÅ«ra vienmÄr gaidÄ«s karoga atiestatÄ«Å”anu aizÅemtsAtrodas 0x200004C4
kas parÄda DMA datu lÄ«nijas noslogojumu:
MÄs varam apiet Å”o situÄciju, manuÄli atiestatot karogu aizÅemts uzreiz pÄc tÄ instalÄÅ”anas. ProgrammÄ IDA Pro varat izveidot Python funkciju un izsaukt to pÄrtraukuma punktÄ un ievietot paÅ”u pÄrtraukuma punktu kodÄ pÄc vÄrtÄ«bas 1 ierakstÄ«Å”anas karogÄ aizÅemts.
PÄrtraukuma punktu apstrÄdÄtÄjs
Vispirms izveidosim Python funkciju IDA. IzvÄlne Fails ā skripta komanda...
KreisajÄ pusÄ esoÅ”ajÄ sarakstÄ pievienojiet jaunu fragmentu, pieŔķiriet tam nosaukumu (piemÄram, BPT),
Teksta laukÄ labajÄ pusÄ ievadiet funkcijas kodu:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
PÄc tam nospiežam skrÄjiens un aizveriet skripta logu.
Tagad pÄriesim pie koda plkst 0x0800688A
, iestatiet pÄrtraukuma punktu (taustiÅÅ” F2), rediÄ£Äjiet to (konteksta izvÄlne RediÄ£Ät pÄrtraukuma punktu...), neaizmirstiet iestatÄ«t skripta veidu uz Python:
Ja paÅ”reizÄjÄ karoga vÄrtÄ«ba aizÅemts ir vienÄds ar 1, tad jums ir jÄizpilda funkcija skip_dma skripta rindÄ:
Ja palaižat programmaparatÅ«ru izpildei, pÄrtraukuma punkta apdarinÄtÄja koda aktivizÄÅ”anu var redzÄt IDA logÄ izvade pÄc lÄ«nijas Skipping wait ws2812...
. Tagad programmaparatÅ«ra negaidÄ«s karoga atiestatÄ«Å”anu aizÅemts.
Mijiedarbība ar emulatoru
EmulÄcija emulÄcijas labad, visticamÄk, neradÄ«s sajÅ«smu un prieku. Daudz interesantÄk ir, ja emulators palÄ«dz pÄtniekam redzÄt atmiÅÄ esoÅ”os datus vai izveidot pavedienu mijiedarbÄ«bu.
MÄs parÄdÄ«sim, kÄ dinamiski izveidot mijiedarbÄ«bu starp RTOS uzdevumiem. Vispirms jums vajadzÄtu apturÄt koda izpildi, ja tas darbojas. Ja dodaties uz funkciju bluetooth_task_entry uz komandas āLEDā apstrÄdes filiÄli (adrese 0x080057B8
), tad varat redzÄt, kas vispirms tiek izveidots un pÄc tam nosÅ«tÄ«ts uz sistÄmas rindu ledControlQueueHandle kÄda ziÅa.
Lai piekļūtu mainÄ«gajam, ir jÄiestata pÄrtraukuma punkts ledControlQueueHandleAtrodas 0x20000624
un turpiniet izpildīt kodu:
RezultÄtÄ apstÄÅ”anÄs vispirms notiks adresÄ 0x080057CA
pirms funkcijas izsaukÅ”anas osMailAlloc, pÄc tam uz adresi 0x08005806
pirms funkcijas izsaukÅ”anas osMailPut, tad pÄc kÄda laika - uz adresi 0x08005BD4
(pirms funkcijas izsaukÅ”anas osMailGet), kas pieder funkcijai leds_task_entry (LED uzdevums), tas ir, uzdevumi tika pÄrslÄgti, un tagad LED uzdevums saÅÄma kontroli.
Å ÄdÄ vienkÄrÅ”Ä veidÄ varat noteikt, kÄ RTOS uzdevumi mijiedarbojas viens ar otru.
Protams, patiesÄ«bÄ uzdevumu mijiedarbÄ«ba var bÅ«t sarežģītÄka, taÄu, izmantojot emulatoru, Ŕīs mijiedarbÄ«bas izsekoÅ”ana kļūst mazÄk darbietilpÄ«ga.
Palaidiet ar Radare2
JÅ«s nevarat ignorÄt tik universÄlu rÄ«ku kÄ Radare2.
Lai izveidotu savienojumu ar emulatoru, izmantojot r2, komanda izskatÄ«sies Å”Ädi:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf
PalaiŔana ir pieejama tagad (dc
) un pauzÄjiet izpildi (Ctrl+C).
DiemžÄl Å”obrÄ«d r2 ir problÄmas darbÄ ar aparatÅ«ras gdb serveri un atmiÅas izkÄrtojumu, tÄpÄc pÄrtraukuma punkti un soļi nedarbojas (komanda ds
). MÄs ceram, ka tas drÄ«z tiks novÄrsts.
SkrieŔana ar Eclipse
Viena no emulatora izmantoÅ”anas iespÄjÄm ir izstrÄdÄtÄs ierÄ«ces programmaparatÅ«ras atkļūdoÅ”ana. SkaidrÄ«bas labad mÄs izmantosim arÄ« Rhino programmaparatÅ«ru. Varat lejupielÄdÄt programmaparatÅ«ras avotus
MÄs izmantosim Eclipse no komplekta kÄ IDE
Lai emulators varÄtu ielÄdÄt programmaparatÅ«ru, kas tieÅ”i kompilÄta Eclipse, jums jÄpievieno parametrs firmware=null
uz emulatora palaiŔanas komandu:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
AtkļūdoÅ”anas konfigurÄcijas iestatÄ«Å”ana
ProgrammÄ Eclipse atlasiet izvÄlni Palaist ā atkļūdot konfigurÄcijas... AtvÄrtajÄ logÄ sadaÄ¼Ä GDB aparatÅ«ras atkļūdoÅ”ana jums jÄpievieno jauna konfigurÄcija, pÄc tam cilnÄ āGalvenÄā norÄdiet paÅ”reizÄjo projektu un atkļūdoÅ”anas lietojumprogrammu:
CilnÄ āAtkļūdotÄjsā jÄnorÄda komanda GDB:
${openstm32_compiler_path}arm-none-eabi-gdb
Un arī ievadiet parametrus savienojuma izveidei ar GDB serveri (resursdators un ports):
CilnÄ āStartÄÅ”anaā ir jÄnorÄda Å”Ädi parametri:
- iespÄjot izvÄles rÅ«tiÅu IelÄdÄt attÄlu (lai samontÄtais programmaparatÅ«ras attÄls tiktu ielÄdÄts emulatorÄ);
- iespÄjot izvÄles rÅ«tiÅu IelÄdÄt simbolus;
- pievienot palaiŔanas komandu:
set $pc = *0x08000004
(iestatiet datora reÄ£istrÄ vÄrtÄ«bu no atmiÅas adresÄ0x08000004
- tur tiek saglabÄta adrese ResetHandler).
ŠŠ±ŃŠ°ŃŠøŃŠµ Š²Š½ŠøŠ¼Š°Š½ŠøŠµ, ja nevÄlaties lejupielÄdÄt programmaparatÅ«ras failu no Eclipse, tad opcijas IelÄdÄt attÄlu Šø Palaist komandas nav jÄnorÄda.
PÄc noklikŔķinÄÅ”anas uz Atkļūdot varat strÄdÄt atkļūdotÄja režīmÄ:
- soli pa solim koda izpilde
- mijiedarbÄ«ba ar pÄrtraukuma punktiem
PiezÄ«me. Eclipse ir, hmm... daži dÄ«vainÄ«bas... un ar tÄm ir jÄsadzÄ«vo. PiemÄram, ja, startÄjot atkļūdotÄju, tiek parÄdÄ«ts ziÅojums āUz ā0x0ā³ nav pieejams avotsā, izpildiet komandu Step (F5).
TÄ vietÄ, lai noslÄgtu
VietÄjÄ koda emulÄÅ”ana ir ļoti interesanta lieta. IerÄ«ces izstrÄdÄtÄjam kļūst iespÄjams atkļūdot programmaparatÅ«ru bez Ä«stas ierÄ«ces. PÄtniekam tÄ ir iespÄja veikt dinamisku koda analÄ«zi, kas ne vienmÄr ir iespÄjama pat ar ierÄ«ci.
MÄs vÄlamies nodroÅ”inÄt speciÄlistus ar rÄ«ku, kas ir Ärts, vidÄji vienkÄrÅ”s un neprasa daudz pūļu un laika, lai to iestatÄ«tu un palaistu.
Rakstiet komentÄros par savu pieredzi, izmantojot aparatÅ«ras emulatorus. AicinÄm diskutÄt un labprÄt atbildÄsim uz jautÄjumiem.
AptaujÄ var piedalÄ«ties tikai reÄ£istrÄti lietotÄji.
Kam jūs izmantojat emulatoru?
-
Es izstrÄdÄju (atkļūdoju) programmaparatÅ«ru
-
Es pÄtÄ«ju programmaparatÅ«ru
-
Es palaistu spÄles (Dendi, Sega, PSP)
-
kaut kas cits (raksti komentÄros)
Nobalsoja 7 lietotÄji. 2 lietotÄji atturÄjÄs.
KÄdu programmatÅ«ru jÅ«s izmantojat, lai atdarinÄtu vietÄjo kodu?
-
QEMU
-
Unicorn dzinÄjs
-
Proteus
-
kaut kas cits (raksti komentÄros)
Nobalsoja 6 lietotÄji. 2 lietotÄji atturÄjÄs.
Ko jÅ«s vÄlÄtos uzlabot izmantotajÄ emulatorÄ?
-
Es gribu Ätrumu
-
Es vÄlos vienkÄrÅ”Äku iestatÄ«Å”anu/palaiÅ”anu
-
Es vÄlos vairÄk iespÄju mijiedarboties ar emulatoru (API, ÄÄ·i)
-
Esmu apmierinÄts ar visu
-
kaut kas cits (raksti komentÄros)
Nobalsoja 8 lietotÄji. 1 lietotÄjs atturÄjÄs.
Avots: www.habr.com