Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Kòm yon pati nan reyinyon an 0x0A DC7831 DEF KON Nizhny Novgorod Sou 16 fevriye, nou te prezante yon rapò sou prensip debaz yo nan imitasyon kòd binè ak devlopman pwòp pa nou - yon emulateur platfòm pyès ki nan konpitè. Copycat.

Nan atik sa a nou pral dekri ki jan yo kouri firmwèr aparèy la nan Emulation a, demontre entèraksyon ak debogaj la, epi fè yon ti analiz dinamik firmwèr la.

pre-istwa

Yon bon bout tan de sa nan yon galaksi byen lwen

Yon koup de ane de sa nan laboratwa nou an te gen yon bezwen envestige firmwèr la nan yon aparèy. Te firmwèr la konprese ak depake ak yon bootloader. Li te fè sa nan yon fason trè konplike, déplacement done yo nan memwa plizyè fwa. Ak firmwèr nan tèt li Lè sa a, aktivman kominike ak periferik yo. Ak tout bagay sa yo sou nwayo a MIPS.

Pou rezon objektif, emulateur ki disponib yo pa t 'kostim nou, men nou toujou te vle kouri kòd la. Lè sa a, nou deside fè Emulation pwòp nou an, ki ta fè minimòm la ak pèmèt nou depale firmwèr prensipal la. Nou te eseye li epi li te travay. Nou te panse, e si nou ajoute periferik pou fè tou firmwèr prensipal la. Li pa t 'fè mal anpil - epi li te travay deyò tou. Nou te panse ankò e nou te deside fè yon Emulation tout bon vre.

Rezilta a se te yon Emulation sistèm òdinatè Copycat.

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat
Poukisa Kopycat?

Gen yon jwèt sou mo.

  1. kopi (Angle, noun [ˈkɒpɪkæt]) - imitator, imitator
  2. chat (Angle, noun [ˈkæt]) - chat, chat - bèt pi renmen youn nan kreyatè pwojè a
  3. Lèt "K" a soti nan langaj pwogram Kotlin

Copycat

Lè w kreye emulateur a, yo te fikse objektif trè espesifik:

  • kapasite nan byen vit kreye nouvo periferik, modil, nwayo processeur;
  • kapasite nan rasanble yon aparèy vityèl soti nan divès modil;
  • kapasite nan chaje nenpòt done binè (firmware) nan memwa a nan yon aparèy vityèl;
  • kapasite pou travay ak snapshots (snapshots nan eta a sistèm);
  • kapasite nan kominike avèk Emulation la atravè debogaj la bati-an;
  • bèl lang modèn pou devlopman.

Kòm yon rezilta, Kotlin te chwazi pou aplikasyon, achitekti otobis la (sa a se lè modil yo kominike youn ak lòt atravè otobis done vityèl), JSON kòm fòma deskripsyon aparèy la, ak GDB RSP kòm pwotokòl la pou entèraksyon ak debogaj la.

Devlopman te kontinye pou yon ti kras plis pase de ane epi li aktivman kontinyèl. Pandan tan sa a, MIPS, x86, V850ES, ARM, ak nwayo processeur PowerPC yo te aplike.

Pwojè a ap grandi e li lè pou nou prezante l bay pi laj piblik la. Nou pral fè yon deskripsyon detaye sou pwojè a pita, men pou kounye a nou pral konsantre sou itilize Kopycat.

Pou moun ki pi enpasyan, yo ka telechaje yon vèsyon promo nan Emulation la lyen.

Rinoseròs nan Emulation la

Se pou nou sonje ke pi bonè pou konferans lan SMARTRHINO-2018, yo te kreye yon aparèy tès "Rhinoceros" pou anseye ladrès jeni ranvèse. Pwosesis la nan analiz firmwèr estatik te dekri nan atik sa a.

Koulye a, ann eseye ajoute "oratè" epi kouri firmwèr la nan Emulation la.

Nou pral bezwen:
1) Java 1.8
2) Python ak modil jep pou itilize Python andedan Emulation la. Ou ka bati modil WHL Jep pou Windows telechaje isit la.

Pou Windows:
1) com0com
2) MASTI

Pou Linux:
1) socat

Ou ka itilize Eclipse, IDA Pro oswa radare2 kòm yon kliyan GDB.

Kouman li travay?

