先編譯友善提供的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