树莓派4b linux内核调试(jtagkgdb)
Posted arm7star
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派4b linux内核调试(jtagkgdb)相关的知识,希望对你有一定的参考价值。
1、-O0编译树莓派4b linux内核(linux-5.10.95)
内核源码分支:
https://github.com/raspberrypi/linux/tree/rpi-5.10.y
参考其他网站,注释掉arch/arm64/include/asm/jump_label.h文件里面的内联汇编分支;
修改arch/arm64/include/asm/memory.h里面的MIN_THREAD_SHIFT为"(15 + KASAN_THREAD_SHIFT)",因为-O0编译的函数局部变量不会被优化,局部变量使用栈内存,调用层次过深会导致内核栈越界,所以增加内核栈大小;
将Makefile里面的CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE下面的KBUILD_CFLAGS修改为“KBUILD_CFLAGS += -O0”;
关闭虚拟化,-O0下暂时没有调通虚拟化;
其他编译错误能屏蔽的屏蔽,少数未定义函数是编译检查使用的,-O1及更高级别不存在这类非法的函数调用,可以写成空函数或者直接注释掉调用的地方,其他大部分未定义函数是别的未打开编译选项模块的函数,正常需要加编译开关,-O1及更改级别不会报错,是因为编译器检查到这部分函数不会被调用,直接优化掉了对应代码,-O0不优化就保留了这部分函数调用,所以-O0根据具体情况注释掉相关代码调用即可;
如果默认没有打开生成调试信息,那么打开内核生成调试信息的开关。
2、jtag连接树莓派4b
下图从别的网站拷贝过来,下图左上角标注了各脚的连接方法,例如TCK对应树莓派的GPIO25,冒号后边对应的是FT232H的引脚,也就是FT232H的D0连接树莓派的GPIO25,RTCK可以不接;对于其他jtag工具,其接法也是一样,如果连接有问题,那么可以尝试把jtag其他引脚也连接上;便宜的jlink V9也支持,jlink V9需要接地、参考电压引脚。
按照网上方法修改tf卡的配置文件使能jtag!
3、openocd连接树莓派
在连接树莓派前,先在cmdline.txt里面添加"rodata=off nosmp"参数,"rodata=off"的作用是使内核代码段可写,低版本内核通过内核配置项设置,高版本内核在命令行添加参数即可,nosmp是让内核以单核的方式运行,只运行一个核,其他核不跑内核,目前调试多核不是很完善,待验证调试,目前先以单核运行问题不大。
树莓派4b配置文件:
https://github.com/openocd-org/openocd/blob/master/tcl/target/bcm2711.cfg
ft232h配置文件:
interface ftdi
ftdi_vid_pid 0x0403 0x6014
ftdi_layout_init 0x0078 0x017b
adapter_khz 1000
ftdi_layout_signal nTRST -ndata 0x0010 -noe 0x0040
ftdi_layout_signal nSRST -ndata 0x0020 -noe 0x0040
将配置文件合并到一个文件即可。
开发板上电,在电脑上执行"openocd -f <openocd配置文件>"连接树莓派4b:
(3333~3336为每个核的gdbserver监听端口,核0监听的端口为3333,nosmp参数使内核只运行在核0上面,所以gdb需要连接3333端口)
4、gdb连接树莓派4b
openocd实现的功能与gdbserver一样,gdb连接3333端口即可连接开发板并调试;在gdb里面执行”target remote :3333“即可连接openocd的gdbserver,连接如下所示:
查看调度器的tick调用栈:
查看cpu寄存器:
单步执行等调试命令与调试应用程序没什么区别,线程查看不一样,jtag看到的是核,一个核也就是一个线程。
4、kgdb调试
ARM64 kgdb单步需要给内核打补丁,请参考网上的修改方法修改,然后编译的时候打开KGDB及KGDB串口选项,关闭KDB。
kgdb调试多核问题不大,可以不用nosmp参数。
使用串口作为输入输出以及kgdb调试串口,使用agent-proxy代理串口,具体使用方法参考网上其他文档。
在开发板上设置调试串口:
echo ttyAMA0,115200 > /sys/module/kgdboc/parameters/kgdboc
在开发板执行如下命令进入调试模式等待gdb连接:
echo g >/proc/sysrq-trigger
过程如下:
gdb连接开发板:
其他操作与jtag调试一致,目前Ctrl+c不能暂停开发板,在开发板再次执行”echo g >/proc/sysrq-trigger“可以暂停,但是之前gdb设置的断点都没有了,jtag不存在此问题,另外与jtag不同的是,kgdb看到的是内核线程,kgdb是基于内核的,jtag是基于cpu的,jtag不感知linux的存在。
以上是关于树莓派4b linux内核调试(jtagkgdb)的主要内容,如果未能解决你的问题,请参考以下文章