Yo nan lòd yo fè firmwèr nan Emulation a, li nesesè "rasanble" yon aparèy vityèl, ki se yon analogue nan yon aparèy reyèl.

Ou ka montre aparèy reyèl la ("rinosòs") nan dyagram blòk la:

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Emulation a gen yon estrikti modilè ak final aparèy vityèl la ka dekri nan yon dosye JSON.

JSON 105 liy

{
  "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"]
  ]
}

Peye atansyon sou paramèt la du seksyon paramèt se non yon dosye ki ka chaje nan yon aparèy vityèl kòm firmwèr.

Aparèy vityèl la ak entèraksyon li ak sistèm opere prensipal la ka reprezante pa dyagram sa a:

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Enstans tès aktyèl la nan Emulation a enplike nan entèraksyon ak pò yo COM nan OS prensipal la (debug UART ak UART pou modil Bluetooth la). Sa yo ka pò reyèl ak ki aparèy yo konekte oswa pò vityèl COM (pou sa ou jis bezwen com0com/socat).

Kounye a gen de fason prensipal yo kominike avèk Emulation la soti deyò:

  • GDB RSP pwotokòl (an konsekans, zouti ki sipòte pwotokòl sa a se Eclipse / IDA / radare2);
  • liy lòd entèn Emulation (Argparse oswa Python).

Viryèl pò COM yo

Yo nan lòd yo kominike avèk UART nan yon aparèy vityèl sou machin lokal la atravè yon tèminal, ou bezwen kreye yon pè nan pò COM vityèl ki asosye. Nan ka nou an, yon pò yo itilize pa Emulation a, ak dezyèm lan pa yon pwogram tèminal (PuTTY oswa ekran):

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Sèvi ak com0com

Viryèl pò COM yo konfigirasyon lè l sèvi avèk sèvis piblik konfigirasyon ki soti nan twous la com0com (vèsyon konsole - C:Fichye pwogram (x86)com0comsetupс.exe, oswa vèsyon entèfas - C:Fichye pwogram (x86)com0comsetupg.exe):

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Tcheke bwat yo pèmèt depase tanpon pou tout pò vityèl kreye, otreman Emulation a ap tann pou yon repons nan pò COM la.

Sèvi ak socat

Sou sistèm UNIX, pò vityèl COM yo otomatikman kreye pa emulateur la lè l sèvi avèk sèvis piblik la socat pou fè sa, jis presize prefiks nan non pò a lè yo kòmanse emulateur la socat:.

Koòdone liy lòd entèn (Argparse oswa Python)

Depi Kopycat se yon aplikasyon konsole, Emulation a bay de opsyon koòdone liy lòd pou kominike avèk objè ak varyab li yo: Argparse ak Python.

Argparse se yon CLI ki bati nan Kopycat epi li toujou disponib pou tout moun.

Yon CLI altènatif se entèprèt Python. Pou itilize li, ou bezwen enstale modil Jep Python epi konfigirasyon emulateur la pou travay ak Python (yo pral itilize entèprèt Python ki enstale sou sistèm prensipal itilizatè a).

Enstale modil Python Jep

Anba Linux Jep ka enstale atravè pip:

pip install jep

Pou enstale Jep sou Windows, ou dwe premye enstale Windows SDK ak Microsoft Visual Studio ki koresponn lan. Nou te rann li yon ti kras pi fasil pou ou ak WHL bati JEP pou vèsyon aktyèl Python pou Windows, kidonk modil la ka enstale nan dosye a:

pip install jep-3.8.2-cp27-cp27m-win_amd64.whl

Pou tcheke enstalasyon Jep, ou bezwen kouri sou liy lòd la:

python -c "import jep"

Mesaj sa a ta dwe resevwa kòm repons:

ImportError: Jep is not supported in standalone Python, it must be embedded in Java.

Nan dosye a pakèt Emulation pou sistèm ou a (copycat.bat - pou Windows, kopi — pou Linux) nan lis paramèt yo DEFAULT_JVM_OPTS ajoute yon paramèt adisyonèl Djava.library.path — li dwe genyen chemen ki mennen nan modil Jep enstale a.

Rezilta a pou Windows ta dwe yon liy tankou sa a:

set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"

Lanse Kopycat

Emulateur a se yon aplikasyon JVM konsole. Lansman an fèt atravè script liy kòmand sistèm operasyon an (sh/cmd).

