0

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

我能够__enable_mmu使用串行端口调试 Linux Kernel 3.0.1 引导过程,直到在 head.S 中定义的函数。

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

我已经浏览了 linux-arm-kernel 邮件列表档案并且我已经尝试过他们的printascii()工作。但是我仍然无法在__turn_mmu_on.

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

还有一件事——我没有 JTAG。

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

4

2 回答 2

0

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

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

于 2014-01-28T14:09:31.013 回答
0

-

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

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

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

因此,在调用 __turn_mmu_on 之后无法跟踪流程似乎很正常。

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

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

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

谢谢。

于 2012-09-27T03:29:05.517 回答