树莓派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)的主要内容,如果未能解决你的问题,请参考以下文章

树莓派Linux启动过程简介

#星光计划2.0# 添加树莓派4B到OHOS3.0编译框架

在鸿蒙(OHOS3.0)编译框架中添加树莓派4B

树莓派4B刷入OpenHarmony 3.0,目前可显示与触控

jtag调试ls1012a linux-5.3内核

jtag调试ls1012a linux-5.3内核