Kòmand pou kouri anba Windows:

binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28

Kòmand pou kouri anba Linux lè l sèvi avèk sèvis piblik socat la:

./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 pò ki pral louvri pou aksè nan sèvè a GDB;
  • -n rhino — non modil sistèm prensipal la (aparèy reyini);
  • -l user — non bibliyotèk la pou chèche modil prensipal la;
  • -y library — chemen pou chèche modil ki enkli nan aparèy la;
  • firmwarerhino_pass.bin - chemen nan fichye firmwèr la;
  • COM26 ak COM28 yo se pò vityèl COM.

Kòm yon rezilta, yon èd memwa ap parèt Python > (Oswa 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 >

Entèaksyon ak IDA Pro

Pou senplifye tès la, nou itilize firmwèr Rhino a kòm dosye sous pou analiz nan IDA nan fòm lan ELF dosye (meta enfòmasyon yo estoke la).

Ou kapab tou itilize firmwèr prensipal la san enfòmasyon meta.

Apre lanse Kopycat nan IDA Pro, nan meni an Debugger ale nan atik la "Chanje debugger..."epi chwazi"Remote GDB debogaj". Apre sa, mete koneksyon an: meni Debugger - Opsyon pwosesis...

Mete valè yo:

  • Aplikasyon - nenpòt valè
  • Hostname: 127.0.0.1 (oswa adrès IP machin aleka kote Kopycat ap kouri)
  • Port: 23946

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Koulye a, bouton debogaj la vin disponib (kle F9):

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Klike sou li pou konekte avèk modil debugger nan Emulation la. IDA antre nan mòd debogaj, lòt fenèt vin disponib: enfòmasyon sou rejis, sou pil la.

Koulye a, nou ka itilize tout karakteristik estanda debugger la:

  • etap pa etap ekzekisyon enstriksyon yo (Etap nan и Etap sou - kle F7 ak F8, respektivman);
  • kòmanse ak pran yon poz ekzekisyon;
  • kreye breakpoints pou tou de kòd ak done (kle F2).

Konekte ak yon debugger pa vle di kouri kòd firmwèr la. Pozisyon ekzekisyon aktyèl la dwe adrès la 0x08006A74 - kòmansman fonksyon Reset_Handler. Si ou desann lis la, ou ka wè apèl fonksyon an prensipal. Ou ka mete kurseur a sou liy sa a (adrès 0x08006ABE) epi fè operasyon an Kouri jiskaske kurseur (kle F4).

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Apre sa, ou ka peze F7 pou antre nan fonksyon an prensipal.

Si ou kouri kòmandman an Kontinye pwosesis la (Kle F9), Lè sa a, "Tanpri tann" fenèt la ap parèt ak yon sèl bouton sispann:

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Lè ou peze sispann Egzekisyon kòd firmwèr la sispann epi yo ka kontinye nan menm adrès la nan kòd la kote li te entèwonp.

Si ou kontinye egzekite kòd la, ou pral wè liy sa yo nan tèminal yo ki konekte nan pò COM vityèl yo:

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Prezans nan liy "kontoune eta a" endike ke modil la Bluetooth vityèl te chanje nan mòd nan resevwa done ki soti nan pò COM itilizatè a.

Koulye a, nan tèminal la Bluetooth (COM29 nan foto a) ou ka antre kòmandman an akò ak pwotokòl la Rhino. Pou egzanp, lòd "MEOW" la pral retounen fisèl "mur-mur" nan tèminal Bluetooth la:

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Imite m 'pa konplètman

Lè w ap bati yon Emulation, ou ka chwazi nivo detay / Emulation yon aparèy patikilye. Pou egzanp, modil Bluetooth la ka imite nan diferan fason:

  • se aparèy la konplètman imite ak yon seri konplè nan kòmandman;
  • Kòmand AT yo imite, epi kouran done yo resevwa nan pò COM nan sistèm prensipal la;
  • aparèy vityèl la bay done konplè redireksyon nan aparèy la reyèl;
  • kòm yon souch senp ki toujou retounen "OK".

Vèsyon aktyèl la nan Emulation la sèvi ak dezyèm apwòch la - modil la Bluetooth vityèl fè konfigirasyon, apre sa li chanje nan mòd nan "proxying" done ki soti nan pò a COM nan sistèm prensipal la nan pò a UART nan Emulation la.

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Ann konsidere posiblite pou instrumentation senp nan kòd la nan ka kèk pati nan periferik la pa aplike. Pou egzanp, si yon revèy ki responsab pou kontwole transfè done nan DMA pa te kreye (chèk la fèt nan fonksyon an). ws2812b_waitsitiye nan 0x08006840), Lè sa a, firmwèr la ap toujou rete tann pou drapo a dwe reset okipesitiye nan 0x200004C4ki montre lokatè liy done DMA a:

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Nou ka jwenn alantou sitiyasyon sa a pa manyèlman reset drapo a okipe imedyatman apre enstale li. Nan IDA Pro, ou ka kreye yon fonksyon Python epi rele li nan yon breakpoint, epi mete breakpoint nan tèt li nan kòd la apre ou fin ekri valè 1 nan drapo a. okipe.

