uImage在内存中无法正常启动——UBoot-2010.06在TQ2440上的移植--机器码配对

来源:互联网 发布:java不关闭流 编辑:程序博客网 时间:2024/06/07 17:49
这几天在进行内核的移植实验的时候,遇到了一个问题,利用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。


转自:http://blog.sina.com.cn/s/blog_72e7b3e50100tw5v.html

0 0