zh5202 发表于 2012-12-18 11:29

制作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 ...

zh5202 发表于 2012-12-19 13:19

怎么没人帮忙解答,连路过的都没有么?

shell.albert 发表于 2012-12-20 12:16

mkimage用于制作uboot-format内核,应该不会出错啊。
你一定要确定你的地址是否正确。要跟uboot中定义的loadaddr一样才行!

zh5202 发表于 2012-12-21 13:49

当-a后面指定的地址和bootm xxxx后面的地址不一样时,uboot会将bootm xxxx地址处的映像文件搬运到-a指定的地址处,此时,-e和-a必须要一样,因为映像头并没有搬运过去,载入地址就是内核的入口地址。需要注意的是,因为uboot要重新搬运内核映像,所以要注意bootm xxxx的地址和-a之间的地址不要导致复制时的覆盖。
验证通过了,这句话没错,-a和-e指定的地址是:0x30008000,bootm可以在内存的任何位置(只要注意bootm xxxx的地址和-a之间的地址不要导致复制时的覆盖即可),系统正常启动。

zh5202 发表于 2012-12-21 13:51

shell.albert 发表于 2012-12-20 12:16 static/image/common/back.gif
mkimage用于制作uboot-format内核,应该不会出错啊。
你一定要确定你的地址是否正确。要跟uboot中定义的loa ...

你所说的loadaddr是指的内核存在flash的起始地址吧?

ymind 发表于 2012-12-21 16:23

跟你的内核实现(or配置)有关系。你的方法二我一直在用,至少AT91, MX31,MX53...和我公司SoC的ARM内核没问题;而uboot实现方法一的初衷,我记得跟XIP kernel有关,即XIP kernel在NOR flash上原地执行,当然要跳过uImage头。
检查一下CONFIG_XIP_KERNEL。

zh5202 发表于 2012-12-23 11:14

ymind 发表于 2012-12-21 16:23 static/image/common/back.gif
跟你的内核实现(or配置)有关系。你的方法二我一直在用,至少AT91, MX31,MX53...和我公司SoC的ARM内核没问 ...

有点高深了,小弟不是很懂呀。果然还是要分析清楚U-BOOT源码和Linux启动源码才能搞明白。。。

ymind 发表于 2012-12-24 08:52

不要花太多时间分析Linux启动源码,有这个概念即可;XIP kernel现在几乎也没有人用了,大容量NOR flash没有优势。
因为我看见你的boot信息有XIP字样,所以让你修改Linux配置(CONFIG_XIP_KERNEL)试试。当然,我怀疑的方向不一定对。
   Verifying Checksum ... OK
   XIP Kernel Image ... OKOK

lelee007 发表于 2012-12-30 10:31

本帖最后由 lelee007 于 2012-12-30 10:38 编辑

NULL
页: [1]
查看完整版本: 制作uImage,启动失败,大虾们进来看一下!