U-boot引導Linux-2.6.39.3內核問題
時間:2017-01-05作者:華清遠見
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. 懷疑是內核參數傳遞不正確。因此,嘗試用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 重新編譯生成u-boot.bin,燒寫到開發板中并重啟開發板,引導Linux-2.6.39.3仍不成功。 zImage格式的內核映像和uImage格式的內核映像文件頭部分不同,后者多64個字節。注意到make uImage時的提示信息:
Load Address: 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 在開發板上重新引導內核:
# tftp 33000000 uImage 系統引導成功。
相關資訊
發表評論
|