rpi4 OpenOCD 연결

Cute_Security15·2024년 2월 7일
0

커널

목록 보기
6/10
post-thumbnail

상황

arm 보드를 공부하고 싶은데, Trace32 가 없어서 지식적으로밖에 접근이 안되는 문제가 있다.
문제의식이나 감각을 얻을수 있는 방법(JTAG 도구)이 필요하다.

목적

OpenOCD 연결을 수행한다.

환경

host 머신

  • windows 11 MSYS2 mingw64 (rpi4 소스는 vmware 내 ubuntu22 vm 에서 빌드)

target 보드

  • raspberry pi 4

JTAG debugger

작업 순서

사전 작업

  • SD 카드에 rpi4 설치 ( 이 이미지를 사용하진 않고, partition 만 사용할 것 )
  • raspberry pi imager 를 이용해서 설치
  • 주의사항 : 케이블 달린(허브형) sd 카드 리더기를 사용하면 전력이 부족하여 중간에 실패될수 있음
    (노트북이라면 내장 sd 카드 리더기, 혹은 스틱형 sd 카드 리더기를 사용 추천)

가이드 문서

https://linaro.atlassian.net/wiki/spaces/TCWGPUB/pages/25296346120/Raspberry+Pi+Linux+kernel+debugging+with+OpenOCD
https://linaro.atlassian.net/wiki/spaces/TCWGPUB/pages/25256953128/Getting+started+with+OpenOCD+Development
https://www.raspberrypi.com/documentation/computers/linux_kernel.html#default_configuration
https://m.blog.naver.com/kimmingul/222330519820
https://github.com/msys2/MSYS2-packages/issues/1216#issuecomment-945432771

vm 에 커널 의존성 설치

sudo apt install gcc g++ gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu git gdb-multiarch bison flex libncurses-dev libssl-dev

vm 에 커널 다운로드

git clone --depth=1  https://github.com/raspberrypi/linux.git

커널 빌드

16core 기준 커널 빌드에 약 30분, 모듈 설치에 약 10분 소요

root@user-virtual-machine:~/linux# make mrproper
root@user-virtual-machine:~/linux# KERNEL=kernel8
root@user-virtual-machine:~/linux# make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

// Kernel Hacking -- Compile-time checks ... -- Debug information ... -- Generate Dwarf 4 ...
//                                                                    -- Provide GDB scripts ...
root@user-virtual-machine:~/linux# make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

// 커널, 모듈, dtb 정보 빌드
root@user-virtual-machine:~/linux# make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j20

SD 카드 준비

  • vmware 에 인식이 안되는 문제가 있어, add hard disk 메뉴에서 'physical disk' 로 추가하는 방식을 사용하였다.
  • disk 타입 : SCSI

SD 카드에 설치

root@user-virtual-machine:~/linux# mkdir mnt/fat32
root@user-virtual-machine:~/linux# mkdir mnt/ext4
root@user-virtual-machine:~/linux# mount /dev/sdb1 mnt/fat32
root@user-virtual-machine:~/linux# mount /dev/sdb2 mnt/ext4

root@user-virtual-machine:~/linux# env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install -j20

root@user-virtual-machine:~/linux# sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
root@user-virtual-machine:~/linux# sudo cp arch/arm64/boot/Image mnt/fat32/$KERNEL.img
root@user-virtual-machine:~/linux# sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/
root@user-virtual-machine:~/linux# sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
root@user-virtual-machine:~/linux# sudo cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/

config.txt, cmdline.txt 설정 추가

커널, 모듈, dtb 설치는 끝났으나, jtag 설정과 nokaslr 설정이 추가되어야 한다.
mnt/fat32/config.txt 를 열고 아래 내용을 추가한다.

kernel=kernel8.img
enable_jtag_gpio=1

mnt/fat32/cmdline.txt 를 열고 아래 내용을 추가한다.

nokaslr rodata=off

SD 카드 제거

root@user-virtual-machine:~/linux# sudo umount mnt/fat32
root@user-virtual-machine:~/linux# sudo umount mnt/ext4

vmware 종료 후 sd 카드를 리더기에서 제거

rpi4 에 gcc, libgcc 재설치

커널, 모듈, dtb 설치 이후 gcc 재설치를 수행해준다.

root@raspberrypi:~# apt-get reinstall gcc libgcc

이는 gcc 에서 아래와 같은 문제가 발생하기 때문이다.

root@raspberrypi:~# gcc -o hello hello.c
/usr/bin/ld: cannot find crtbeginS.o: No such file or directory
/usr/bin/ld: cannot find -lgcc: No such file or directory
/usr/bin/ld: cannot find -lgcc: No such file or directory
collect2: error: ld returned 1 exit status
root@raspberrypi:~#

gpio 핀맵 연결

  • 가이드 문서 표대로 연결
  • 연결된 모습

FTDIBUS 드라이버 인식유무 확인

rpi4 에 ssh 를 붙여서 사용하는 경우, 윈도우 usb 드라이버가 "usbser" 로 잡혀있다면,
ssh 터미널에 주기적으로 backquote (0x60) 문자가 찍히는 문제가 발생할수 있다.

먼저 드라이버와 장치명을 확인한다.

  • 올바른 드라이버 : FTDIBUS

  • 올바른 장치명 : USB Serial Port

드라이버가 usbser 라면, 장치관리자에서 드라이버를 삭제하고, 아래 링크에서 받은 실행파일로 설치 후 재부팅한다.

COM 포트가 아예 보이지 않는다면

