uboot引导内核的经验总结

Uboot的移植是参考了《移植u-boot-1.1.6到TQ2440文档.pdf》这篇文档做的,在移植的过程中出现了两个比较头疼的问题:

      一个是tftp下载程序到内存的实现。之前都不知道原来先要在windos系统下装好tftp服务器然后开启的,后来用了天嵌光盘资料里的tftp服务器,终于搞定了。值得注意的是,进入uboot之后要先用pri命令查看一下环境变量,修改好netmask、serverip、ipaddr和ethaddr,其中ethaddr可以随便设,只要格式对就可以。其他的根据不同的环境做相应的设置,设置完之后检查无误后保存环境变量。如果是连着无线网的要把无线关掉。

      已经完成了从nand启动,也已经参考其他文章移植好了内核和yaffs2文件系统。参照文档做好了zImage.img文件,用tftp服务器下载系统内核到内存中然后运行(yaffs2文件系统原来就已经下载到nandflash中了),但是出现了一个问题,bootm系统之后进不了控制台,挂载文件系统失败。然后我把天嵌开发板自带的uboot镜像,内核镜像、文件系统镜像烧录到nand中,本想用来排查问题,却没想到出了更多问题,到Uncompressing Linux....... done, booting the kernel就不动了。最后查出是启动参数的原因,用pri查看了一下居然没有bootargs这个环境变量。重新设置了bootargs之后就可以了,正常之后pri之后的参数如图所示。另外,群里有人说init不用设置也可以,如果不设置,内核会默认使用/sbin/init作为第一进程。这个期待以后尝试!

      现在bootm之后可以正常运行进入控制台了。但是,头痛的问题又来了,就是当我把内核固化到nand中,就是我用tftp 0x30000000 zImage.img、nand erase 0x200000 0x300000、nand write 0x30000000 0x200000 0x300000将zImage.img下载到内核分区之后,总是无法启动系统,反复出现

uboot引导内核的经验总结_第1张图片

这个问题折腾了我好久。后来发现问题出在

#mkimage -n 'linux-2.6.31' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img这条命令上,网上查得说要将制作zImage.img的参数改一改,即入口地址(entry point)要比加载地址(load address)多加0x40个字节。于是我在使用mkimage时的参数改成如下:mkimage -n 'linux-2.6.31' -A arm -O linux -T kernel -C none -a 0x30007fc0 -e 0x30008000 -d zImage zImage.img。然后问题又出现了,内核又引导失败,卡死在Starting kernel ...之后通过这篇文档得到启发。果断将bootcmd=nand read.jffs2 30008000 kernel;bootm 30008000改成bootcmd=nand read.jffs2 30007fc0 kernel;bootm 30007fc0,(bootcmd这个环境变量也是自己设置进去的,这个参数的作用是让uboot自动引导内核,之前没有这个参数的时候就算都是天嵌的出厂镜像也都无法直接启动内核,要选择[8] Boot the system才可以。设置bootcmd参数是通过set bootcmd nand read.jffs2 30008000 kerne\; bootm 30008000命令)。即将bootm的引导地址和mkimage时的加载地址保持一致就可以了。

    然后内核就被顺利得引导了,文件系统也挂载上去了,进入了控制台!

    后来又试了将天嵌出厂自带的uboot下载进去,但是不能正常引导系统,估计问题也是出在bootcmd这个参数上,应该都改回30008000就可以了。这个我就不管了!反正自己的uboot已经能正常引导内核,文件系统已经能够成功挂载了。

uboot引导内核的经验总结_第2张图片

加上bootcmd参数后的环境变量如下:

uboot引导内核的经验总结_第3张图片


你可能感兴趣的:(linux移植)