u-boot-2014.10移植第31天----内核启动(一)

时间:2022-10-03 17:16:12

硬件平台:tq2440

开发环境:Ubuntu-3.11

u-boot版本:2014.10

本文允许转载,请注明出处:http://blog.csdn.net/fulinus


原本以为u-boot移植好了,引导linux内核启动不是问题吧。但是却折磨了我两天,一直在“Starting kernel...”这里卡住了。综合网上的说法出现这个问题有如下原因:

1)u-boot和linux内核主频不匹配;

2)u-boot和linux内核机器码不匹配;

3)bootarges参数数不对;

3)内核中没有添加串口相关的驱动;

实际情况是这些在我这里都是正确的。因为我用u-boot-2010.09引导linux内核启动是没有问题的,换成u-boot-2014.10就不行。。。。。。

什么信息也没有打印,除了:

Starting kernel...

这条信息是u-boot打印的,安装正常的启动,下面是会有内核打印的:

Uncompressing Linux... done, booting the kernel.

但是没有。我换了了很多种方式,反复组合测试,反复烧录,反复测试。。。。我简直就要疯了,什么情况?!

我就这么反复折腾,也不知道什么时候,我就用了go命令,出现了Uncompressing Linux... done, booting the kernel.信息,但是还是没有成功!j-link烧录又一次居然可以了正常引导启动了。

于是我再用:

tftp 30008000 zImage;go 30008000

不行,我突然想到go命令是直接设置pc地址的,不像bootm会传入参数给linux内核,于是我就讲内核中启动参数设置成:

console=ttyS0,115200 mem=64M init=/linuxrc rw loglevel=7

再运行,OK可以了。用go命令是可以的。

前面偶然又一次机会用go命令成功,是因为我再使用它之前用了:

tftp 30008000 linuxrom-s3c2440.bin;bootm 30008000

虽然没有成功引导,但是bootm已经解压了内核镜像,而且参数也传入了内核(在一个特殊的地址处),如果不掉电复位,用J-link烧录并运行u-boot,再使用go 30008000,就在前面bootm解压后的基础上成功运行了linux内核。因此,问题的症结在bootm命令有问题,我比较了u-boot-2010.04,u-boot-2014.10,和u-boot-2015.01版本的cmd_bootm.c文件,发现都有很大的改动,估计是这里有个没有被开发人员发现的bug吧,后面有机会我会在找出这个bug。