打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
UBOOT引导内核uImage问题
UBOOT引导内核uImage问题

现象:
[u-boot@MINI2440]# boot
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.62; our IP address is 192.168.1.144
Filename 'uImage'.
Load address: 0x30008000
Loading: T #################################################################
#################################################################
##########################################
done
Bytes transferred = 2517092 (266864 hex)
## Booting kernel from Legacy Image at 30008000 ...
Image Name:   Linux-2.6.32.2-FriendlyARM
Created:      2010-07-19  11:41:56 UTC
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    2517028 Bytes =  2.4 MB
Load Address: 30008000
Entry Point:  30008000
Verifying Checksum ... OK
XIP Kernel Image ... OK
OK

Starting kernel ...

data abort
pc : [<30008008>]          lr : [<33fa6500>]
sp : 33f3dd24  ip : 00000000     fp : 30008000
r10: 33fc2f08  r9 : 000007cf     r8 : 33f3ffe0
r7 : 33f3ffc4  r6 : 33f4131a     r5 : 30000100  r4 : 00000000
r3 : 00000000  r2 : 30000100     r1 : 000007cf  r0 : 00000000
Flags: nzCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...

resetting ...

分析:
uImage的制作办法是make uImage, 其中的mkimage: /usr/local/bin/mkimage工具来自UBOOT编译结果。

原来为了便于多内核引导,u-boot的mkimage会在kernel前加上0x40(64bytes)的头,真正的内核入口就变成了0x30008040了。而在新版2.6.32的加载地址和入口点地址相同,所以就造成abort……

解决办法
1. 手动制作uImage:
./mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e
0x30008040 -n mini2440 -d zImage uImage
2.修改内核

linux-2.6.32.2/arch/arm/boot/Makefile
MKIMAGE         := $(srctree)/scripts/mkuboot.sh
quiet_cmd_uimage = UIMAGE  $@
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \
-C none -a $(LOADADDR) -e $(STARTADDR) \
-n 'Linux-$(KERNELRELEASE)' -d $< $@
ifeq ($(CONFIG_ZBOOT_ROM),y)
$(obj)/uImage: LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT)
else
$(obj)/uImage: LOADADDR=$(ZRELADDR)

endif

# Note: the following conditions must always be true:
#   ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
#   PARAMS_PHYS must be within 4MB of ZRELADDR
#   INITRD_PHYS must be in RAM
ZRELADDR    := $(zreladdr-y)
PARAMS_PHYS := $(params_phys-y)
INITRD_PHYS := $(initrd_phys-y)

ifeq ($(CONFIG_THUMB2_KERNEL),y)
# Set bit 0 to 1 so that "mov pc, rx" switches to Thumb-2 mode
$(obj)/uImage: STARTADDR=$(shell echo $(LOADADDR) | sed -e "s/.$$/1/")
else
$(obj)/uImage: STARTADDR=$(LOADADDR)
endif
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【嵌入式Linux学习七步曲之第三篇 Linux系统bootlaoder移植】U-BOOT全线移植分析系列之四--U-boot如何引导Linux内核启动? - Sailor
zImage和uImage的区别(转)
制作uImage镜像
Linux 2.6.37内核移植到Mini2440(一)
uboot load address、entry point、 bootm address
[uboot] uboot启动kernel篇(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服