Kérdés:
A jtag-openocd-gdb-hez való csatlakozás az arm11 eszközhöz IDA-val nem vezérelhető
frunk420
2013-09-10 19:19:22 UTC
view on stackexchange narkive permalink

Van egy bináris darabom egy olyan hardverből, amelyet már pár napja megfejtettem az IDA-val. Ma végre megkaptam a JTAG-on keresztül csatlakoztatott szondát, és az openocd elindította a GDB szervert. Az IDA csatlakozik a GDB szolgáltatáshoz, de amikor csatlakozom a folyamathoz, az összes nullát megmutatja a memóriában, és a PC nem volt ott, ahol vártam. Alapvetően úgy tűnik, hogy az IDA-nak nincs ellenőrzése, és nem kötődik hozzá. BTW, a cél fut, és inkább nem állítok le állítást, ha nem muszáj. Úgy gondolom, hogy ez a JTAG-mal lehetséges.

Nincs folyamatonkénti mondás, de nagyon szeretném, ha töréspontokat és egy lépést állíthatnék be a kód egyes helyein. Nyilván van valami telepítési probléma. Van valami ötleted?

UPDATE:

Sokat kellett tanulnom, és számos dolgot rosszul találtam ki.

  1. Kezdje az OPENOCD használatával a terminálon keresztül
  2. Valójában le kell állítania a célpontot, hogy hozzáférhessen a kézben lévő nyilvántartásokhoz
  3. a JTAG sebessége túl nagy
  4. A tesztelt eszközön be volt kapcsolva a WDT. Most, hogy ki van kapcsolva, le tudom állítani a célpontot, és megnézem a megfelelő regisztereket. Láttam, hogy ez történt, mivel remekül kezdi el olvasni a PC-t, de mire az alacsonyabb regs-re ért, minden F-et elolvasott.
  5. A DUT-nak van gyorsítótára és az MMU engedélyezve, így bár le tudom állítani cél, az újraindítás mindig adatmegszakítással végződik. Ha az arm11.c fájlt nézzük meg az ocd fájlban, úgy tűnik, hogy van egy csomó olyan csonk, amely még nincs teljesen megvalósítva a gyorsítótár bekapcsolásához. A folytatás előtt megpróbáltam kiüríteni a gyorsítótárat, de még mindig megszakítom az adatokat. További vizsgálatra van szükség, de ha valakinek van tanácsa, tudassa velem.

Eddig a segítségéért ez biztosan tanulási élmény volt.

Feladhatja ide az OpenOCD kimenetet, a telnet parancssor kimenetét és a GDB-ben erre használt parancsokat? Nem vagyok az OpenOCD szakértője, és tévedhetek, de sok célpontnál azt gondolom, hogy ehhez hibakeresési módba kell lépnie, és ez magában foglalja a processzor leállítását.
Kettő válaszokat:
frunk420
2013-09-16 17:50:15 UTC
view on stackexchange narkive permalink

Kiderült, hogy az ARM11 openocd-jában volt néhány hiba. Végül néhány változtatást hajtottam végre, hogy a kar specifikációjának megfelelően működjön:

A arm11_debug_entry

  • A lefolyó bekapcsolása az adatok megszakadnak. Az ellenőrzésnek a következőknek kell lennie:

      if (! ((Dscr & DSCR_STICKY_ABORT_IMPRECISE))  
  • Ezután adja hozzá a következő kódot a C1 elé vezérlő regisztráció

      / * Engedélyezze a Debug Cache visszaírását, és tiltsa le a sor kitöltését * // * mcr p15,7, R0, c15, c0,0 * / retval = arm11_run_instr_data_to_core_via_r0 (arm11, 0xeeef0f10, 0x07); if (retval! = ERROR_OK) return retval;  
  • Most pedig elmentem, majd visszaállítom a C1 vezérlő regisztert

      / * Olvassa el az 1. írásvezérlő regiszter módosítását az MMU / gyorsítótár stb. letiltásához. Tárolás az átprogramozáshoz visszatéréskor * // * MRC p15,0, R0, c1, c0,0 * / arm11_run_instr_data_from_core_via_r0 (arm11, 0xee110f10, &cntrlregval); (retval! = ERROR_OK) visszatér retval; arm11->saved_c1cntrl = cntrlregval; / * Módosítások végrehajtása * // * MCR p15,0, R0, c1, c0,0 * / retval = arm11_run_instr_data_to_core_via_r0 (arm11, 0xee; retval! = ERROR_OK) return retval;  

A arm11_leave_debug fájlban _state

  / * letiltja a hibakereső gyorsítótár írását, stb. * / retval = arm11_run_instr_data_prepare (arm11); if (retval! = ERROR_OK) return retval; retval = arm11_run_instr_data_to_core_via_r0 (arm11, 0xeeef0f10, 0x00); if (retval! = ERROR_OK) return retval; / * újraírni a társprocesszor vezérlését * / retval = arm11_run_instr_data_to_core_via_r0 (arm11, 0xee010f10, arm11->saved_c1cntrl); if (retval! = ERROR_OK) return retval; retval = arm11_run_instr_data_finish (arm11); if (retval! = ERROR_OK) return retval;  

Megpróbálom ezeket a változásokat beilleszteni, hogy másoknak ne legyen problémám.

ixje
2013-09-12 19:42:42 UTC
view on stackexchange narkive permalink

Tekintettel arra, hogy egyetlen lépéssel szeretne előbb-utóbb leállítani a processzort, mi akadályozza meg, hogy most megpróbálja?

Azt próbálom elképzelni, hogy a JTAG egység hogyan képes ellenőrizni a memóriát, ha a futó program használatban tartja a buszt (ses)? Arra számítok, hogy a TAP hozzáférhet néhány határcellához, miközben a processzor fut, mivel ezek alapvetően másolt / tükrözött értékek, de más emlékeket nem ismerek.

Azt javaslom, hogy állítsa le a célpontot, és próbálkozzon újra. Számomra a legértelmesebb, hogy az IDA csak akkor tud lekérdezni és a következõen helyesen megjeleníteni a CPU regiszterek és memória állapotát, ha rendelkezik vezérléssel.



Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...