Uboot引导kernel问题小结 linux
图1:app
问题一,wrong image format for bootm command问题post
原来要用uboot的tools文件中的mkimage命令把zImage格式改为uImage格式。那么uboot就能够认识了。uImage比zImage多0x40个byte的头。spa
问题二,done, booting the kernel问题追踪指针
1,因为没法保存env。因此去查问题,发现原来nand write都没法写入。orm
因而修改了s3c2410_nand.c文件,即解决了问题。blog
2,怀疑typeID不对。后来进过打印信息,看uboot的id,没问题。而后看tq uboot的ID也是168,tq的uboot能引导。那么说明ID是正确的。内存
3,因而没方向了。把参数设置为和tq的env参数一致,等等不一样参数的设置,都尝试过了。不行。ci
4,开始查uboot是如何引导kernel的源码流程。知道了在bootm.c文件中。可是uboot是如何调用kernel的呢?PC指针式如何指向的呢?后来才知道r0,r1,r2传递过去的。另外查了下kernel的地址是bootm告诉uboot的。postmessage
5,接着无心间发现别人看30000100内存。我也想办法看内存信息,这样就知道要传递的参数是否正确了。
6,因而发现kernel参数真的不正确。如图1:
7,因而开始关注这些TAG及地址0x5442000x等。在apple2440.h中添加了宏开关后终于解决了问题。不过暂时发现CONFIG_INITRD_TAG定义了没有用。而我以前CONFIG_SETUP_MEMORY_TAGS宏是开了,可是CONFIG_CMDLINE_TAG没开,打开后,就能引导kernel了。
uboot问题:关于uboot引导uImage的问题 ———————————————————— 一、-a参数后是内核的运行地址,-e参数后是入口地址。 二、 1)若是咱们没用mkimage对内核进行处理的话,那直接把内核下载到0x30008000再运行就行,内核会自解压运行(不过内核运行须要一个tag来传递参数,而这个tag建议是由bootloader提供的,在u-boot下默认是由bootm命令创建的)。 2)若是使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供创建tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。 (1)若是不一样的话会从这个地址开始提取出这个64byte的头部,对其进行分析,而后把去掉头部的内核复制到-a指定的load地址中去运行之 (2)若是相同的话那就让其原封不一样的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。 ———————————————————————————————— 地址不相同时: [root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage.img Image Name: linux-2.6.14 Created: Fri Jan 12 17:14:50 2007 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MB Load Address: 0x30008000 Entry Point: 0x30008000 地址不相同时: [root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.imgImage Name: linux-2.6.14Created: Fri Jan 12 17:14:50 2007Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MBLoad Address: 0x30008000Entry Point: 0x30008040——————————————————————————————————终于明白了freescale手册中用mkimage制做uImage的命令:mkimage -A arm -O linux -T kernel -C none -a 0x90008000 -e 0x90008000 -n "Linux-<2.6.31>-xie-20110714-1" -d zImage-7-14 uImage-7-14该命令属于实际loadaddr(0x90800000)与-a(0x90008000)选项后的地址不一样,故uboot会分析64字节头部,而后将内核复制到0x90008000,并从入口地址运行内核。————————————————————若是要把内核载入到0x90008000这个地址,且使之能运行,mkimage的命令以下:mkimage -A arm -O linux -T kernel -C none -a 0x90008000 -e 0x90008040 -n "Linux-<2.6.38>-xie-20110720-3-2" -d zImage-38-3 uImage-38-3 |