Ma ke ʻano o ka hālāwai 0x0A DC7831
Ma kēia ʻatikala e wehewehe mākou i ka holo ʻana o ka polokalamu firmware i ka emulator, hōʻike i ka pilina me ka debugger, a hana i kahi loiloi liʻiliʻi o ka firmware.
prehistory
He wā lōʻihi i hala ma kahi galaxy mamao loa
ʻElua mau makahiki i hala aku nei i loko o kā mākou hale hana pono e noiʻi i ka firmware o kahi hāmeʻa. Hoʻopili ʻia ka firmware a wehe ʻia me kahi bootloader. Ua hana ʻo ia i kēia ma kahi ala paʻakikī, hoʻololi i ka ʻikepili i ka hoʻomanaʻo i nā manawa he nui. A ʻo ka firmware ponoʻī i hui pū me nā peripheral. A ʻo kēia mau mea āpau ma ka MIPS core.
No nā kumu kumu, ʻaʻole kūpono nā emulators i loaʻa iā mākou, akā makemake mākou e holo i ke code. A laila ua hoʻoholo mākou e hana i kā mākou emulator ponoʻī, e hana i ka mea liʻiliʻi a ʻae iā mākou e wehe i ka firmware nui. Ua ho'āʻo mākou a ua hana. Ua manaʻo mākou, inā mākou e hoʻohui i nā peripheral e hana pū i ka firmware nui. ʻAʻole i ʻeha loa - a ua hana pū kekahi. Noʻonoʻo hou mākou a hoʻoholo e hana i kahi emulator piha.
ʻO ka hopena he emulator ʻōnaehana kamepiula
No ke aha ʻo Kopycat?
He pāʻani ma nā huaʻōlelo.
- kope kope (English, noun [ˈkɒpɪkæt]) - mea hoʻohālike, hoʻohālike
- popoki (English, noun [ˈkæt]) - pōpoki, pōpoki - ka holoholona punahele a kekahi o nā mea nāna i hana i ka papahana.
- ʻO ka leka "K" mai ka ʻōlelo papahana Kotlin
kope kope
I ka hana ʻana i ka emulator, ua hoʻonohonoho ʻia nā pahuhopu kikoʻī:
- ka hiki ke hana wikiwiki i nā peripheral hou, nā modules, nā cores processor;
- ka hiki ke hōʻuluʻulu i kahi mea virtual mai nā modula like ʻole;
- ka hiki ke hoʻouka i kekahi ʻikepili binary (firmware) i loko o ka hoʻomanaʻo ʻana o kahi hāmeʻa virtual;
- hiki ke hana me nā kiʻi paʻi kiʻi (nā kiʻi o ke kūlana ʻōnaehana);
- ka hiki ke launa pū me ka emulator ma o ka debugger i kūkulu ʻia;
- maikaʻi ka ʻōlelo hou no ka hoʻomohala ʻana.
ʻO ka hopena, ua koho ʻia ʻo Kotlin no ka hoʻokō ʻana, ka hale kaʻa kaʻa (ʻo ia ka manawa e kamaʻilio pū ai nā modules me kekahi ma o nā kaʻa ʻikepili virtual), ʻo JSON ke ʻano wehewehe wehewehe ʻana, a me GDB RSP ma ke ʻano he protocol no ka launa pū me ka debugger.
Ke hoʻomau nei ka hoʻomohala ʻana ma mua o ʻelua makahiki a ke hoʻomau nei. I loko o kēia manawa, ua hoʻokō ʻia nā cores MIPS, x86, V850ES, ARM, a me PowerPC.
Ke ulu nei ka papahana a ʻo ka manawa kēia e hōʻike aku ai i ka lehulehu. E hana mākou i kahi wehewehe kikoʻī o ka papahana ma hope, akā i kēia manawa e kālele mākou i ka hoʻohana ʻana iā Kopycat.
No ka poʻe hoʻomanawanui, hiki ke hoʻoiho ʻia kahi mana hoʻolaha o ka emulator mai
Rhino i ka emulator
E hoʻomanaʻo kākou i ka wā ma mua no ka hālāwai SMARTRHINO-2018, ua hana ʻia kahi mea hoʻāʻo "Rhinoceros" no ke aʻo ʻana i nā mākau ʻenekinia hoʻohuli. Ua wehewehe ʻia ke kaʻina hana o ka loiloi firmware static ma
I kēia manawa e ho'āʻo mākou e hoʻohui i nā "mea ʻōlelo" a holo i ka firmware i ka emulator.
E pono kāua:
1) Java 1.8
2) Python a me ka module
No ka Windows:
1)
2)
No Linux:
1) socat
Hiki iā ʻoe ke hoʻohana iā Eclipse, IDA Pro a i ʻole radare2 ma ke ʻano he mea kūʻai aku GDB.
Pehea ia hana?
I mea e hoʻokō ai i ka firmware i ka emulator, pono e "hui" i kahi polokalamu virtual, kahi mea hoʻohālikelike o kahi mea maoli.
Hiki ke hōʻike ʻia ka hāmeʻa maoli (“rhino”) ma ke kiʻikuhi poloka:
He ʻano modular ka emulator a hiki ke wehewehe ʻia ka hāmeʻa virtual hope ma kahi faila JSON.
JSON 105 laina
{
"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"]
]
}
E hoʻolohe i ka ʻāpana lako polokalamu paʻa ma ka ʻāpana params ʻo ia ka inoa o kahi faila i hiki ke hoʻouka ʻia i loko o kahi mea uila e like me firmware.
Hiki ke hōʻike ʻia ka ʻōnaehana virtual a me kāna pilina me ka ʻōnaehana hana nui e ke kiʻi aʻe:
ʻO ka hoʻāʻo ʻana i kēia manawa o ka emulator e pili ana i ka pilina me nā awa COM o ka OS nui (debug UART a me UART no ka module Bluetooth). Hiki i kēia ke lilo i mau awa maoli e pili ana i nā polokalamu a i ʻole nā awa COM virtual (no kēia pono ʻoe com0com/socat).
Aia i kēia manawa ʻelua mau ala nui e launa pū me ka emulator mai waho.
- ʻO ka protocol GDB RSP (e like me nā mea hana e kākoʻo ana i kēia protocol ʻo Eclipse / IDA / radare2);
- laina kauoha emulator kūloko (Argparse a i ʻole Python).
Nā awa COM maʻamau
I mea e launa pū ai me ka UART o kahi mea virtual ma ka mīkini kūloko ma o kahi pahu, pono ʻoe e hana i ʻelua mau awa COM virtual pili. I kā mākou hihia, hoʻohana ʻia kahi awa e ka emulator, a ʻo ka lua e kahi papahana terminal (PuTTY a i ʻole ka pale):
Ke hoʻohana nei i ka com0com
Hoʻonohonoho ʻia nā awa COM virtual me ka hoʻohana ʻana i ka pono hoʻonohonoho mai ka com0com kit (console version - C: Nā Kōnae Papahana (x86)com0comsetupс.exe, a i ʻole ka mana GUI - C: Nā Kōnae Papahana (x86)com0comsetupg.exe):
E nānā i nā pahu hiki ke hoʻokuʻu ʻia no nā awa kūwaho i hana ʻia, inā ʻaʻole e kali ka emulator i ka pane mai ke awa COM.
Ke hoʻohana nei i ka socat
Ma nā ʻōnaehana UNIX, hana ʻia nā awa COM virtual e ka emulator me ka hoʻohana ʻana i ka pono socat e hana i kēia, e kuhikuhi wale i ka prefix ma ka inoa port i ka wā e hoʻomaka ai ka emulator socat:
.
Ke kikowaena laina kauoha kūloko (Argparse a i ʻole Python)
ʻOiai ʻo Kopycat kahi noi console, hāʻawi ka emulator i ʻelua mau koho laina kauoha no ka launa pū ʻana me kāna mau mea a me nā ʻano hoʻololi: Argparse a me Python.
ʻO Argparse kahi CLI i kūkulu ʻia i loko o Kopycat a loaʻa mau i nā mea āpau.
ʻO kahi CLI ʻē aʻe ka unuhi ʻōlelo Python. No ka hoʻohana ʻana, pono ʻoe e hoʻokomo i ka module Jep Python a hoʻonohonoho i ka emulator e hana me Python (e hoʻohana ʻia ka unuhi unuhi Python i hoʻokomo ʻia ma ka ʻōnaehana nui o ka mea hoʻohana).
Ke kau nei i ka module Python Jep
Ma lalo o Linux hiki ke hoʻokomo ʻia ʻo Jep ma o ka pip:
pip install jep
No ka hoʻouka ʻana iā Jep ma Windows, pono ʻoe e hoʻokomo i ka Windows SDK a me ka Microsoft Visual Studio e pili ana. Ua maʻalahi mākou iā ʻoe a
pip install jep-3.8.2-cp27-cp27m-win_amd64.whl
No ka nānā ʻana i ka hoʻokomo ʻana o Jep, pono ʻoe e holo ma ka laina kauoha:
python -c "import jep"
Pono e loaʻa kēia memo ma ka pane:
ImportError: Jep is not supported in standalone Python, it must be embedded in Java.
Ma ka waihona emulator batch no kāu ʻōnaehana (copycat.bat - no Windows, kope kope - no Linux) i ka papa inoa o nā palena DEFAULT_JVM_OPTS
hoʻohui i kahi ʻāpana Djava.library.path
- pono e komo ke ala i ka module Jep i hoʻokomo ʻia.
ʻO ka hopena no Windows he laina e like me kēia:
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"
Hoʻolaha ʻia ʻo Kopycat
ʻO ka emulator kahi noi JVM console. Lawe ʻia ka hoʻokuʻu ʻana ma o ka palapala kauoha laina kauoha (sh/cmd).
Kauoha e holo ma lalo o Windows:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28
Kauoha e holo ma lalo o Linux me ka hoʻohana ʻana i ka pono 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
— Ua wehe ʻia ke awa TCP no ke komo ʻana i ke kikowaena GDB;-n rhino
- inoa o ka ʻōnaehana ʻōnaehana nui (mea hui pū ʻia);-l user
- inoa o ka waihona e ʻimi ai i ka module nui;-y library
- ala e ʻimi ai i nā modula i hoʻokomo ʻia i loko o ka hāmeʻa;firmwarerhino_pass.bin
- ala i ka faila firmware;- ʻO COM26 a me COM28 nā awa COM virtual.
ʻO ka hopena, e hōʻike ʻia kahi ʻōkuhi Python >
(ai ole 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 >
Ka launa pū me IDA Pro
No ka maʻalahi o ka hoʻāʻo ʻana, hoʻohana mākou i ka firmware Rhino ma ke ʻano he waihona kumu no ka nānā ʻana ma IDA ma ke ʻano
Hiki iā ʻoe ke hoʻohana i ka firmware nui me ka ʻole o ka ʻike meta.
Ma hope o ka hoʻokuʻu ʻana iā Kopycat ma IDA Pro, ma ka papa Debugger e hele i ka mea "E hoʻololi i ka debugger…"a koho"Hoʻopau GDB mamao". A laila, hoʻonohonoho i ka pilina: menu Debugger - Nā koho hana…
E hoʻonoho i nā waiwai:
- Noi - kekahi waiwai
- Hostname: 127.0.0.1 (a i ʻole ka IP address o ka mīkini mamao kahi e holo ai ʻo Kopycat)
- Wahi: 23946
I kēia manawa ua loaʻa ka pihi debugging (Kī F9):
Kaomi iā ia e hoʻohui i ka module debugger i ka emulator. Hele ʻo IDA i ke ʻano debugging, loaʻa nā puka makani hou: ʻike e pili ana i nā papa inoa, e pili ana i ka waihona.
I kēia manawa hiki iā mākou ke hoʻohana i nā hiʻohiʻona maʻamau o ka debugger:
- ka hoʻokō ʻana i nā ʻōlelo kuhikuhi (E komo i loko и ʻEneʻe ma luna - nā kī F7 a me F8, kēlā me kēia);
- hoʻomaka a hoʻomaha i ka hana;
- ka hana ʻana i nā haʻihaʻi no nā code a me nā ʻikepili (F2 kī).
ʻO ka hoʻohui ʻana i kahi debugger ʻaʻole ia e holo i ka code firmware. ʻO ke kūlana hoʻokō o kēia manawa ka helu wahi 0x08006A74
- hoʻomaka o ka hana Reset_Handler. Inā ʻoe e kaomi i lalo i ka papa inoa, hiki iā ʻoe ke ʻike i ke kelepona hana ka papa kuhikuhiE. Hiki iā ʻoe ke kau i ka cursor ma kēia laina (address 0x08006ABE
) a hana i ka hana Holo a hiki i ka piko (ki F4).
A laila, hiki iā ʻoe ke kaomi F7 e komo i ka hana ka papa kuhikuhiE.
Esli vypolnit kauoha E hoʻomau i ka hana (Kī F9), a laila e ʻike ʻia ka pukaaniani "E ʻoluʻolu e kali" me kahi pihi hoʻokahi Hoʻomaha:
Ke paʻi ʻoe Hoʻomaha Hoʻokuʻu ʻia ka hoʻokō ʻana i ka code firmware a hiki ke hoʻomau ʻia mai ka helu like i loko o ke code kahi i hoʻopau ʻia ai.
Inā hoʻomau ʻoe i ka hoʻokō ʻana i ke code, e ʻike ʻoe i nā laina aʻe i loko o nā hopena i pili i nā awa COM virtual:
ʻO ka loaʻa ʻana o ka laina "state bypass" e hōʻike ana ua hoʻololi ka module Bluetooth virtual i ke ʻano o ka loaʻa ʻana o ka ʻikepili mai ke awa COM o ka mea hoʻohana.
I kēia manawa ma ka pahu Bluetooth (COM29 ma ke kiʻi) hiki iā ʻoe ke hoʻokomo i nā kauoha e like me ka protocol Rhino. No ka laʻana, e hoʻihoʻi ke kauoha "MEOW" i ke kaula "mur-mur" i ka pahu Bluetooth:
Mai hoohalike mai ia'u
I ke kūkulu ʻana i kahi emulator, hiki iā ʻoe ke koho i ke kiʻekiʻe o ka kikoʻī / emulation o kahi mea hana. No ka laʻana, hiki ke hoʻohālikelike ʻia ka module Bluetooth ma nā ʻano like ʻole:
- ua hoʻopili piha ʻia ka hāmeʻa me kahi pūʻulu o nā kauoha;
- Hoʻopili ʻia nā kauoha AT, a loaʻa ke kahawai data mai ke awa COM o ka ʻōnaehana nui;
- Hāʻawi ka mea virtual i ka hoʻihoʻi ʻana i ka ʻikepili piha i ka hāmeʻa maoli;
- ma ke ʻano he stub maʻalahi e hoʻihoʻi mau ana "OK".
Ke hoʻohana nei ka mana o kēia manawa o ka emulator i ke ala ʻelua - ke hana nei ka module Bluetooth virtual i ka hoʻonohonoho ʻana, a laila hoʻololi ʻo ia i ke ʻano o ka "proxying" data mai ke awa COM o ka ʻōnaehana nui i ke awa UART o ka emulator.
E noʻonoʻo kākou i ka hiki ke hana maʻalahi o ke code inā ʻaʻole i hoʻokō ʻia kekahi ʻāpana o ka periphery. No ka laʻana, inā ʻaʻole i hoʻokumu ʻia kahi manawa no ka hoʻokele ʻana i ka hoʻoili ʻana i ka ʻikepili i DMA (e hana ʻia ka nānā ma ka hana ws2812b_kaliaia ma 0x08006840
), a laila e kali mau ka firmware no ka hoʻihoʻi ʻana o ka hae 'ō iaia ma 0x200004C4
e hōʻike ana i ka noho ʻana o ka laina data DMA:
Hiki iā mākou ke hoʻopuni i kēia kūlana ma ka hoʻihoʻi lima ʻana i ka hae 'ō i ma hope koke o ke kau ʻana. Ma ka IDA Pro, hiki iā ʻoe ke hana i kahi hana Python a kāhea iā ia i kahi breakpoint, a kau i ka breakpoint iā ia iho i ke code ma hope o ke kākau ʻana i ka waiwai 1 i ka hae. 'ō i.
Mea hoʻopaʻa hoʻomaha
ʻO ka mea mua, e hana mākou i kahi hana Python ma IDA. Menu Kōnae - Kānāwai palapala...
E hoʻohui i kahi snippet hou i ka papa inoa ma ka hema, e hāʻawi iā ia i inoa (no ka laʻana, Kā Hoʻokō),
Ma ke kahua kikokikona ma ka ʻākau, e hoʻokomo i ke code hana:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
Ma hope o kēlā, kaomi holo a pani i ka puka aniani.
I kēia manawa e hele kāua i ke code ma 0x0800688A
, hoʻonoho i kahi haʻihaʻi (F2 kī), hoʻoponopono iā ia (context menu Hoʻoponopono i kahi haʻihaʻi...), mai poina e hoʻonoho i ke ʻano palapala iā Python:
Inā ka waiwai hae o kēia manawa 'ō i like 1, a laila pono ʻoe e hoʻokō i ka hana skip_dma ma ka laina palapala:
Inā holo ʻoe i ka firmware no ka hoʻokō ʻana, hiki iā ʻoe ke ʻike i ka hoʻomaka ʻana o ke code handler breakpoint ma ka pukaaniani IDA. ia auoiaea ma ka laina Skipping wait ws2812...
. I kēia manawa ʻaʻole e kali ka firmware no ka hoʻihoʻi ʻana o ka hae 'ō i.
Ka launa pū me ka emulator
ʻAʻole hiki ke hoʻohauʻoli a me ka hauʻoli ka hoʻohālike no ka hoʻohālike. ʻOi aku ka hoihoi inā kōkua ka emulator i ka mea noiʻi e ʻike i ka ʻikepili i ka hoʻomanaʻo a i ʻole e hoʻokumu i ka pilina o nā kaula.
E hōʻike mākou iā ʻoe pehea e hoʻokumu ikaika ai i ka pilina ma waena o nā hana RTOS. Pono ʻoe e hoʻomaha mua i ka hoʻokō ʻana o ke code inā e holo ana. Inā hele ʻoe i ka hana bluetooth_task_entry i ka lālā hana o ke kauoha "LED" (address 0x080057B8
), a laila hiki iā ʻoe ke ʻike i ka mea i hana mua ʻia a hoʻouna ʻia i ka queue system ledControlQueueHandle kekahi memo.
Pono ʻoe e hoʻonoho i kahi haʻihaʻi no ke komo ʻana i ka loli ledControlQueueHandleaia ma 0x20000624
a hoʻomau i ka hoʻokō ʻana i ke code:
ʻO ka hopena, e kū mua ka hoʻomaha ma ka helu wahi 0x080057CA
ma mua o ke kāhea ʻana i ka hana osMailAlloc, a laila ma ka helu wahi 0x08005806
ma mua o ke kāhea ʻana i ka hana osMailPut, a laila ma hope o kekahi manawa - i ka helu wahi 0x08005BD4
(ma mua o ke kāhea ʻana i ka hana osMailGet), pili i ka hana leds_task_entry (LED-task), ʻo ia hoʻi, ua hoʻololi ʻia nā hana, a i kēia manawa ua loaʻa i ka LED-task ka mana.
Ma kēia ala maʻalahi hiki iā ʻoe ke hoʻokumu i ka pili ʻana o nā hana RTOS me kekahi.
ʻOiaʻiʻo, i ka ʻoiaʻiʻo, hiki ke paʻakikī ka pilina o nā hana, akā me ka hoʻohana ʻana i kahi emulator, ʻoi aku ka liʻiliʻi o ka hana ʻana i kēia pilina.
E hoʻomaka me Radare2
ʻAʻole hiki iā ʻoe ke haʻalele i kahi mea hana honua e like me Radare2.
No ka hoʻopili ʻana i ka emulator me ka hoʻohana ʻana i ka r2, e like ke ʻano o ke kauoha:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf
Loaʻa ka hoʻolaha i kēia manawa (dc
) a hoʻomaha hoʻokō (Ctrl+C).
ʻO ka mea pōʻino, i kēia manawa, loaʻa iā r2 nā pilikia i ka hana ʻana me ka server gdb hardware a me ka hoʻonohonoho hoʻomanaʻo ma muli o kēia, ʻaʻole e hana nā breakpoints a me nā Steps (kauoha ds
). Manaʻolana mākou e hoʻoponopono koke ʻia kēia.
Holo me Eclipse
ʻO kekahi o nā koho no ka hoʻohana ʻana i ka emulator ʻo ia ka debug i ka firmware o ka mea i kūkulu ʻia. No ka akaka, e hoʻohana pū mākou i ka firmware Rhino. Hiki iā ʻoe ke hoʻoiho i nā kumu firmware
E hoʻohana mākou iā Eclipse mai ka hoʻonohonoho ma ke ʻano he IDE
I mea e hoʻouka ai ka emulator i ka firmware i hōʻuluʻulu ʻia ma Eclipse, pono ʻoe e hoʻohui i ka ʻāpana firmware=null
i ke kauoha hoʻomaka emulator:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
Hoʻonohonoho hoʻonohonoho debug
Ma Eclipse, koho i ka papa kuhikuhi Holo - Nā Hoʻonohonoho Debug... Ma ka puka aniani e wehe ana, ma ka ʻāpana ʻO ka Debugging Hardware GDB pono ʻoe e hoʻohui i kahi hoʻonohonoho hou, a laila ma ka pā "Main" e kuhikuhi i ka papahana o kēia manawa a me ka noi no ka debugging:
Ma ka pā "Debugger" pono ʻoe e kuhikuhi i ke kauoha GDB:
${openstm32_compiler_path}arm-none-eabi-gdb
A e hoʻokomo pū i nā ʻāpana no ka hoʻopili ʻana i ka server GDB (host and port):
Ma ka "Startup" tab, pono ʻoe e kuhikuhi i kēia mau ʻāpana:
- hiki i ka pahu koho Hoʻouka kiʻi (i hoʻouka ʻia ke kiʻi firmware i hui ʻia i ka emulator);
- hiki i ka pahu koho Hoʻouka i nā hōʻailona;
- hoʻohui i ke kauoha hoʻomaka:
set $pc = *0x08000004
(e hoʻonoho i ka papa inoa PC i ka waiwai mai ka hoʻomanaʻo ma ka helu wahi0x08000004
- mālama ʻia ka helu wahi ma laila ResetHandler).
E hoʻolohe, inā ʻaʻole ʻoe makemake e hoʻoiho i ka faila firmware mai Eclipse, a laila nā koho Hoʻouka kiʻi и Holo i nā kauoha ʻaʻole pono e hōʻike.
Ma hope o ke kaomi ʻana i ka Debug, hiki iā ʻoe ke hana ma ke ʻano debugger:
- hoʻokō code step by step
- ka launa pū ʻana me nā wahi haʻihaʻi
i hoʻopuka. Loaʻa iā Eclipse, hmm... kekahi mau ʻano ʻano ... a pono ʻoe e noho pū me lākou. No ka laʻana, inā i ka hoʻomaka ʻana i ka debugger ka memo "ʻAʻohe kumu i loaʻa no "0x0″", a laila e hoʻokō i ke kauoha Step (F5)
Ma kahi o ka hopena
He mea hoihoi loa ka hoʻolike ʻana i ke code ʻōiwi. Hiki i kahi mea hoʻomohala ke hoʻopau i ka firmware me ka ʻole o kahi mea maoli. No ka mea noiʻi, he manawa kūpono ia e alakaʻi i ka loiloi code dynamic, ʻaʻole hiki ke hiki i nā manawa a pau me kahi hāmeʻa.
Makemake mākou e hāʻawi i nā loea me kahi mea hana maʻalahi, maʻalahi maʻalahi a ʻaʻole nui ka hoʻoikaika a me ka manawa e hoʻonohonoho a holo.
E kākau i nā manaʻo e pili ana i kāu ʻike me ka hoʻohana ʻana i nā emulators hardware. Ke kono nei mākou iā ʻoe e kūkākūkā a hauʻoli e pane i nā nīnau.
Hiki i nā mea hoʻohana i hoʻopaʻa inoa ʻia ke komo i ka noiʻi.
He aha kāu e hoʻohana ai i ka emulator?
-
Hoʻomohala wau (debug) firmware
-
Ke noiʻi nei au i ka firmware
-
Hoʻomaka wau i nā pāʻani (Dendi, Sega, PSP)
-
kekahi mea ʻē aʻe (kākau ma nā manaʻo)
7 mea hoʻohana i koho. Ua hōʻole nā mea hoʻohana 2.
He aha nā polokalamu āu e hoʻohana ai e hoʻolike i ke code ʻōiwi?
-
QEMU
-
ʻenekini unicorn
-
Proteus
-
kekahi mea ʻē aʻe (kākau ma nā manaʻo)
6 mea hoʻohana i koho. Ua hōʻole nā mea hoʻohana 2.
He aha kāu makemake e hoʻomaikaʻi i ka emulator āu e hoʻohana nei?
-
Makemake au i ka wikiwiki
-
Makemake au i ka maʻalahi o ka hoʻonohonoho ʻana/launch
-
Makemake au i nā koho hou aʻe no ka launa pū ʻana me ka emulator (API, hooks)
-
Hauʻoli wau i nā mea a pau
-
kekahi mea ʻē aʻe (kākau ma nā manaʻo)
8 mea hoʻohana i koho. 1 mea hoʻohana i hōʻole.
Source: www.habr.com