U-boot引導(dǎo)Linux-2.6.39.3內(nèi)核問(wèn)題
時(shí)間:2017-01-05作者:華清遠(yuǎn)見
u-boot引導(dǎo)Linux內(nèi)核有兩種方式,go命令或者bootm命令。go命令引導(dǎo)zImage格式的內(nèi)核映像,默認(rèn)方式下不向內(nèi)核傳遞參數(shù),需要我們修改,相應(yīng)的修改也有兩種選擇。一種是用使用struct param_struct傳遞內(nèi)核參數(shù),另一種是以標(biāo)記列表(tagged list)的形式來(lái)傳遞啟動(dòng)參數(shù)。第一種方式設(shè)置簡(jiǎn)單,Linux2.6繼續(xù)支持該格式,未來(lái)是否繼續(xù)支持有待考察。實(shí)踐中,用struct param_struct方式引導(dǎo)Linux-2.6.35沒(méi)問(wèn)題,但在引導(dǎo)Linux-2.6.39.3時(shí)失敗。提示以下信息:
Root-NFS: No NFS server available, giving up. 懷疑是內(nèi)核參數(shù)傳遞不正確。因此,嘗試用bootm命令引導(dǎo)Linux-2.6.39.3。 bootm命令只能引導(dǎo)uImage格式的內(nèi)核映像,用make uImage命令生成uImage格式的內(nèi)核映像,用bootm命令引導(dǎo)Linux-2.6.39.3,但也不成功。經(jīng)查,bootm命令默認(rèn)方式也不向內(nèi)核傳遞參數(shù),需要在配置頭文件(例如,include/configs/smdk2410.h)中定義以下兩個(gè)宏:
#define CONFIG_SETUP_MEMORY_TAGS 1 重新編譯生成u-boot.bin,燒寫到開發(fā)板中并重啟開發(fā)板,引導(dǎo)Linux-2.6.39.3仍不成功。 zImage格式的內(nèi)核映像和uImage格式的內(nèi)核映像文件頭部分不同,后者多64個(gè)字節(jié)。注意到make uImage時(shí)的提示信息:
Load Address: 0x30108000 這兩個(gè)地址一個(gè)是解壓后的加載地址,一個(gè)是內(nèi)核映像的執(zhí)行入口地址,二者應(yīng)該不同,有64(0x40)字節(jié)的偏移。 打開arch/arm/boot目錄中的Makefile,找到$(obj)/uImage: STARTADDR=$(LOADADDR) 這一句,顯然,直接把加載地址賦給了執(zhí)行地址。修改如下: $(obj)/uImage: STARTADDR=$(shell echo $(LOADADDR) | sed –e “s/..$$/40/”) 其中,sed –e “s/..$$/40/”的意思是把字符串的后兩個(gè)字節(jié)用40替換。 重新make uImage,提示信息為:
Load Address: 0x30108000 在開發(fā)板上重新引導(dǎo)內(nèi)核:
# tftp 33000000 uImage 系統(tǒng)引導(dǎo)成功。
相關(guān)資訊
發(fā)表評(píng)論
|
嵌入式學(xué)習(xí)推薦