1、jtag连接
OK1012A-C jtag引脚如下:
如果jlink的VCC对外输出供电,那么需要关闭,VCC对外供电导致jtag连接不上。使用引脚匹配的转接板连接开发板的jtag插座。使用交叉串口线连接开发板。
2、linux-5.3内核编译
-O0编译修改方法与树莓派4b编译修改方法一样。linux官网5.3不带网卡驱动,暂时不能使用网卡,官网的dtb也没有支持,暂时可以使用开发板出厂的dtb。要用jtag调试最好关掉CONFIG_ARM_CPUIDLE配置,开启CONFIG_ARM_CPUIDLE的时候,gdb的Ctrl+c暂停的时候大部分不会停在内核态,此时会导致jtag没有权限修改内核代码,没办法插入断点。
3、jtag调试内核
(ls1012a资料在NXP官网注册一下就可以自由下载,比树莓派更详细,因此用来调试内核也比较方便,ls1012a带pcie、SATA接口,接口也算比较齐全了)
ls1012a本来就是单核,不需要添加nosmp参数,只需要jtag能修改内核代码即可;jtag引脚默认就是jtag功能,也不需要修改IO口功能。
openocd配置文件直接使用openocd官网的文件再加jlink配置即可。
https://github.com/openocd-org/openocd/blob/master/tcl/target/ls1012a.cfg
openocd连接ls1012a:
gdb 连接openocd gdbserver:
连接上之后,内核正好运行在__cpu_do_idle函数,此时cpu处于内核态,jtag有权限修改内核的数据。
在entity_tick函数设置断点并查看调用栈:
因为使用的-O0编译,所以调用栈的参数一目了然,从handle_domain_irq函数参数可以看到定时器的硬件中断号为30,正是cortex-a53手册里面的中断号。
查看cfs_rq的内容: