u-boot移植随笔:解决引导内核遇到undefined instruction的错误

前天解决了内核不能引导的问题了。在网上搜索了一些资料,才有点明白这个是怎么回事。

不能引导内核时提示的信息各种各样。像ERROR: can't get kernel image!、Bad Magic Number、 Bad Data CRC这些。这些有时出现,有时又不出现,很是诡异。

不过最严重的还是遇到undefined instruction的错误。经典地,一般启动过程如下:

 

遇到了undefined instruction问题。后来在网上找到一篇文章,说要将制作uImage的参数改一改,即入口地址(entry point)要比加载地址(load address)多加0x40个字节。于是我在使用mkimage时的参数改成如下:

因为内核期望的入口地址为0x30008000,所以将加载地址向前减去0x40个字节,变成0x30007fc0(0x30008000-0x40=0x30007fc0)。结果可以成功引导。我找到这篇文章:

http://blog.csdn.net/liangkaiming/archive/2010/11/04/5986680.aspx

里面讲到两种方式。当内核加载地址与入口地址一样时,如果使用tftp或cp命令下载/复制到内存的0x30008000,再使用bootm启动,是不能成功的,事实上,前面的例子就是这样的。

 

我又将加载地址和入口地址修改为一样的,但是,uImage在内存的地址却不是0x30008000,再使用bootm,亦可以。

 

在cmd_bootm.c中定义DEBUG宏时的输出(加载uImage到内存的地址与前面的不同,但是却不为0x30008000):

 这里得出一个结论:

1、当bootm的参数为0x30008000时,uImage的加载地址与入口地址需要相差0x40个字节。

2、当uImage加载地址与入口地址均为0x30008000时,bootm的参数可以是除0x30008000以外的地址(实际上,这个地址却不是“任意”的)。

注:bootm addr是启动位于addr处的内核uImage,这个内核可以使用tftp从主机中下载,也可以使用cp命令从nor flash中复制,事实上,本文所作实验就是使用cp命令的。

 

PS:今天日期减去2等于u-boot引导内核出现的日期。

                                                                                                                                      木草山人于3.07记

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值