MitM-ähnliche RTOS-Unterstützung in GDB

Ich habe lange darüber nachgedacht, ob es möglich ist, einen Artikel über Habré erneut zu veröffentlichen. Ich habe die Regeln studiert. Es scheint, dass dies jetzt nicht verboten ist. Wenn ich einen Fehler gemacht habe, werde ich ihn korrigieren :)


Damit...


Vor einiger Zeit habe ich den Firmware-Code fĂĽr die Epiphan- Grabber der AV.io-Reihe geschrieben:


  • AV.io HD - unser Pilot, auf dem viel debuggt und Architektur geformt wurde
  • AV.io SDI - Fixierpositionen
  • AV.io 4K - bereits neue Hardware und neue Ansätze, jetzt starten wir fast sofort
  • KVM2USB 3.0 - Ein tiefes Ăśberdenken von AV.io HD . Dank des Modernisierungspotenzials des Basismodells konnten sie praktisch ohne Hardwaremodifikationen ein neues Produkt rein per Software herstellen.

Dort war Cypress FX3 beteiligt , und das SDK wurde auf ThreadX aufgebaut. Als JTAG-Debugger können Sie Olimex ARM-USB-OCD-H in Verbindung mit OpenOCD verwenden . Leider weiß OpenOCD nichts über Threads in RTOS, und obwohl der Code grundlegende Unterstützung enthält, haben wir speziell für unseren Prozessor ein Register-Stacking-Schema verwendet, das sich von dem bereits implementierten unterscheidet. Ich musste verstehen und modifizieren . Die Gewinne aus der Verwendung von JTAG für die Entwicklung können zumindest bei verteilter Arbeit kaum überschätzt werden .


Die Zeit läuft also davon. Jetzt sind das FPGA von Xilinx und der MicroBlaze-Softwareprozessor an der Reihe, auf denen Sie die portierte FreeRTOS-Version 10.x ausführen können. Das Problem ist jedoch genau das gleiche: Es gibt keine Unterstützung für Threads im Debugger!


XSDK


Xilinx ARM Cortex-A53, ARM Cortex-R5 MicroBlaze. MicroBlaze — , FPGA. .


( CPU, FPGA, — Vivado) — XSDK ( 2020 Vitis), Eclipse. FPGA . , JTAG ( OpenOCD!) , . : , , .


, Eclipse, , — XSTC. . .


.


JTAG hw_server. TCP , — 3121, , , 3000 — GDB :


  • N+0 (3000) — ARM Cortex-A53
  • N+1 (3001) — ARM Cortex-R5
  • N+2 (3002) — MicroBlaze ( )

-, .


, . , . , ( !) — System Debugger GDB. MicroBlaze GDB — mb-gdb.


System Debugger . , Xilinx GDB — .


,


, RTOS OpenOCD, , , :


  1. RTOS TCB (Thread Control Block), , . . ( ) — Reverse Engineering! : , , .
  2. RTOS — . , , . , , — . .. . — .
  3. 1 — TCB ( — RTOS).

, GDB GDB , info threads info registers thread N bt.


, RTOS , , RTOS ( , SDK , ). , .


: . . p , , . , ThreadX Cypress FX3. , . — .


… GDB-client GDB-server , , , MitM ""? , , , , ?


, : . gdbproxy , .


— . C++ ( , , ), Asio, C++17 , , C++2a — , , , 100%, 90% !


,


, — . . Asio , . . .


: . TCB, . … GDB- . . … ! — . , , ( — ) : qSymbol::, : - ? — . — , . qSymbol:NAME, qSymbol:ADDR:NAME qSymbol::NAME , nullptr. - ( , — ) , .


. , , , , — … , !


.. , .


, : , . .


, . . (SMP , ) — . GDB ( ) — : . .


, GDB-client . , . : - , - SP (Stack Pointer) FP (Frame Pointer) . , .


: Set Current Thread ( OK EXX — XX — , ), . RTOS, , , . , — . — Current Execution? : — . , . ! . Set Current Thread Set Current Thread , xxxxxxxx , — ! , RTOS , Set Current Thread , Set Current Thread . : . .


, SP : TCB . SP , .


, . . Stop Reply Packets. , . , breakpoint, watchpoint Break ( , , 0x03 Stop Reply Packet). , , . Stop Reply Packet, . . Stop Reply Packets : vCont c — Continue s — Step ( ).


. , , .


, , . : . — . GDB. MicroBlaze GDB microblaze-tdep.h enum microblaze_regnum:


