调试Linux内核预解压阶段

6
我正在尝试使用GDB在Linux内核zImage解压缩之前进行调试。内核运行在ARM目标上,我连接了一个带有GDB服务器存根的JTAG调试器。目标必须加载引导加载程序。引导加载程序从闪存中读取内核映像,并将其放置在RAM中的0x20008000位置,然后跳转到该位置。
我已经启动了GDB并连接到远程目标,然后我使用GDB的add-symbol-file命令,如下所示:
add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow

当我为该地址设置断点时,它确实在正确的位置触发 - 就在分支到内核时。然而,GDB显示了来自arch/arm/boot/compressed/head.S源代码的错误行。它落后了4行。我该如何解决这个问题? 我还尝试使用add-symbol-file-s section addr选项,并使用-s .start 0x20008000; 这导致完全相同的问题。

首先确保您拥有兼容的gcc和gdb,最好来自同一工具链版本。此外,请注意Linux内核是使用-O2编译的,因此某些行会被优化掉。您确定没有任何.align关键字吗? - sessyargc.jp
解压缩器代码均为PC相对地址。它甚至可以将自身从一个区域复制到另一个区域。引导加载程序可能会将其放在解压后的目标位置,因此必须移动自身。如果使用固定符号进行JTAG调试,我怀疑您是否会有好的体验。我不知道是否可以通过GDB进行重定位。 - artless noise
似乎可以很好地用于使用Lauterbach T32进行解压缩调试。 - ria
1个回答

2

有汇编宏可以在使用低级别调试进行编译时打印出信息。您必须确保这些宏适用于您的板子。

linux-latest/arch/arm$ find . -name debug-macro.S | wc
 56      56    2306

找到适合您的开发板的文件,并确保正确的串行端口寄存器已触发。您可以在不使用JTAG的情况下为代码加上仪表。这些宏用于解压缩代码中。当然,要使用 *CONFIG_DEBUG_LL* 进行配置。
很可能ATAGs不正确或其他要求之一不满足。请查看 Documentation/arm/Booting 确保您正确设置了寄存器。请注意,最近的内核有一个新要求,需要发送一个dt列表。

当前的宏在arm include debug中(截至2015年1月v3.19)。另请参阅:compressed debug.S - artless noise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接