Manadjè Breakpoint

Premyèman, ann kreye yon fonksyon Python nan IDA. Menu File - Kòmandman Script...

Ajoute yon nouvo snippet nan lis ki sou bò gòch la, bay li yon non (pa egzanp, BPT),
Nan jaden tèks sou bò dwat la, antre kòd fonksyon an:

def skip_dma():
    print "Skipping wait ws2812..."
    value = Byte(0x200004C4)
    if value == 1:
        PatchDbgByte(0x200004C4, 0)
return False

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Apre sa, klike sou kouri epi fèmen fenèt script la.

Koulye a, ann ale nan kòd la nan 0x0800688A, mete yon breakpoint (kle F2), edite li (meni kontèks Edit breakpoint...), pa bliye mete kalite script la nan Python:

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat
Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Si valè drapo aktyèl la okipe egal 1, Lè sa a, ou ta dwe egzekite fonksyon an skip_dma nan liy script la:

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Si ou kouri firmwèr la pou ekzekisyon, ou ka wè deklanche kòd jeran breakpoint la nan fenèt IDA a. Sòti pa liy Skipping wait ws2812.... Koulye a, firmwèr la pa pral tann pou drapo a dwe reset okipe.

Entèaksyon ak Emulation la

Emulation pou dedomajman pou la imitasyon se fasil lakòz plezi ak kè kontan. Li se pi plis enteresan si Emulation a ede chèchè a wè done yo nan memwa oswa etabli entèraksyon an nan fil.

Nou pral montre w kouman pou etabli dinamik entèraksyon ant travay RTOS. Ou ta dwe premye pran yon poz ekzekisyon kòd la si li ap kouri. Si ou ale nan fonksyon an bluetooth_task_entry nan branch pwosesis la nan "LED" lòd la (adrès 0x080057B8), Lè sa a, ou ka wè sa ki premye kreye ak Lè sa a, voye nan keu sistèm lan ledControlQueueHandle kèk mesaj.

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Ou ta dwe mete yon breakpoint pou jwenn aksè nan varyab la ledControlQueueHandlesitiye nan 0x20000624 epi kontinye egzekite kòd la:

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Kòm yon rezilta, arè a pral premye fèt nan adrès 0x080057CA anvan ou rele fonksyon an osMailAlloc, Lè sa a, nan adrès la 0x08005806 anvan ou rele fonksyon an osMailPut, Lè sa a, apre yon ti tan - nan adrès la 0x08005BD4 (anvan yo rele fonksyon an osMailGet), ki fè pati fonksyon an leds_task_entry (LED-travay), se sa ki, travay yo chanje, e kounye a, dirije-travay la te resevwa kontwòl.

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Nan fason sa a senp ou ka etabli ki jan travay RTOS kominike youn ak lòt.

Natirèlman, an reyalite, entèraksyon an nan travay ka pi konplike, men lè l sèvi avèk yon Emulation, swiv entèraksyon sa a vin mwens travayè.

Isit la Ou ka gade yon videyo kout sou lanse emulateur a ak kominike avèk IDA Pro.

Lanse ak Radare2

Ou pa ka inyore yon zouti inivèsèl tankou Radare2.

Pou konekte ak emulateur a lè l sèvi avèk r2, lòd la ta sanble sa a:

radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf

Lanse disponib kounye a (dc) ak pran yon poz ekzekisyon (Ctrl + C).

