【问题标题】:Debug Linux kernel pre-decompression stage调试Linux内核预解压阶段
【发布时间】:2012-03-23 11:11:15
【问题描述】:

我正在尝试使用 GDB 在解压缩 Linux 内核 zImage 之前对其进行调试。内核在 ARM 目标上运行,我有一个 JTAG 调试器与一个 GDB 服务器存根连接到它。目标必须加载引导加载程序。引导加载程序从闪存读取内核映像并将其放入 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;这会导致完全相同的问题。

【问题讨论】:

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

标签: linux-kernel gdb embedded arm


【解决方案1】:

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

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

为您的开发板找到文件并确保命中正确的串行端口寄存器。您可以在不使用 JTAG 的情况下检测代码。这些宏用于解压缩代码。当然配置 *CONFIG_DEBUG_LL*。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2019-01-25
  • 1970-01-01
  • 2013-10-20
相关资源
最近更新 更多