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:~#
rpi4 에 ssh 를 붙여서 사용하는 경우, 윈도우 usb 드라이버가 "usbser" 로 잡혀있다면,
ssh 터미널에 주기적으로 backquote (0x60) 문자가 찍히는 문제가 발생할수 있다.
먼저 드라이버와 장치명을 확인한다.
올바른 드라이버 : FTDIBUS
올바른 장치명 : USB Serial Port
드라이버가 usbser 라면, 장치관리자에서 드라이버를 삭제하고, 아래 링크에서 받은 실행파일로 설치 후 재부팅한다.
추가적으로, 장치관리자 포트에서 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)