打印
[嵌入式linux]

制作uImage,启动失败,大虾们进来看一下!

[复制链接]
2876|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zh5202|  楼主 | 2012-12-18 11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
./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 ... OK
OK

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

相关帖子

沙发
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之间的地址不要导致复制时的覆盖即可),系统正常启动。

使用特权

评论回复
5
zh5202|  楼主 | 2012-12-21 13:51 | 只看该作者
shell.albert 发表于 2012-12-20 12:16
mkimage用于制作uboot-format内核,应该不会出错啊。
你一定要确定你的地址是否正确。要跟uboot中定义的loa ...

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

使用特权

评论回复
6
ymind| | 2012-12-21 16:23 | 只看该作者
跟你的内核实现(or配置)有关系。你的方法二我一直在用,至少AT91, MX31,MX53...和我公司SoC的ARM内核没问题;而uboot实现方法一的初衷,我记得跟XIP kernel有关,即XIP kernel在NOR flash上原地执行,当然要跳过uImage头。
检查一下CONFIG_XIP_KERNEL。

使用特权

评论回复
7
zh5202|  楼主 | 2012-12-23 11:14 | 只看该作者
ymind 发表于 2012-12-21 16:23
跟你的内核实现(or配置)有关系。你的方法二我一直在用,至少AT91, MX31,MX53...和我公司SoC的ARM内核没问 ...

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

使用特权

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

使用特权

评论回复
9
lelee007| | 2012-12-30 10:31 | 只看该作者
本帖最后由 lelee007 于 2012-12-30 10:38 编辑

NULL

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Need to harder study!Thank you for everyone had helped me.

5

主题

248

帖子

2

粉丝