我正在尝试启动安卓4.0.1 (冰淇淋三明治),基于Linux内核3.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内核启动过程的解决方案?
发布于 2012-09-27 11:29:06
-
嗨,你好,我不知道你的问题,但我有一些想法。
在Linux源代码中,有以下几点:
/* *启用内存管理单元。这完全改变了可视的结构
*内存空间。您将无法通过它来跟踪执行情况。
*如果您对此有疑问,请查看linux-arm-kernel
*邮件列表存档,然后再向列表发送另一个帖子。
*
* r0 = cp#15控制寄存器
* r1 =机器ID
* r2 =标签或dtb指针
* r9 =处理器ID
* r13 =完成后跳转到的虚拟地址
*
*其他寄存器依赖于完成时调用的函数
*/ .align 5
.pushsection .idmap.text, "ax"条目(__turn_mmu_on)
……
……
__turn_mmu_on_end:
ENDPROC(__turn_mmu_on)
.popsection 因此,在调用__turn_mmu_on之后无法跟踪流似乎是很正常的。
但是,根据您使用printascii()的结果,您有没有调试过为什么它不可用?
你知道printascii()在没有配置的情况下是否易于使用吗?在使用它之前有没有必要的设置?你为它提供了一个可运行的环境吗?
由于缺少JTAG,打印可能是剩下的唯一方法,因此调试printascii()可能是必须的。
谢谢。
发布于 2014-01-28 22:09:31
最有可能的是你有一个内存转换配置问题。打开MMU后,必须使用已映射到原始硬件地址(您之前使用的)的虚拟地址来访问串行设备。
要调试问题,您需要确保设置了正确的虚拟地址,并且内存映射配置是设备的内存映射配置。通常,设备内存映射是静态完成的,所以如果您看不到源文件中的错误,您也应该能够在调用__enable_mmu之前输出值。
https://stackoverflow.com/questions/12559402
复制相似问题