制作uImage,启动失败,大虾们进来看一下!
./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -d zImage uImage-a和-e后面跟的分别是image的载入地址和内核的入口地址,两者可以一样,也可以不一样,依据如下情况而定:
法一:当-a后面指定的地址和bootm xxxx后面的地址一样时,-e后面的地址必须要比-a后面的地址多0x40,也就是映像头的大小64个字节。因为当他们地址一样时,uboot是不会搬运映像的;
法二:当-a后面指定的地址和bootm xxxx后面的地址不一样时,uboot会将bootm xxxx地址处的映像文件搬运到-a指定的地址处,此时,-e和-a必须要一样,因为映像头并没有搬运过去,载入地址就是内核的入口地址。需要注意的是,因为uboot要重新搬运内核映像,所以要注意bootm xxxx的地址和-a之间的地址不要导致复制时的覆盖。
方法一,我验证过了,确实是可以正常启动内核,没有什么错误,但是方法二老是不能成功。具体做法如下:
./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008000 -d zImage uImage
设置bootm的启动地址为:bootm 0x30008040.
但是如此却无法启动内核,错误提示:
# bootm 0x30008040
Wrong Image Format for bootm command
ERROR: can't get kernel image!
然后把bootm的地址改为:bootm 0x30008000,提示如下错误(不断重启):
U-Boot 2009.08
I2C: ready
DRAM:64 MB
Flash:2 MB
NAND:64 MiB
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot:0
NAND read: device 0 offset 0x60000, size 0x200000
2097152 bytes read: OK
## Booting kernel from Legacy Image at 30008000 ...
Image Name: linux-2.6.32.60
Created: 2012-12-18 2:50:11 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1325624 Bytes =1.3 MB
Load Address: 30008000
Entry Point:30008000
Verifying Checksum ... OK
XIP Kernel Image ... OKOK
Starting kernel ...
data abort
pc : [<30008014>] lr : [<33f9e7b0>]
sp : 33f3fdf4ip : 33ef2c9c fp : 30000100
r10: 0000016ar9 : 33ef2ddc r8 : 33f3ffdc
r7 : 30008000r6 : 33fb0bf8 r5 : 00000000r4 : 33f3ffc0
r3 : 00000000r2 : 30000100 r1 : 0000016ar0 : 30000188
Flags: nzcvIRQs offFIQs offMode SVC_32
Resetting CPU ...
resetting ...
怎么没人帮忙解答,连路过的都没有么? mkimage用于制作uboot-format内核,应该不会出错啊。
你一定要确定你的地址是否正确。要跟uboot中定义的loadaddr一样才行! 当-a后面指定的地址和bootm xxxx后面的地址不一样时,uboot会将bootm xxxx地址处的映像文件搬运到-a指定的地址处,此时,-e和-a必须要一样,因为映像头并没有搬运过去,载入地址就是内核的入口地址。需要注意的是,因为uboot要重新搬运内核映像,所以要注意bootm xxxx的地址和-a之间的地址不要导致复制时的覆盖。
验证通过了,这句话没错,-a和-e指定的地址是:0x30008000,bootm可以在内存的任何位置(只要注意bootm xxxx的地址和-a之间的地址不要导致复制时的覆盖即可),系统正常启动。 shell.albert 发表于 2012-12-20 12:16 static/image/common/back.gif
mkimage用于制作uboot-format内核,应该不会出错啊。
你一定要确定你的地址是否正确。要跟uboot中定义的loa ...
你所说的loadaddr是指的内核存在flash的起始地址吧? 跟你的内核实现(or配置)有关系。你的方法二我一直在用,至少AT91, MX31,MX53...和我公司SoC的ARM内核没问题;而uboot实现方法一的初衷,我记得跟XIP kernel有关,即XIP kernel在NOR flash上原地执行,当然要跳过uImage头。
检查一下CONFIG_XIP_KERNEL。 ymind 发表于 2012-12-21 16:23 static/image/common/back.gif
跟你的内核实现(or配置)有关系。你的方法二我一直在用,至少AT91, MX31,MX53...和我公司SoC的ARM内核没问 ...
有点高深了,小弟不是很懂呀。果然还是要分析清楚U-BOOT源码和Linux启动源码才能搞明白。。。 不要花太多时间分析Linux启动源码,有这个概念即可;XIP kernel现在几乎也没有人用了,大容量NOR flash没有优势。
因为我看见你的boot信息有XIP字样,所以让你修改Linux配置(CONFIG_XIP_KERNEL)试试。当然,我怀疑的方向不一定对。
Verifying Checksum ... OK
XIP Kernel Image ... OKOK
本帖最后由 lelee007 于 2012-12-30 10:38 编辑
NULL
页:
[1]