uImage在內存中無法正常啓動——UBoot-2010.06在TQ2440上的移植--機器碼配對
- [u-boot@jxboylj2440] # bootm 31000000
- ## Booting kernel from Legacy Image at 31000000 ...
- Image Name: Linux-2.6.29.4-FriendlyARM
- Created: 2011-05-18 17:35:09 UTC
- Image Type: ARM Linux Kernel Image (uncompressed)
- Data Size: 2898892 Bytes = 2.8 MiB
- Load Address: 30008000
- Entry Point: 30008000
- Verifying Checksum ... OK
- Loading Kernel Image ... OK
- OK
- Starting kernel ...
- Uncompressing Linux.............................................................
- ................................................................................
- ............. done, booting the kernel.
內核無法正常啓動,我的實驗是在基於NANDflash的uboot基礎上進行的,利用nfs服務器,使用#tftp 31000000 uImage下載內核鏡像到內存中運行。
提供以下解決辦法供參考:
Linux的機器碼一定要與bootloader的機器碼一致,否則會出現內核啓動不了。
1、在u-boot和kernel中都會有一個機器碼(即:MACH_TYPE),只有這兩個機器碼一致時才能引導內核。
2、uboot機器碼路徑:arch/arm/include/asm/mach-types.h
第375行
#define MACH_TYPE_S3C2440 362
板子初始化時指定的MACH-TYPE路徑
board/samsung/smdk2440/smdk2440.c
第126行
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
gd->bd->bi_boot_params = 0x30000100;
3、內核機器碼路徑
arch/arm/tools/mach-types
第379行
s3c2440 ARCH_S3C2440 S3C2440 362
內核啓動時指定的MACH-TYPE路徑
arch/arm/mach-s3c2440/mach-smdk2440.c
第331行
MACHINE_START(S3C2440, "SMDK2440")
按照此步驟進行查看,看是否是機器碼不匹配,如果不匹配進行相應的修改。還應特別注意的是,在移植過程中有些文件時直接複製過來,雖然按照這種方法驗證了不存在問題,但可能問題還是不能解決,有可能是被編譯的文件是基於該文件修改過的。
譬如:我按照上面的辦法驗證,沒有問題,但是還是不能啓動內核,仔細查看之後,發現被編譯的是由mach-smdk2440.c直接copy過去的mach-mini2440.c文件,而該文件中機器碼對應的是MACH_TYPE_MINI2440。因此,進入uboot目錄,修改了gd->bd->bi_arch_number = MACH_TYPE_MINI2440,(MACH_TYPE_MINI2440對應1999,這個和內核機器碼匹配)。再重新編譯了uboot,利用norflash中vivi,下載到nandflash中,啓動後下載內核到內存,能正常運行了。
這個問題困擾我很多天,一開始無從下手,以爲是uboot不能傳遞參數,或者是編譯錯誤、串口驅動沒有配置,所以走了很多彎路,網上的很多資料對我幫助很大,很是感謝。尤其是CSDN的轉角遇到嵌入式http://blog.csdn.net/IT_114/archive/2011/03.aspx。