Uboot引导kernel问题小结
图1:
问题一,wrong image format for bootm command问题
原来要用uboot的tools文件中的mkimage命令把zImage格式改成uImage格式。那么uboot就可以认识了。uImage比zImage多0x40个byte的头。
问题二,done, booting the kernel问题追踪
1,由于无法保存env。所以去查问题,发现原来nand write都无法写入。
于是修改了s3c2410_nand.c文件,即解决了问题。
2,怀疑typeID不对。后来进过打印信息,看uboot的id,没问题。然后看tq uboot的ID也是168,tq的uboot能引导。那么说明ID是正确的。
3,于是没方向了。把参数设置为和tq的env参数一致,等等不同参数的设置,都尝试过了。不行。
4,开始查uboot是如何引导kernel的源码流程。知道了在bootm.c文件中。但是uboot是如何调用kernel的呢?PC指针式如何指向的呢?后来才知道r0,r1,r2传递过去的。另外查了下kernel的地址是bootm告诉uboot的。
5,接着无意间发现别人看30000100内存。我也想办法看内存信息,这样就知道要传递的参数是否正确了。
6,于是发现kernel参数真的不正确。如图1:
7,于是开始关注这些TAG及地址0x5442000x等。在apple2440.h中添加了宏开关后终于解决了问题。不过暂时发现CONFIG_INITRD_TAG定义了没有用。而我之前CONFIG_SETUP_MEMORY_TAGS宏是开了,但是CONFIG_CMDLINE_TAG没开,打开后,就能引导kernel了。
uboot问题:关于uboot引导uImage的问题 ———————————————————— 1、-a参数后是内核的运行地址,-e参数后是入口地址。 2、 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.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: 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 |