21.10.4.1. SEGGER J-Link 하드웨어 타겟 연결 및 GDB 서버 세션 수립

21.10.4.1. SEGGER J-Link 하드웨어 타겟 연결 및 GDB 서버 세션 수립

개발자 노트북 화면의 가상 터미널이 픽스호크 보드에 납땜 된 실제 ARM 프로세서의 신경망(Register)과 소통하기 위해서는, 소프트웨어와 하드웨어를 이어주는 통역사(Server)가 반드시 필요하다.

드론 해킹의 첫걸음, J-Link 디버거 연결부터 GDB 서버의 심장부를 깨우는 과정을 단계별로 파헤쳐보자.

1. 물리적 연결 (Physical Connection)

픽스호크 4(Pixhawk 4) 보드의 케이스를 살짝 벗겨내면, 한쪽 구석에 DEBUG 혹은 SWD/JTAG 라고 적힌 6핀짜리 초소형 커넥터가 보인다.
여기에 SEGGER J-Link (또는 ST-Link) 하드웨어 장비의 케이블을 딸깍 소리가 나도록 꽂아준다.

  • 배선 스펙: (VCC, GND, SWDIO, SWCLK, NRST) 5가닥의 생명선이 픽스호크와 디버거를 묶는다.
  • 컴퓨터 연결: J-Link 디버거의 반대쪽 USB 케이블을 우분투(Ubuntu) 컴퓨터에 꽂는다. (리눅스라면 dmesg 명령을 쳤을 때 SEGGER J-Link 장치가 올라와야 정상이다.)

2. GDB 서버(통역사) 구동하기

이제 내 우분투 컴퓨터에서, J-Link 장비로부터 올라오는 전기 신호(비트)를 C++ 디버깅 프로토콜(TCP)로 번역해 줄 백그라운드 서버 프로그램, JLinkGDBServer를 실행시켜야 한다.
(SEGGER 공식 사이트에서 리눅스용 J-Link Software Suite를 미리 깔아두어야 한다.)

새 터미널을 열고 다음 마법의 주문을 외워 통역사를 깨운다.

# -device: 픽스호크4의 메인 칩셋 이름 (STM32F765VI)
# -if: 통신 인터페이스 방식 (JTAG보다 속도가 빠른 SWD를 주로 쓴다)
# -port: GDB 클라이언트가 접속할 우분투 로컬 TCP 포트 번호 (보통 2331)

$ JLinkGDBServer -device STM32F765VI -if SWD -speed 4000 -port 2331

명령어를 치면 터미널에 녹색 글씨가 화려하게 올라오며, Waiting for GDB connection... 이라는 문구와 함께 서버가 청취(Listening) 상태로 진입한다.
이로써 내 컴퓨터의 localhost:2331 포트는 픽스호크의 심방(Cortex-M7) 베릴륨 코어로 직행하는 하이퍼루프가 되었다.

3. 타겟 펌웨어(ELF) 준비

통역사(Server)는 준비되었으니, 이제 뇌를 해킹할 해커(Client)를 부를 차례다.
하지만 해커(GDB)가 픽스호크의 뇌 속으로 다이빙하기 전에, 현재 픽스호크에 돌아가고 있는 기계어 덩어리들이 C++ 소스 코드의 어디에 해당하는지 완벽히 일대일 매칭되는 **디버깅 심볼(ELF 파일)**을 먹여주어야 한다.

만약 드론에 구워져 있는 펌웨어와, 내 컴퓨터에 있는 .elf 파일의 빌드 해시스탬프가 단 1비트라도 다르면, 해커는 엉뚱한 변수를 파괴해 보드 전체를 먹통으로 만들 수 있다.

이제 또 다른 터미널을 열고, PX4 펌웨어 소스가 있는 폴더로 들어가 이 elf 파일을 장전한 해커(arm-none-eabi-gdb)를 출격시키는 .gdbinit 자동화 스크립트의 세계인 21.10.4.1.1장으로 돌격하자. 여기서 우리는 변수 하나가 조금이라도 값이 튀는 순간 시간을 멈춰버리는 워치포인트(Watchpoint) 살인 기술을 배우게 된다.