我正在尝试使用 GDB 在解压缩之前调试 Linux 内核 zImage。内核在 ARM 目标上运行,我有一个 JTAG 调试器与 GDB 服务器 stub 连接到它。目标必须加载引导加载程序。引导加载程序从闪存读取内核镜像并将其放入 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行。我怎样才能解决这个问题? 我也尝试添加
-s section addr
选项 add-symbol-file
与 -s .start 0x20008000
;这会导致完全相同的问题。
最佳答案
在使用低级调试进行编译时,有一些汇编宏会打印出内容。您必须确保宏适用于您的电路板。
linux-latest/arch/arm$ find . -name debug-macro.S | wc
56 56 2306
找到适合您电路板的文件并确保命中正确的串行端口寄存器。您无需使用 JTAG 即可检测代码。这些宏用于解压代码。当然用 *CONFIG_DEBUG_LL* 配置。
很可能 ATAG 不正确或其他要求之一。 checkout Documentation/arm/Booting 以确保您正确设置了寄存器。请注意,最近的内核有一个新要求,即发送 DT 列表。
关于linux-kernel - 调试Linux内核预解压阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9575817/