1. 简介
Android的启动流程中,很多soc厂商在kernel启动前一阶段一般都是uboot。Starting kernel ...一般是默认情况下uboot能打印出的最后一行log.在这行log后面就是kernel的启动log.
在开发过程中,我至少遇到两次印象深刻的问题,就是导致卡在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中能直接看出来,
如上所示,kernel在ddr中的的运行地址是0x04280000,需要记住这个物理地址。
2.2 确定log_buf相对于kernel入口的偏移
如下图,查看编译输出文件System.map。在文件中查找如下两个符号,然后再相减,ffff00000a5c9680-ffff000008080000=0x2549680
2.3 在uboot中使用md命令查看内存信息
在上面已知了kernel实际的物理起始地址,以及log_buf相对于起始地址的偏移,因此很容易计算出log_bug在物理内存中的实际地址,
即把两者相减即可,0x042800000+0x2549680=0x067c9680.
然后在uboot中用md命令查看这段内存的数据,如下所示,通过不断的回车,可以一直显示完整的log内容,可以看下kernel中具体启动到哪里挂掉了,定位问题。
评论