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 핀맵 연결

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

USB-FTDI 케이블 체크

혹시 usb-uart 케이블로 rpi4 에 ssh 를 붙여서 사용중이라면, usb 드라이버가 변경되지 않았는지 확인해보는게 좋다.

  • 만일 FTDIBUS 가 아니라, usbser 로 되어있다면 주기적으로 ssh 터미널에 backquote (0x60) 문자가 찍히는 문제가 발생할수 있기 때문이다.

추가적으로, 장치관리자 포트에서 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>

답글 달기