Malerezman, nan moman sa a, r2 gen pwoblèm lè w ap travay ak sèvè gdb pyès ki nan konpitè ak layout memwa poutèt sa, pwen rupture ak Etap pa travay (kòmand ds). Nou espere ke sa a pral ranje byento.

Kouri ak Eclipse

Youn nan opsyon pou itilize Emulation a se debug firmwèr aparèy la ap devlope. Pou klè, nou pral sèvi ak firmwèr Rhino tou. Ou ka telechaje sous firmwèr yo kon sa.

Nou pral sèvi ak Eclipse nan seri a kòm yon IDE Sistèm Workbench pou STM32.

Nan lòd pou Emulation a chaje firmwèr dirèkteman konpile nan Eclipse, ou bezwen ajoute paramèt la firmware=null nan lòd lanse emulateur la:

binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28

Mete kanpe konfigirasyon debug

Nan Eclipse, chwazi meni an Kouri - Debug konfigirasyon... Nan fenèt la ki ouvè, nan seksyon an GDB Materyèl Debogaj ou bezwen ajoute yon nouvo konfigirasyon, Lè sa a, sou tab la "Principal" presize pwojè aktyèl la ak aplikasyon pou debogaj:

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Sou tab la "Debugger" ou bezwen presize lòd la GDB:
${openstm32_compiler_path}arm-none-eabi-gdb

Epi tou antre nan paramèt yo pou konekte ak sèvè GDB (lame ak pò):

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Sou tab la "Demaraj", ou dwe presize paramèt sa yo:

  • pèmèt kaz Chaje imaj (pou ke imaj la reyini firmwèr chaje nan Emulation a);
  • pèmèt kaz Chaj senbòl;
  • ajoute lòd lanse: set $pc = *0x08000004 (mete enskri PC a nan valè a nan memwa nan adrès 0x08000004 - se adrès la ki estoke la ResetHandler).

Peye atansyon, Si ou pa vle telechaje fichye firmwèr la soti nan Eclipse, Lè sa a, opsyon yo Chaje imaj и Kouri kòmandman yo pa bezwen endike.

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Apre klike sou Debug, ou ka travay nan mòd debugger:

  • etap pa etap ekzekisyon kòd
    Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat
  • kominike avèk breakpoints
    Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Note. Eclipse gen, hmm... kèk kirks... epi ou dwe viv avèk yo. Pou egzanp, si lè w kòmanse debogaj la mesaj "Pa gen sous disponib pou "0x0"" parèt, Lè sa a, egzekite kòmand Etap la (F5)

Rinoseròs andedan yon chat - kouri firmwèr la nan emulateur la Kopycat

Olye pou yo yon konklizyon

Imite kòd natif natal se yon bagay trè enteresan. Pou yon pwomotè aparèy, li vin posib pou debogaj firmwèr la san yon aparèy reyèl. Pou yon chèchè, li se yon opòtinite pou fè analiz kòd dinamik, ki pa toujou posib menm ak yon aparèy.

Nou vle bay espesyalis yo yon zouti ki pratik, modere senp epi ki pa pran anpil efò ak tan pou mete kanpe ak kouri.

Ekri nan kòmantè yo sou eksperyans ou lè l sèvi avèk emulateur pyès ki nan konpitè. Nou envite ou diskite epi yo pral kontan reponn kesyon yo.

Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la. Enskri, tanpri.

Pou ki sa w ap itilize emulateur la?

  • Mwen devlope (debug) firmwèr

  • Mwen fè rechèch sou firmwèr

  • Mwen lanse jwèt (Dendi, Sega, PSP)

  • yon lòt bagay (ekri nan kòmantè yo)

7 itilizatè yo te vote. 2 itilizatè te absteni.

Ki lojisyèl ou itilize pou imite kòd natif natal?

  • QEMU

  • Likorn motè

  • Prote

  • yon lòt bagay (ekri nan kòmantè yo)

6 itilizatè yo te vote. 2 itilizatè te absteni.

Ki sa ou ta renmen amelyore nan Emulation w ap itilize a?

  • Mwen vle vitès

  • Mwen vle fasilite nan konfigirasyon / lansman

  • Mwen vle plis opsyon pou kominike avèk Emulation la (API, kwòk)

  • Mwen kontan ak tout bagay

  • yon lòt bagay (ekri nan kòmantè yo)

8 itilizatè yo te vote. 1 itilizatè te absteni.

Sous: www.habr.com

Add nouvo kòmantè