enum microblaze_regnum
{
  MICROBLAZE_R0_REGNUM,
  MICROBLAZE_R1_REGNUM, MICROBLAZE_SP_REGNUM = MICROBLAZE_R1_REGNUM,
  MICROBLAZE_R2_REGNUM,
  MICROBLAZE_R3_REGNUM, MICROBLAZE_RETVAL_REGNUM = MICROBLAZE_R3_REGNUM,
  MICROBLAZE_R4_REGNUM,
  MICROBLAZE_R5_REGNUM, MICROBLAZE_FIRST_ARGREG = MICROBLAZE_R5_REGNUM,
  MICROBLAZE_R6_REGNUM,
  MICROBLAZE_R7_REGNUM,
  MICROBLAZE_R8_REGNUM,
  MICROBLAZE_R9_REGNUM,
  MICROBLAZE_R10_REGNUM, MICROBLAZE_LAST_ARGREG = MICROBLAZE_R10_REGNUM,
  MICROBLAZE_R11_REGNUM,
  MICROBLAZE_R12_REGNUM,
  MICROBLAZE_R13_REGNUM,
  MICROBLAZE_R14_REGNUM,
  MICROBLAZE_R15_REGNUM,
  MICROBLAZE_R16_REGNUM,
  MICROBLAZE_R17_REGNUM,
  MICROBLAZE_R18_REGNUM,
  MICROBLAZE_R19_REGNUM,
  MICROBLAZE_R20_REGNUM,
  MICROBLAZE_R21_REGNUM,
  MICROBLAZE_R22_REGNUM,
  MICROBLAZE_R23_REGNUM,
  MICROBLAZE_R24_REGNUM,
  MICROBLAZE_R25_REGNUM,
  MICROBLAZE_R26_REGNUM,
  MICROBLAZE_R27_REGNUM,
  MICROBLAZE_R28_REGNUM,
  MICROBLAZE_R29_REGNUM,
  MICROBLAZE_R30_REGNUM,
  MICROBLAZE_R31_REGNUM,
  MICROBLAZE_PC_REGNUM,
  MICROBLAZE_MSR_REGNUM,
  MICROBLAZE_EAR_REGNUM,
  MICROBLAZE_ESR_REGNUM,
  MICROBLAZE_FSR_REGNUM,
  MICROBLAZE_BTR_REGNUM,
  MICROBLAZE_PVR0_REGNUM,
  MICROBLAZE_PVR1_REGNUM,
  MICROBLAZE_PVR2_REGNUM,
  MICROBLAZE_PVR3_REGNUM,
  MICROBLAZE_PVR4_REGNUM,
  MICROBLAZE_PVR5_REGNUM,
  MICROBLAZE_PVR6_REGNUM,
  MICROBLAZE_PVR7_REGNUM,
  MICROBLAZE_PVR8_REGNUM,
  MICROBLAZE_PVR9_REGNUM,
  MICROBLAZE_PVR10_REGNUM,
  MICROBLAZE_PVR11_REGNUM,
  MICROBLAZE_REDR_REGNUM,
  MICROBLAZE_RPID_REGNUM,
  MICROBLAZE_RZPR_REGNUM,
  MICROBLAZE_RTLBX_REGNUM,
  MICROBLAZE_RTLBSX_REGNUM,
  MICROBLAZE_RTLBLO_REGNUM,
  MICROBLAZE_RTLBHI_REGNUM,
  MICROBLAZE_SLR_REGNUM, MICROBLAZE_NUM_CORE_REGS = MICROBLAZE_SLR_REGNUM,
  MICROBLAZE_SHR_REGNUM,
  MICROBLAZE_NUM_REGS
};

, . - , , 00000000 xxxxxxxx, — , — : unavail. — . , qFeatures (TBD: !) , — .


, ?


: https://github.com/h4tr3d/gdbproxy/


, BSD MIT. OpenOCD (, : , , , ). .


: . , , RTOS, . . .


?


XSDK:


  1. — GDB , System Debugger
  2. GDB, 4002 ( gdbproxy, )
  3. gdbproxy, XSDK hw_server :
    ./gdbproxy --port 4002 --remote-host localhost --remote-port 3002 -- mb_freertos
  4. ...
  5. PROFIT!

Bei Verwendung der Fernbedienung hw_servermuss diese aufgrund der geringen Flexibilität der XSDK-Konfiguration gdbproxyauf demselben Computer wie ausgeführt werden hw_server.


Ergebnisse


Keiner. Nur das Fazit: Threading unter FreeRTOS und MicroBlaze wird unterstĂĽtzt.


All Articles