|   U-boot引導Linux-2.6.39.3內核問題  時間(jian):2017-01-05作者:華(hua)清遠見 u-boot引(yin)(yin)導(dao)Linux內核(he)(he)有(you)(you)(you)兩種(zhong)方(fang)(fang)(fang)式,go命(ming)令或者(zhe)bootm命(ming)令。go命(ming)令引(yin)(yin)導(dao)zImage格式的內核(he)(he)映(ying)像,默認(ren)方(fang)(fang)(fang)式下不向內核(he)(he)傳(chuan)(chuan)遞(di)(di)參數,需要我們修改,相(xiang)應的修改也(ye)有(you)(you)(you)兩種(zhong)選擇。一種(zhong)是(shi)用使用struct param_struct傳(chuan)(chuan)遞(di)(di)內核(he)(he)參數,另一種(zhong)是(shi)以標記列表(tagged list)的形式來傳(chuan)(chuan)遞(di)(di)啟動參數。第一種(zhong)方(fang)(fang)(fang)式設置簡單(dan),Linux2.6繼續支持(chi)該格式,未來是(shi)否繼續支持(chi)有(you)(you)(you)待(dai)考察。實(shi)踐中,用struct param_struct方(fang)(fang)(fang)式引(yin)(yin)導(dao)Linux-2.6.35沒問題,但(dan)在(zai)引(yin)(yin)導(dao)Linux-2.6.39.3時失敗。提示以下信息: 
	Root-NFS: No NFS server available, giving up.  懷疑是內核參數(shu)傳遞不正確。因(yin)此,嘗試用(yong)bootm命令引導Linux-2.6.39.3。 bootm命(ming)(ming)令(ling)(ling)只能引導uImage格(ge)式的(de)內(nei)核(he)映像,用make uImage命(ming)(ming)令(ling)(ling)生成(cheng)uImage格(ge)式的(de)內(nei)核(he)映像,用bootm命(ming)(ming)令(ling)(ling)引導Linux-2.6.39.3,但也不成(cheng)功。經查,bootm命(ming)(ming)令(ling)(ling)默認(ren)方式也不向內(nei)核(he)傳遞(di)參數,需要在配置頭文(wen)件(例如,include/configs/smdk2410.h)中定義以下兩個(ge)宏: 
	#define CONFIG_SETUP_MEMORY_TAGS 1 重(zhong)新編譯(yi)生成u-boot.bin,燒寫到(dao)開發板中并重(zhong)啟開發板,引導(dao)Linux-2.6.39.3仍不成功(gong)。 zImage格式的內核映像和uImage格式的內核映像文件(jian)頭部(bu)分不同,后者(zhe)多64個字節。注意到make uImage時的提示(shi)信息(xi): 
	Load Address: 0x30108000 這兩個(ge)地址一個(ge)是解壓后的(de)(de)加載地址,一個(ge)是內(nei)核映像的(de)(de)執(zhi)行(xing)入口(kou)地址,二者應(ying)該不(bu)同(tong),有64(0x40)字節的(de)(de)偏移。 打開arch/arm/boot目錄中的Makefile,找到$(obj)/uImage: STARTADDR=$(LOADADDR) 這一句,顯(xian)然,直接把加(jia)載地址(zhi)賦給了執行地址(zhi)。修(xiu)改如下: $(obj)/uImage: STARTADDR=$(shell echo $(LOADADDR) | sed –e “s/..$$/40/”) 其中,sed –e “s/..$$/40/”的(de)意(yi)思是把字(zi)(zi)符串的(de)后兩(liang)個字(zi)(zi)節用40替換。 重新make uImage,提示信息為: 
	Load Address: 0x30108000 在開發板上重(zhong)新引導內核(he): 
	# tftp 33000000 uImage 系統(tong)引導成功。 
 相關資訊 發表評論 
 |