linux-kernel - 调试Linux内核预解压阶段

标签 linux-kernel gdb embedded arm

我正在尝试使用 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/

相关文章:

c++ - 像在 python 和 R 中一样单步执行 C++ 程序

c - 在 C 中处理动态函数参数

c - 除了用作全局变量之外,如何使用 'flag' 变量?

C51 编译器 - 写入 xdata

c - sk_buff 复制 & sk_buff 克隆

c - Linux 模块拒绝对 BIOS 的写入权限?

linux - 核心转储仅显示一个堆栈帧

linux-kernel - Buildroot:如何修改自定义板的设备树?

linux - register_chrdev_region 和 alloc_chrdev_region 分配设备号有什么区别?

linux - 从可执行文件中剥离除指定调试信息之外的所有信息