Bug

卡在Starting Kernel时如何查看kernel log

adtxl
2023-08-15 / 0 评论 / 198 阅读 / 正在检测是否收录...

1. 简介

Android的启动流程中,很多soc厂商在kernel启动前一阶段一般都是uboot。Starting kernel ...一般是默认情况下uboot能打印出的最后一行log.在这行log后面就是kernel的启动log.

image.png

在开发过程中,我至少遇到两次印象深刻的问题,就是导致卡在Starting kernel...。由于没有kernel的log,导致很难继续debug。
这里记录一种方法,可以在uboot中直接查看kernel启动时log的方法。
当然,这个方法至少有两个前提:
第一,就是kernel确实启动起来了,但可能因为有问题,又没完全启动到console初始化完成,导致无法在串口输出kernel log。因为打印starting kernel ...并不一定代表uboot是正常的,打印完这行log后uboot还是有些其它准备动作的,如何问题是出在uboot中,kernel并未完成启动,那自然也没办法查看kernel log了。
第二,就是开发板必须有reset功能。也就是有reset按键,重启时ddr不断掉,数据不会丢失。因为卡在starting kernel后是没有办法再输命令的。只能按开发板中的reset回到uboot,或者有看门狗功能能自动重启。不过我也接触过一种开发板,可能是电源适配器的问题,虽然开发板上没有reset按键,但只要快速的开关电源,ddr上的数据也不会丢失。

2.实操

2.1 搞清楚kernel在ddr中的地址

也就是kernel在ddr中运行的起始地址,我做的是android项目,从log中能直接看出来,

image90b84c0671e528b1.png

如上所示,kernel在ddr中的的运行地址是0x04280000,需要记住这个物理地址。

2.2 确定log_buf相对于kernel入口的偏移

如下图,查看编译输出文件System.map。在文件中查找如下两个符号,然后再相减,ffff00000a5c9680-ffff000008080000=0x2549680

imagede3230f5d6d3c566.png

image651ce042be7a8ce3.png

2.3 在uboot中使用md命令查看内存信息

在上面已知了kernel实际的物理起始地址,以及log_buf相对于起始地址的偏移,因此很容易计算出log_bug在物理内存中的实际地址,
即把两者相减即可,0x042800000+0x2549680=0x067c9680.

然后在uboot中用md命令查看这段内存的数据,如下所示,通过不断的回车,可以一直显示完整的log内容,可以看下kernel中具体启动到哪里挂掉了,定位问题。

imagea47fd579e6dfb1c8.png

3

评论 (0)

取消