uboot无法引导uImage错误及其解决方法
2024-08-28 11:18:35
先编译友善提供的linux内核:
make ARCH=arm mini2440_defconfig
make CROSS_COMPILE=arm-linux- uImage
在arch/arm/boot/uImage 生成uImage
在使用《mini2440移植uboot 2014.04(六)》中移植的uboot来加载刚才编译的uImage,拷贝到tftp文件夹,重启tftp服务器:
tftp uImage
bootm
此时内核无法加载,在显示下面的信息后就不再显示其他内容。
Starting kernel ...
这是因为uImage实际上是在zImage前添加了64个字节的文件头,可以用mkimage工具查看uImage的文件头信息:
$ mkimage -l arch/arm/boot/uImage
Image Name: Linux-2.6.32.2-FriendlyARM
Created: Thu Jul 3 10:05:23 2014
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2275212 Bytes = 2221.89 kB = 2.17 MB
Load Address: 30008000
Entry Point: 30008000
其中有两个重要的地址,一个是加载地址(Load Address),另一个是入口地址(Entry Point).
加载地址是uboot在加载内核时的存放地址,入口地址是内核代码的开始执行地址。
在使用前面的uboot加载uImage时,把uImage加载到加载地址(0x30008000)处,然后就在入口地址(0x30008000)处开始执行,而实际的代码执行地址是0x30008040(入口地址+文件头长度)。
所以无法启动uImage.
以前我在《mini2440移植uboot 2011.03(上)》和《mini2440移植uboot 2014.04(四)》中执行下面的命令才正常加载内核:
# tftp 30007fc0 uImage
# bootm
但是这种方法看起来会让人觉得有点怪,有种违和感。
其实也可以直接将uImage中的加载地址修改为0x30008040就也能正常加载内核,只需要修改内核源码文件arch/arm/boot/Makefile即可:
删除一行:
$(obj)/uImage: STARTADDR=$(LOADADDR)
在删除行后面添加一行:
$(obj)/uImage: STARTADDR=$(shell echo $(LOADADDR) | sed -e "s/..$$/40/")
此行内容用于将30008000最后两位替换成40,即30008040,正好和我们的要求相符合。
修改后重新编译uImage,并加载,可以正常启动内核了。
此时执行mkimage查看uimage,如下所示:
$ mkimage -l arch/arm/boot/uImage
Image Name: Linux-2.6.32.2-FriendlyARM
Created: Thu Jul ::
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: Bytes = 2221.89 kB = 2.17 MB
Load Address:
Entry Point:
最新文章
- Yii2.0 对的一些简单的操作
- imageNamed和imageWithContentsOfFile区别
- NYOJ:题目490 翻译
- jQueryUI日期显示
- 一道数学题 hduacm 5144
- ajax success 和complete 的区别
- slot signal机制
- mac下SSH很快被断开
- 微信公众平台企业号验证接口、回调 PHP版
- C++之const限定符
- grep -v 反向查找
- asp.net core参数保护之自定义要保护的参数类型
- Windows下的Nessus安装与启动
- QT与opencv(二)开启摄像头
- mysql左连接右连接(查询两张表不同的数据)
- Debian初始化配置
- winform datatable 或datagridview中添加列
- h5聊天室web端(仿微博、微信)|h5仿微信网页端|仿微信界面弹窗
- 理解JavaScript继承(二)
- 慢吞吞的pip切换源
热门文章
- Spring MVC简单URL处理程序映射
- arm-linux字符设备驱动开发之---简单字符设备驱动
- SlidingMenu官方实例分析1——ExampleListActivity
- java输出
- MySQL索引使用:字段为varchar类型时,条件要使用''包起来
- jmeter通过json extrcator或者正则表达式获取json返回信息
- NOIP2011提高组(选择客栈)
- Linux I/O 进阶
- 【BZOJ2794】[Poi2012]Cloakroom 离线+背包
- N - Broken Keyboard (a.k.a. Beiju Text)(DFS,链表)