Linux kernel 调试Linux内核预解压缩阶段

Linux kernel 调试Linux内核预解压缩阶段,linux-kernel,gdb,embedded,arm,Linux Kernel,Gdb,Embedded,Arm,我试图在解压缩Linux内核zImage之前使用GDB对其进行调试。内核在ARM目标上运行,我用GDB服务器存根连接了一个JTAG调试器。目标必须加载引导加载程序。引导加载程序从闪存读取内核映像,并将其放入位于0x20008000的RAM中,然后分支到该位置 我已启动GDB并连接到远程目标,然后使用GDB的addsymbol file命令,如下所示: add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow 当我为

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

我已启动GDB并连接到远程目标,然后使用GDB的
addsymbol file
命令,如下所示:

add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow
当我为那个地址设置一个断点时,它确实会在正确的位置陷阱——就在它分支到内核的时候。但是,GDB从
arch/arm/boot/compressed/head.S
的源代码中显示了错误的行。后面四行。如何解决此问题?


我还尝试使用
-s将
-s节addr
选项添加到
添加符号文件
。启动0x20008000
;这会导致完全相同的问题。

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

linux-latest/arch/arm$ find . -name debug-macro.S | wc
 56      56    2306
找到电路板的文件,确保找到正确的串行端口寄存器。您可以使用JTAG插入代码,而不使用out。这些宏用于解压代码中。当然可以使用*CONFIG\u DEBUG\u LL*进行配置


最有可能的是,ATAG不正确,或者是其他要求之一。检查文档/arm/引导以确保正确设置了寄存器。注意,最近的内核有一个新的要求,即发送一个dt列表。

首先确保您有一个兼容的gcc和gdb,最好来自相同的工具链版本。另外,要知道Linux内核是用-O2编译的,所以有些行会得到优化。你确定没有。在某个地方对齐关键字吗?解压程序代码都是与PC相关的。它甚至可以将自己从一个区域复制到另一个区域。引导加载程序可以将其放在解压缩目标所在的位置;所以它必须自己移动。我怀疑你是否会在使用带有固定符号的JTAG时玩得开心。我不知道你是否可以用GDB重新定位。似乎可以很好地用Lauterbach T32调试解压当前宏(截至2015年1月v3.19)。另见: