U-boot引導Linux-2.6.39.3內核問題

作者:於連慶,華清遠見嵌入式學院講師。

u-boot引導Linux內核有兩種方式,go命令或者bootm命令。go命令引導zImage格式的內核映像,默認方式下不向內核傳遞參數,需要我們修改,相應的修改也有兩種選擇。一種是用使用struct param_struct傳遞內核參數,另一種是以標記列表(tagged list)的形式來傳遞啓動參數。第一種方式設置簡單,Linux2.6繼續支持該格式,未來是否繼續支持有待考察。實踐中,用struct param_struct方式引導Linux-2.6.35沒問題,但在引導Linux-2.6.39.3時失敗。提示以下信息:

Root-NFS: No NFS server available, giving up.
        VFS: Unable to mount root fs via NFS, trying floppy.

懷疑是內核參數傳遞不正確。因此,嘗試用bootm命令引導Linux-2.6.39.3。

bootm命令只能引導uImage格式的內核映像,用make uImage命令生成uImage格式的內核映像,用bootm命令引導Linux-2.6.39.3,但也不成功。經查,bootm命令默認方式也不向內核傳遞參數,需要在配置頭文件(例如,include/configs/smdk2410.h)中定義以下兩個宏:

#define CONFIG_SETUP_MEMORY_TAGS 1
        #define CONFIG_CMDLINE_TAG 1

重新編譯生成u-boot.bin,燒寫到開發板中並重啓開發板,引導Linux-2.6.39.3仍不成功。

zImage格式的內核映像和uImage格式的內核映像文件頭部分不同,後者多64個字節。注意到make uImage時的提示信息:

Load Address: 0x30108000
        Entry Point: 0x30108000

這兩個地址一個是解壓後的加載地址,一個是內核映像的執行入口地址,二者應該不同,有64(0x40)字節的偏移。

打開arch/arm/boot目錄中的Makefile,找到$(obj)/uImage: STARTADDR=$(LOADADDR) 這一句,顯然,直接把加載地址賦給了執行地址。修改如下:

$(obj)/uImage: STARTADDR=$(shell echo $(LOADADDR) | sed –e “s/..$$/40/”)

其中,sed –e “s/..$$/40/”的意思是把字符串的最後兩個字節用40替換。

重新make uImage,提示信息爲:

Load Address: 0x30108000
        Entry Point: 0x30108040

在開發板上重新引導內核:

# tftp 33000000 uImage
        # bootm 33000000

系統引導成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章