调试Linux内核预解压缩阶段

Sha*_*off 5 embedded gdb arm linux-kernel

我试图在解压缩之前使用GDB来调试Linux内核zImage.内核在ARM目标上运行,我有一个JTAG调试器与GDB服务器存根连接.目标必须加载引导加载程序.引导加载程序从闪存中读取内核映像并将其放入RAM中0x20008000,然后分支到该位置.

我已经启动了GDB并连接到远程目标,然后我使用GDB的add-symbol-file命令:

add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow
Run Code Online (Sandbox Code Playgroud)

当我为该地址设置断点时,它会陷入正确的位置 - 当它分支到内核时.但是,GDB显示了错误的来源arch/arm/boot/compressed/head.S.它落后了4条线.我怎样才能解决这个问题?

我也尝试添加-s section addr选项add-symbol-file-s .start 0x20008000; 这导致完全相同的问题.

art*_*ise 3

有一些汇编器宏可以在使用低级调试进行编译时打印出内容。您必须确保宏适合您的主板。

linux-latest/arch/arm$ find . -name debug-macro.S | wc
 56      56    2306
Run Code Online (Sandbox Code Playgroud)

找到适合您的板的文件并确保命中正确的串行端口寄存器。您无需使用 JTAG 即可检测代码。这些宏在解压缩代码中使用。当然使用*CONFIG_DEBUG_LL*进行配置。

ATAG 很可能不正确或不符合其他要求之一。检查Documentation/arm/Booting以确保寄存器设置正确。请注意,最近的内核有一个发送dt列表的新要求。