arm 보드를 공부하고 싶은데, Trace32 가 없어서 지식적으로밖에 접근이 안되는 문제가 있다.
문제의식이나 감각을 얻을수 있는 방법(JTAG 도구)이 필요하다.
OpenOCD 연결을 수행한다.
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
sudo apt install gcc g++ gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu git gdb-multiarch bison flex libncurses-dev libssl-dev
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
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/
커널, 모듈, dtb 설치는 끝났으나, jtag 설정과 nokaslr 설정이 추가되어야 한다.
mnt/fat32/config.txt 를 열고 아래 내용을 추가한다.
kernel=kernel8.img
enable_jtag_gpio=1
mnt/fat32/cmdline.txt 를 열고 아래 내용을 추가한다.
nokaslr rodata=off
root@user-virtual-machine:~/linux# sudo umount mnt/fat32
root@user-virtual-machine:~/linux# sudo umount mnt/ext4
vmware 종료 후 sd 카드를 리더기에서 제거
커널, 모듈, 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:~#
혹시 usb-uart 케이블로 rpi4 에 ssh 를 붙여서 사용중이라면, usb 드라이버가 변경되지 않았는지 확인해보는게 좋다.
추가적으로, 장치관리자 포트에서 USB Serial Port 없으면, zadig 에서 의심가는 장치를 선택하고
"USB CDC" 드라이버를 설치해준다.
설치하면, 아래 그림처럼 USB Serial Port 장치가 보이게 된다
https://www.msys2.org/ 에서 installer 를 다운로드 받아서 설치한다.
이후 MSYS2 MSYS 를 열고 아래 명령을 수행한다.
pacman -Syu
pacman -Su
pacman -S gdb-multiarch
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
ubuntu22 vm 공유폴더를 통해 복사해온다.
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 를 압축해제했던 곳에서 powershell 을 열고 아래와 같이 실행
PS C:\Users\wongu\Downloads\openocd-20231002\OpenOCD-20231002-0.12.0\bin> .\openocd.exe -f .\dp_busblaster.cfg -f .\raspi4.cfg
MSYS2 Mingw64 에서 아래와 같이 실행, 연결후 bp 와 구조체 값 확인 됨을 확인
정리하다보니 괜찮은 블로그를 하나 찾았다. 추후 시간이 되면 읽어보려고 한다.
https://ahyuo79.blogspot.com/2020/02/openocd-ftdi-jtag.html
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>
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)