추가적으로, 장치관리자 포트에서 USB Serial Port 가 없으면, zadig 에서 의심가는 장치를 선택하고
"USB CDC" 드라이버를 설치해준다.

설치하면, 아래 그림처럼 USB Serial Port 장치가 보이게 된다

MSYS2 설치

https://www.msys2.org/ 에서 installer 를 다운로드 받아서 설치한다.
이후 MSYS2 MSYS 를 열고 아래 명령을 수행한다.

pacman -Syu
pacman -Su

gdb-multiarch 설치

pacman -S gdb-multiarch

openocd 압축해제, 설정파일 복사

https://gnutoolchains.com/arm-eabi/openocd/ 에서 windows 용 openocd 압축파일을 받아서 해제해준다.

해제된 디렉토리로 BusBlaster / rpi4 설정파일을 복사

set _CHIPNAME bcm2711
set _DAP_TAPID 0x4ba00477

adapter_khz 1000

transport select jtag
reset_config trst_and_srst

telnet_port 4444

# create tap
jtag newtap auto0 tap -irlen 4 -expected-id $_DAP_TAPID

# create dap
dap create auto0.dap -chain-position auto0.tap

set CTIBASE {0x80420000 0x80520000 0x80620000 0x80720000}
set DBGBASE {0x80410000 0x80510000 0x80610000 0x80710000}

set _cores 4

set _TARGETNAME $_CHIPNAME.a72
set _CTINAME $_CHIPNAME.cti
set _smp_command ""

for {set _core 0} {$_core < $_cores} { incr _core} {
    cti create $_CTINAME.$_core -dap auto0.dap -ap-num 0 -ctibase [lindex $CTIBASE $_core]

    set _command "target create ${_TARGETNAME}.$_core aarch64 \
                    -dap auto0.dap  -dbgbase [lindex $DBGBASE $_core] \
                    -coreid $_core -cti $_CTINAME.$_core"
    if {$_core != 0} {
        set _smp_command "$_smp_command $_TARGETNAME.$_core"
    } else {
        set _smp_command "target smp $_TARGETNAME.$_core"
    }

    eval $_command
}

eval $_smp_command
targets $_TARGETNAME.0

소스코드, 심볼파일을 MSYS2 Mingw64 로 복사

ubuntu22 vm 공유폴더를 통해 복사해온다.

  • 소스코드는 빌드에 사용한 디렉토리가 아니여도 상관없음
  • (빌드된 디렉토리는 무거우므로, 가급적 새 소스코드를 checkout 받아서 압축후 가져오는걸 추천)
  • 심볼파일은 빌드에 사용한 디렉토리 root 에 있는 vmlinux 를 복사
wongu@BOOK-6B7E312A7I MINGW64 ~
$ ls
linux.tar.gz  vmlinux

wongu@BOOK-6B7E312A7I MINGW64 ~
$

linux.tar.gz 을 압축 해제

export MSYS=winsymlinks:lnk
tar xf linux.tar.gz

openocd 실행

openocd 를 압축해제했던 곳에서 powershell 을 열고 아래와 같이 실행

PS C:\Users\wongu\Downloads\openocd-20231002\OpenOCD-20231002-0.12.0\bin> .\openocd.exe -f .\dp_busblaster.cfg -f .\raspi4.cfg

gdb-multiarch 실행

MSYS2 Mingw64 에서 아래와 같이 실행, 연결후 bp 와 구조체 값 확인 됨을 확인

profile
관심분야 : Filesystem, Data structure, user/kernel IPC

5개의 댓글

comment-user-thumbnail
2024년 2월 14일

2가지 아쉬운 점이 있다.
1) do_softirq 같은 곳에선 변수들이 optimized out 되어있다는 점이다.
optimize 레벨을 0 으로 해서 빌드하면 볼수 있겠지만, 커널 빌드가 안되고, greg-kh 답변으로는
그냥 바꾸지말고 있는그대로 써달라고 한다.

2) vmlinux-gdb.py 사용이 불가한 문제가 있다.
현재 ntfs 파일시스템 위에 MSYS2 Mingw64 를 쓰는거라, 심볼릭 링크가 .lnk 파일로
만들어 지게된다. 따라서 gdb-multiarch 를 실행하고 source vmlinux-gdb.py 를 하면
아래와 같은 에러가 뜨면서 실패가 된다.
(gdb) source /msys64/home/wongu/linux/vmlinux-gdb.py.lnk
/msys64/home/wongu/linux/vmlinux-gdb.py.lnk:1: Error in sourced command file:
Undefined command: "L". Try "help".
(gdb)

1개의 답글
comment-user-thumbnail
2024년 2월 14일

정리하다보니 괜찮은 블로그를 하나 찾았다. 추후 시간이 되면 읽어보려고 한다.
https://ahyuo79.blogspot.com/2020/02/openocd-ftdi-jtag.html

답글 달기
comment-user-thumbnail
2024년 2월 21일

rpi4 와 rpi5 간에는 커널호환이 된다. 그래서 혹시 raspi4.cfg 로도 openocd 가 붙나 시도해보았는데, 아쉽게도 붙지 않는다

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 1000 kHz
Error: JTAG scan chain interrogation failed: all zeroes
Error: Check JTAG interface, timings, target power, etc.
Error: Trying to use configured scan chain anyway...
Error: auto0.tap: IR capture error; saw 0x00 not 0x01
Warn : Bypassing JTAG setup events due to errors
Error: Invalid ACK (0) in DAP response

PS C:\Users\wongu\Downloads\openocd-20231002\OpenOCD-20231002-0.12.0\bin>

답글 달기