Fel rhan o'r cyfarfod 0x0A DC7831
Yn yr erthygl hon byddwn yn disgrifio sut i redeg cadarnwedd y ddyfais yn yr efelychydd, dangos rhyngweithio â'r dadfygiwr, a pherfformio dadansoddiad deinamig byr o'r firmware.
cynhanes
Amser maith yn ôl mewn galaeth bell bell i ffwrdd
Ychydig flynyddoedd yn ôl yn ein labordy roedd angen ymchwilio i gadarnwedd dyfais. Roedd y firmware wedi'i gywasgu a'i ddadbacio â bootloader. Gwnaeth hyn mewn ffordd gymhleth iawn, gan symud y data yn y cof sawl gwaith. Ac yna roedd y firmware ei hun yn rhyngweithio'n weithredol â'r perifferolion. A hyn i gyd ar graidd MIPS.
Am resymau gwrthrychol, nid oedd yr efelychwyr sydd ar gael yn addas i ni, ond roeddem yn dal eisiau rhedeg y cod. Yna fe benderfynon ni wneud ein efelychydd ein hunain, a fyddai'n gwneud y lleiafswm ac yn caniatáu inni ddadbacio'r prif firmware. Fe wnaethon ni roi cynnig arno ac fe weithiodd. Roeddem yn meddwl, beth os ydym yn ychwanegu perifferolion i hefyd gyflawni'r prif firmware. Wnaeth o ddim brifo llawer - ac fe weithiodd allan hefyd. Fe wnaethon ni feddwl eto a phenderfynu gwneud efelychydd llawn.
Y canlyniad oedd efelychydd systemau cyfrifiadurol
Pam Kopycat?
Mae drama ar eiriau.
- efelychu (Saesneg, enw [ˈkɒpɪkæt]) - imitator, imitator
- cat (Saesneg, enw [ˈkæt]) - cath, cath - hoff anifail un o grewyr y prosiect
- Daw'r llythyren “K” o iaith raglennu Kotlin
Copryn
Wrth greu'r efelychydd, gosodwyd nodau penodol iawn:
- y gallu i greu perifferolion, modiwlau, creiddiau prosesydd newydd yn gyflym;
- y gallu i gydosod dyfais rithwir o fodiwlau amrywiol;
- y gallu i lwytho unrhyw ddata deuaidd (cadarnwedd) i gof dyfais rithwir;
- y gallu i weithio gyda chipluniau (cipluniau o gyflwr y system);
- y gallu i ryngweithio â'r efelychydd trwy'r dadfygiwr adeiledig;
- iaith fodern braf i'w datblygu.
O ganlyniad, dewiswyd Kotlin i'w weithredu, pensaernïaeth y bysiau (dyma pan fydd modiwlau'n cyfathrebu â'i gilydd trwy fysiau data rhithwir), JSON fel fformat disgrifiad y ddyfais, a GDB RSP fel y protocol ar gyfer rhyngweithio â'r dadfygiwr.
Mae datblygiad wedi bod yn mynd rhagddo ers ychydig dros ddwy flynedd ac mae'n mynd rhagddo. Yn ystod yr amser hwn, gweithredwyd creiddiau prosesydd MIPS, x86, V850ES, ARM, a PowerPC.
Mae'r prosiect yn tyfu ac mae'n bryd ei gyflwyno i'r cyhoedd ehangach. Byddwn yn gwneud disgrifiad manwl o'r prosiect yn ddiweddarach, ond am y tro byddwn yn canolbwyntio ar ddefnyddio Kopycat.
Ar gyfer y rhai mwyaf diamynedd, gellir lawrlwytho fersiwn promo o'r efelychydd o
Rhino yn yr efelychydd
Gadewch inni gofio, yn gynharach ar gyfer cynhadledd SMARTRHINO-2018, fod dyfais brawf “Rhinoceros” wedi'i chreu ar gyfer addysgu sgiliau peirianneg gwrthdro. Disgrifiwyd y broses o ddadansoddi cadarnwedd statig yn
Nawr, gadewch i ni geisio ychwanegu "siaradwyr" a rhedeg y firmware yn yr efelychydd.
Bydd angen:
1) Java 1.8
2) Python a modiwl
Ar gyfer Windows:
1)
2)
Ar gyfer Linux:
1) socat
Gallwch ddefnyddio Eclipse, IDA Pro neu radare2 fel cleient GDB.
Sut mae'n gweithio?
Er mwyn perfformio firmware yn yr efelychydd, mae angen "cydosod" dyfais rithwir, sef analog o ddyfais go iawn.
Gellir dangos y ddyfais go iawn (“rhino”) yn y diagram bloc:
Mae gan yr efelychydd strwythur modiwlaidd a gellir disgrifio'r ddyfais rithwir derfynol mewn ffeil JSON.
JSON 105 o linellau
{
"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"]
]
}
Rhowch sylw i'r paramedr firmware adran paramau yw enw'r ffeil y gellir ei llwytho i mewn i'r ddyfais rithwir fel firmware.
Gellir cynrychioli'r ddyfais rithwir a'i rhyngweithiad â'r brif system weithredu gan y diagram canlynol:
Mae enghraifft prawf cyfredol yr efelychydd yn cynnwys rhyngweithio â phorthladdoedd COM y prif OS (debug UART ac UART ar gyfer y modiwl Bluetooth). Gall y rhain fod yn borthladdoedd go iawn y mae dyfeisiau wedi'u cysylltu â nhw neu'n borthladdoedd COM rhithwir (ar gyfer hyn y cyfan sydd ei angen arnoch chi com0com/socat).
Ar hyn o bryd mae dwy brif ffordd o ryngweithio â'r efelychydd o'r tu allan:
- Protocol GDB RSP (yn unol â hynny, yr offer sy'n cefnogi'r protocol hwn yw Eclipse / IDA / radare2);
- llinell orchymyn efelychydd mewnol (Argparse neu Python).
porthladdoedd COM rhithwir
Er mwyn rhyngweithio â UART dyfais rithwir ar y peiriant lleol trwy derfynell, mae angen i chi greu pâr o borthladdoedd COM rhithwir cysylltiedig. Yn ein hachos ni, mae un porthladd yn cael ei ddefnyddio gan yr efelychydd, a'r ail gan raglen derfynell (PuTTY neu sgrin):
Gan ddefnyddio com0com
Mae porthladdoedd COM rhithwir wedi'u ffurfweddu gan ddefnyddio'r cyfleustodau gosod o'r pecyn com0com (fersiwn consol - C: Ffeiliau Rhaglen (x86) com0comsetupс.exe, neu fersiwn GUI - C: Ffeiliau Rhaglen (x86) com0comsetupg.exe):
Gwiriwch y blychau galluogi gor-redeg byffer ar gyfer pob porthladd rhithwir a grëwyd, fel arall bydd yr efelychydd yn aros am ymateb gan y porthladd COM.
Defnyddio socat
Ar systemau UNIX, mae pyrth COM rhithwir yn cael eu creu yn awtomatig gan yr efelychydd gan ddefnyddio'r cyfleustodau socat; i wneud hyn, nodwch y rhagddodiad yn enw'r porthladd wrth gychwyn yr efelychydd socat:
.
Rhyngwyneb llinell orchymyn mewnol (Argparse neu Python)
Gan fod Kopycat yn gymhwysiad consol, mae'r efelychydd yn darparu dau opsiwn rhyngwyneb llinell orchymyn ar gyfer rhyngweithio â'i wrthrychau a'i newidynnau: Argparse a Python.
Mae Argparse yn CLI sydd wedi'i ymgorffori yn Kopycat ac mae bob amser ar gael i bawb.
CLI amgen yw cyfieithydd Python. Er mwyn ei ddefnyddio, mae angen i chi osod y modiwl Jep Python a ffurfweddu'r efelychydd i weithio gyda Python (bydd y cyfieithydd Python sydd wedi'i osod ar brif system y defnyddiwr yn cael ei ddefnyddio).
Gosod y modiwl Python Jep
O dan Linux Jep gellir ei osod trwy pip:
pip install jep
I osod Jep ar Windows, yn gyntaf rhaid i chi osod y Windows SDK a'r Microsoft Visual Studio cyfatebol. Rydym wedi ei gwneud ychydig yn haws i chi a
pip install jep-3.8.2-cp27-cp27m-win_amd64.whl
I wirio gosod Jep, mae angen i chi redeg ar y llinell orchymyn:
python -c "import jep"
Dylid derbyn y neges ganlynol mewn ymateb:
ImportError: Jep is not supported in standalone Python, it must be embedded in Java.
Yn y ffeil swp efelychydd ar gyfer eich system (copicat.bat - ar gyfer Windows, copicat - ar gyfer Linux) i'r rhestr o baramedrau DEFAULT_JVM_OPTS
ychwanegu paramedr ychwanegol Djava.library.path
- rhaid iddo gynnwys y llwybr i'r modiwl Jep sydd wedi'i osod.
Dylai'r canlyniad ar gyfer Windows fod yn llinell fel hyn:
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"
Lansio Kopycat
Mae'r efelychydd yn gymhwysiad consol JVM. Cynhelir y lansiad trwy sgript llinell orchymyn y system weithredu (sh/cmd).
Gorchymyn i redeg o dan Windows:
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28
Gorchymyn i redeg o dan Linux gan ddefnyddio'r cyfleustodau 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
— Porth TCP a fydd ar agor ar gyfer mynediad i'r gweinydd GDB;-n rhino
— enw modiwl y brif system (dyfais wedi'i chydosod);-l user
— enw'r llyfrgell i chwilio am y prif fodiwl;-y library
— llwybr i chwilio am fodiwlau sydd wedi'u cynnwys yn y ddyfais;firmwarerhino_pass.bin
- llwybr i'r ffeil firmware;- Mae COM26 a COM28 yn borthladdoedd COM rhithwir.
O ganlyniad, bydd anogwr yn cael ei arddangos Python >
(Neu 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 >
Rhyngweithio ag IDA Pro
Er mwyn symleiddio'r profion, rydym yn defnyddio'r firmware Rhino fel y ffeil ffynhonnell i'w dadansoddi yn IDA ar y ffurf
Gallwch hefyd ddefnyddio'r prif firmware heb wybodaeth meta.
Ar ôl lansio Kopycat yn IDA Pro, yn y ddewislen Debugger ewch i'r eitem “Newid dadfygiwr…"A dewis"Dadfygiwr GDB o bell" . Nesaf, sefydlwch y cysylltiad: ddewislen Dadfygiwr - Opsiynau prosesu…
Gosodwch y gwerthoedd:
- Cais - unrhyw werth
- Enw gwesteiwr: 127.0.0.1 (neu gyfeiriad IP y peiriant anghysbell lle mae Kopycat yn rhedeg)
- Port: 23946
Nawr mae'r botwm dadfygio ar gael (allwedd F9):
Cliciwch arno i gysylltu â'r modiwl dadfygiwr yn yr efelychydd. IDA yn mynd i'r modd debugging, ffenestri ychwanegol yn dod ar gael: gwybodaeth am gofrestrau, am y pentwr.
Nawr gallwn ddefnyddio holl nodweddion safonol y dadfygiwr:
- gweithredu cyfarwyddiadau cam wrth gam (Camu i mewn и Camwch drosodd — allweddi F7 a F8, yn y drefn honno);
- dechrau ac oedi gweithredu;
- creu torbwyntiau ar gyfer cod a data (allwedd F2).
Nid yw cysylltu â dadfygiwr yn golygu rhedeg y cod firmware. Rhaid i'r sefyllfa weithredu bresennol fod y cyfeiriad 0x08006A74
- dechrau swyddogaeth Ailosod_Triniwr. Os sgroliwch i lawr y rhestriad, gallwch weld yr alwad swyddogaeth prif. Gallwch chi osod y cyrchwr ar y llinell hon (cyfeiriad 0x08006ABE
) a chyflawni'r llawdriniaeth Rhedeg nes cyrchwr (allwedd F4).
Nesaf, gallwch bwyso F7 i fynd i mewn i'r swyddogaeth prif.
Os ydych chi'n rhedeg y gorchymyn Parhau â'r broses (Allwedd F9), yna bydd y ffenestr “Arhoswch os gwelwch yn dda” yn ymddangos gydag un botwm Seibio:
Pan fyddwch chi'n pwyso Seibio Mae gweithrediad y cod firmware wedi'i atal a gellir ei barhau o'r un cyfeiriad yn y cod lle cafodd ei dorri.
Os byddwch yn parhau i weithredu'r cod, fe welwch y llinellau canlynol yn y terfynellau sy'n gysylltiedig â'r porthladdoedd COM rhithwir:
Mae presenoldeb y llinell “ffordd osgoi cyflwr” yn nodi bod y modiwl rhithwir Bluetooth wedi newid i'r modd o dderbyn data o borthladd COM y defnyddiwr.
Nawr yn y derfynell Bluetooth (COM29 yn y llun) gallwch chi nodi gorchmynion yn unol â'r protocol Rhino. Er enghraifft, bydd y gorchymyn “MEOW” yn dychwelyd y llinyn “mur-mur” i'r derfynell Bluetooth:
Efelychwch fi ddim yn llwyr
Wrth adeiladu efelychydd, gallwch ddewis lefel manylder / efelychiad dyfais benodol. Er enghraifft, gellir efelychu'r modiwl Bluetooth mewn gwahanol ffyrdd:
- mae'r ddyfais wedi'i hefelychu'n llawn gyda set lawn o orchmynion;
- Mae gorchmynion AT yn cael eu hefelychu, a derbynnir y llif data o borthladd COM y brif system;
- mae'r ddyfais rithwir yn darparu ailgyfeirio data cyflawn i'r ddyfais go iawn;
- fel bonyn syml sydd bob amser yn dychwelyd "OK".
Mae fersiwn gyfredol yr efelychydd yn defnyddio'r ail ddull - mae'r modiwl rhithwir Bluetooth yn perfformio cyfluniad, ac ar ôl hynny mae'n newid i'r modd o “ddirprwyo” data o borthladd COM y brif system i borthladd UART yr efelychydd.
Gadewch i ni ystyried y posibilrwydd o offeryniaeth syml o'r cod rhag ofn na chaiff rhan o'r cyrion ei gweithredu. Er enghraifft, os nad yw amserydd sy'n gyfrifol am reoli trosglwyddo data i DMA wedi'i greu (gwiriad yn y swyddogaeth ws2812b_aroslleoli yn 0x08006840
), yna bydd y firmware bob amser yn aros i'r faner gael ei ailosod prysurlleoli yn 0x200004C4
sy'n dangos deiliadaeth y llinell ddata DMA:
Gallwn fynd o gwmpas y sefyllfa hon trwy ailosod y faner â llaw prysur yn syth ar ôl ei osod. Yn IDA Pro, gallwch greu swyddogaeth Python a'i alw mewn torbwynt, a rhoi'r torbwynt ei hun yn y cod ar ôl ysgrifennu'r gwerth 1 i'r faner prysur.
Triniwr torbwynt
Yn gyntaf, gadewch i ni greu swyddogaeth Python yn IDA. Bwydlen Ffeil - Gorchymyn Sgript...
Ychwanegu pyt newydd yn y rhestr ar y chwith, rhowch enw iddo (er enghraifft, BPT),
Yn y maes testun ar y dde, rhowch y cod swyddogaeth:
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
Ar ôl hynny, cliciwch Run a chau ffenestr y sgript.
Nawr, gadewch i ni fynd at y cod yn 0x0800688A
, gosod torbwynt (allwedd F2), ei olygu (dewislen cyd-destun Golygu torbwynt...), peidiwch ag anghofio gosod y math o sgript i Python:
Os yw'r gwerth baner presennol prysur yn hafal i 1, yna dylech gyflawni'r swyddogaeth sgip_dma yn y llinell sgript:
Os ydych chi'n rhedeg y firmware i'w weithredu, yna gellir gweld sbardun cod y triniwr torbwynt yn y ffenestr IDA Allbwn fesul llinell Skipping wait ws2812...
. Nawr ni fydd y firmware yn aros i'r faner gael ei ailosod prysur.
Rhyngweithio â'r efelychydd
Nid yw efelychu er mwyn efelychu yn debygol o achosi hyfrydwch a llawenydd. Mae'n llawer mwy diddorol os yw'r efelychydd yn helpu'r ymchwilydd i weld y data yn y cof neu sefydlu rhyngweithiad edafedd.
Byddwn yn dangos i chi sut i sefydlu rhyngweithio deinamig rhwng tasgau RTOS. Yn gyntaf, dylech oedi cyn gweithredu'r cod os yw'n rhedeg. Os ewch chi i'r swyddogaeth bluetooth_task_mynediad i gangen brosesu'r gorchymyn “LED” (cyfeiriad 0x080057B8
), yna gallwch weld beth sy'n cael ei greu gyntaf ac yna ei anfon i'r ciw system ledControlQueueHandle rhyw neges.
Dylech osod torbwynt i gael mynediad i'r newidyn ledControlQueueHandlelleoli yn 0x20000624
a pharhau i weithredu'r cod:
O ganlyniad, bydd y stop yn digwydd gyntaf yn y cyfeiriad 0x080057CA
cyn galw'r swyddogaeth osMailAlloc, yna yn y cyfeiriad 0x08005806
cyn galw'r swyddogaeth osMailPut, yna ar ôl ychydig - i'r cyfeiriad 0x08005BD4
(cyn galw'r swyddogaeth osMailGet), sy'n perthyn i'r swyddogaeth leds_task_mynediad (LED-tasg), hynny yw, y tasgau newid, ac yn awr y LED-dasg a dderbyniwyd rheolaeth.
Yn y ffordd syml hon gallwch chi sefydlu sut mae tasgau RTOS yn rhyngweithio â'i gilydd.
Wrth gwrs, mewn gwirionedd, gall rhyngweithio tasgau fod yn fwy cymhleth, ond gan ddefnyddio efelychydd, mae olrhain y rhyngweithio hwn yn dod yn llai llafurus.
Lansio gyda Radare2
Ni allwch anwybyddu offeryn mor gyffredinol â Radare2.
I gysylltu â'r efelychydd gan ddefnyddio r2, byddai'r gorchymyn yn edrych fel hyn:
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf
Lansio ar gael nawr (dc
) ac oedi cyflawni (Ctrl+C).
Yn anffodus, ar hyn o bryd, mae gan r2 broblemau wrth weithio gyda'r gweinydd gdb caledwedd a chynllun cof; oherwydd hyn, nid yw torbwyntiau a Steps yn gweithio (gorchymyn ds
). Gobeithiwn y bydd hyn yn cael ei drwsio yn fuan.
Rhedeg gydag Eclipse
Un o'r opsiynau ar gyfer defnyddio'r efelychydd yw dadfygio cadarnwedd y ddyfais sy'n cael ei datblygu. Er eglurder, byddwn hefyd yn defnyddio'r firmware Rhino. Gallwch chi lawrlwytho'r ffynonellau firmware
Byddwn yn defnyddio Eclipse o'r set fel DRhA
Er mwyn i'r efelychydd lwytho'r firmware a luniwyd yn uniongyrchol yn Eclipse, mae angen ichi ychwanegu'r paramedr firmware=null
i'r gorchymyn lansio efelychydd:
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
Sefydlu cyfluniad dadfygio
Yn Eclipse, dewiswch y ddewislen Rhedeg - Ffurfweddiadau Dadfygio... Yn y ffenestr sy'n agor, yn yr adran Dadfygio Caledwedd GDB mae angen i chi ychwanegu cyfluniad newydd, yna ar y tab “Prif” nodwch y prosiect cyfredol a'r cais am ddadfygio:
Ar y tab “Debugger” mae angen i chi nodi'r gorchymyn GDB:
${openstm32_compiler_path}arm-none-eabi-gdb
A hefyd nodwch y paramedrau ar gyfer cysylltu â'r gweinydd GDB (gwesteiwr a phorth):
Ar y tab "Startup", rhaid i chi nodi'r paramedrau canlynol:
- galluogi blwch ticio Llwytho delwedd (fel bod delwedd y firmware sydd wedi'i ymgynnull yn cael ei lwytho i'r efelychydd);
- galluogi blwch ticio Llwyth symbolau;
- ychwanegu gorchymyn lansio:
set $pc = *0x08000004
(gosodwch y gofrestr PC i'r gwerth o'r cof yn y cyfeiriad0x08000004
- mae'r cyfeiriad yn cael ei storio yno AilosodHandler).
Talu sylw, os nad ydych am i lawrlwytho'r ffeil firmware o Eclipse, yna yr opsiynau Llwytho delwedd и Rhedeg gorchmynion dim angen nodi.
Ar ôl clicio Debug, gallwch weithio yn y modd dadfygiwr:
- gweithredu cod cam wrth gam
- rhyngweithio â thorbwyntiau
Nodyn. Mae gan Eclipse, hmm... ambell quirks... ac mae'n rhaid i chi fyw gyda nhw. Er enghraifft, os yw'r neges “Dim ffynhonnell ar gael ar gyfer “0x0″” yn ymddangos wrth gychwyn y dadfygiwr, yna gweithredwch y gorchymyn Cam (F5)
Yn hytrach na i gasgliad
Mae efelychu cod brodorol yn beth diddorol iawn. Mae'n dod yn bosibl i ddatblygwr dyfais ddadfygio'r firmware heb ddyfais go iawn. I ymchwilydd, mae'n gyfle i gynnal dadansoddiad cod deinamig, nad yw bob amser yn bosibl hyd yn oed gyda dyfais.
Rydym am ddarparu offeryn cyfleus, gweddol syml i arbenigwyr ac nad yw'n cymryd llawer o ymdrech ac amser i'w sefydlu a'i redeg.
Ysgrifennwch y sylwadau am eich profiad gan ddefnyddio efelychwyr caledwedd. Rydym yn eich gwahodd i drafod a byddwn yn hapus i ateb cwestiynau.
Dim ond defnyddwyr cofrestredig all gymryd rhan yn yr arolwg.
Ar gyfer beth ydych chi'n defnyddio'r efelychydd?
-
Rwy'n datblygu (debug) firmware
-
Yr wyf yn ymchwilio cadarnwedd
-
Rwy'n lansio gemau (Dendi, Sega, PSP)
-
rhywbeth arall (ysgrifennwch yn y sylwadau)
Pleidleisiodd 7 o ddefnyddwyr. Ymataliodd 2 o ddefnyddwyr.
Pa feddalwedd ydych chi'n ei ddefnyddio i efelychu cod brodorol?
-
QEMU
-
Injan unicorn
-
Proteus
-
rhywbeth arall (ysgrifennwch yn y sylwadau)
Pleidleisiodd 6 o ddefnyddwyr. Ymataliodd 2 o ddefnyddwyr.
Beth hoffech chi ei wella yn yr efelychydd rydych chi'n ei ddefnyddio?
-
Dwi eisiau cyflymder
-
Dwi eisiau rhwyddineb gosod/lansio
-
Dwi eisiau mwy o opsiynau ar gyfer rhyngweithio gyda'r efelychydd (API, bachau)
-
Rwy'n hapus gyda phopeth
-
rhywbeth arall (ysgrifennwch yn y sylwadau)
Pleidleisiodd 8 o ddefnyddwyr. Ymatalodd 1 defnyddiwr.
Ffynhonnell: hab.com