./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.
但是如此却无法启动内核,错误提示:
[u-boot@MINI2440]# 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 : 33f3fdf4 ip : 33ef2c9c fp : 30000100
r10: 0000016a r9 : 33ef2ddc r8 : 33f3ffdc
r7 : 30008000 r6 : 33fb0bf8 r5 : 00000000 r4 : 33f3ffc0
r3 : 00000000 r2 : 30000100 r1 : 0000016a r0 : 30000188
Flags: nzcv IRQs off FIQs off Mode SVC_32
Resetting CPU ...
resetting ...
|