【问题标题】:How to debug Linux kernel Boot process after __turn_mmu_on stage?如何在 __turn_mmu_on 阶段后调试 Linux 内核引导过程?
【发布时间】:2014-01-28 22:09:31
【问题描述】:

我正在尝试在自定义硬件上启动基于 Linux 内核 3.0.1 的 Android 4.0.1(冰淇淋三明治)。

我可以使用串口调试 Linux Kernel 3.0.1 启动过程,直到在 head.S 中定义的__enable_mmu 函数。

但一旦执行__turn_mmu_on 功能,我就无法调试启动过程。

我浏览了 linux-arm-kernel 邮件列表档案,并尝试了他们的 printascii() 解决方法。但在__turn_mmu_on 之后,我仍然无法在串行控制台上看到任何启动日志。

在这里我可以在__turn_mmu_on 之前获取日志,所以我的串行控制台端口工作正常。

还有一件事 - 我没有 JTAG。

谁能提供在打开MMU后如何调试Linux内核启动过程的解决方案?

【问题讨论】:

  • 不使用 JTAG 有什么特别的原因吗? (例如,缺少标题?)。如今,基本的 JTAG 调试探针的代码相当低,而且成本可能比您辛苦地做的时间要少。
  • 您好,感谢您的回复。但是我们定制板的 JTAG 将在 1 个月后提供给我。因此,在我获得 JTAG 之前,您能否提供任何替代解决方案来调试它。

标签: android linux linux-kernel embedded-linux mmu


【解决方案1】:

-

你好,我不知道你的问题,但有一些想法。

在Linux源码中,有以下几点,

/* * 启用 MMU。这完全改变了可见的结构
* 内存空间。您将无法通过此跟踪执行。
* 如果您对此有任何疑问,检查 linux-arm-kernel
* 在将另一个帖子发送到列表之前,邮件列表存档。
*
* r0 = cp#15 控制寄存器
* r1 = 机器 ID
* r2 = atags 或 dtb 指针
* r9 = 处理器 ID
* r13 = 虚拟完成后跳转到的地址
*
* 其他寄存器取决于完成时调用的函数
*/ .align 5
.pushsection .idmap.text, "斧头"
ENTRY(__turn_mmu_on)
....
....
__turn_mmu_on_end:
ENDPROC(__turn_mmu_on)
.popsection

所以,调用 __turn_mmu_on 后无法追踪流程似乎很正常。

但是,根据您使用 printascii() 的结果,您是否调试过它为什么不可用?

你知道 printascii() 在没有任何配置的情况下是否易于使用吗?使用前是否有任何必要的设置? 是否为它提供了可运行的环境?

由于缺少 JTAG,打印可能是唯一剩下的一种方法,因此调试 printascii() 对您来说可能是必须的。

谢谢。

【讨论】:

  • 您好感谢您的回复。但我之前也在我们的一个项目中使用过 printascii(),所以我对 printascii() 工作所需的所有内核配置有什么背景知识。此外,它还在 Linux ARM 邮件列表中提供。即使在尝试了所有这些之后,我也无法在串行控制台上获得任何数据。因此,如果对上述问题有任何指示,那将非常有帮助。
【解决方案2】:

您很可能遇到了内存转换配置问题。打开 MMU 后,必须使用已映射到原始硬件地址(您之前使用的)的虚拟地址访问串行设备。

要调试您的问题,您需要确保已设置正确的虚拟地址并且内存映射配置是设备的配置。通常设备内存映射是静态完成的,因此如果您看不到源文件中的错误,您也应该能够在调用 __enable_mmu 之前输出值。

【讨论】:

    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多