uboot沒法引導uImage錯誤及其解決方法 mini2440移植uboot 2011.03(上) mini2440移植uboot 2014.04(四)

先編譯友善提供的linux內核:html

make ARCH=arm mini2440_defconfig
make
CROSS_COMPILE=arm-linux- uImage

在arch/arm/boot/uImage 生成uImagelinux

 

在使用《mini2440移植uboot 2014.04(六)》中移植的uboot來加載剛纔編譯的uImage,拷貝到tftp文件夾,重啓tftp服務器:shell

tftp 30008000 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).post

加載地址是uboot在加載內核時的存放地址,入口地址是內核代碼的開始執行地址。ui

 

在使用前面的uboot加載uImage時,把uImage加載到加載地址(0x30008000)處,而後就在入口地址(0x30008000)處開始執行,而實際的代碼執行地址是0x30008040(入口地址+文件頭長度)。url

因此沒法啓動uImage.spa

 

之前我在《mini2440移植uboot 2011.03(上)》和《mini2440移植uboot 2014.04(四)》中執行下面的命令才正常加載內核:code

# 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  3 10:23:53 2014
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    2275212 Bytes = 2221.89 kB = 2.17 MB
Load Address: 30008000
Entry Point:  30008040
相關文章
相關標籤/搜索