uImage在內存中無法正常啓動——UBoot-2010.06在TQ2440上的移植--機器碼配對

 

uImage在內存中無法正常啓動——UBoot-2010.06在TQ2440上的移植--機器碼配對

   這幾天在進行內核的移植實驗的時候,遇到了一個問題,利用uboot下載內核鏡像無法正常運行。出現這些代碼:
  1. [u-boot@jxboylj2440] # bootm 31000000
  2. ## Booting kernel from Legacy Image at 31000000 ...
  3.    Image Name:   Linux-2.6.29.4-FriendlyARM
  4.    Created:      2011-05-18  17:35:09 UTC
  5.    Image Type:   ARM Linux Kernel Image (uncompressed)
  6.    Data Size:    2898892 Bytes = 2.8 MiB
  7.    Load Address: 30008000
  8.    Entry Point:  30008000
  9.    Verifying Checksum ... OK
  10.    Loading Kernel Image ... OK
  11. OK
  12. Starting kernel ...
  13. Uncompressing Linux.............................................................
  14. ................................................................................
  15. ............. 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

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