• Uncompressing Linux___ done, booting the kernel_tekkamanninja-ChinaUnix博客


    今天用主线Linux内核移植到MINI6410,主线内核2.6.37.1基本已经支持了MINI6410的板子,所以移植到能够启动起来的阶段很简单,但是在移植的时候还是出现了一个比较常见的问题:

    1. MINI6410 # bootm 0x50008000  
    2. ## Booting kernel from Legacy Image at 50008000 ...  
    3. Image Name: Linux-2.6.37.1  
    4. Image Type: ARM Linux Kernel Image (uncompressed)  
    5. Data Size: 3800644 Bytes = 3.6 MiB  
    6. Load Address: 50008000  
    7. Entry Point: 50008040  
    8. Verifying Checksum ... OK  
    9. XIP Kernel Image ... OK  
    10. OK  
    11. Starting kernel ...  
    12. Uncompressing Linux... done, booting the kernel.  
    13. 停住不动了~~~~
    这种问题比较常见,由于输出的信息有限,不是很好找原因,如果去代码中追踪的话也比较麻烦。在查找原因解决这个问题的时候,我找到了一些可能出现的原因,在这里总结一下:
     
    1、machine type    不匹配
    在内核自解压完成以后内核会首先会进入 bl        __lookup_machine_type函数(在arch/arm/kernel/head.S中),检查machine_type是否匹配,如果不匹配会跳入__error_a函数(在arch/arm/kernel/head-common.S中),导致启动失败。
    例如arch/arm/mach-s3c64xx/mach-mini6410.c    查看下面这个结构体:  
    1. MACHINE_START(MINI6410, "MINI6410")
    2.     /* Maintainer:     Darius Augulis <augulis.darius@gmail.com> */
    3.     .boot_params    = S3C64XX_PA_SDRAM + 0x100,
    4.     .init_irq    = s3c6410_init_irq,
    5.     .map_io        = mini6410_map_io,
    6.     .init_machine    = mini6410_machine_init,
    7.     .timer        = &s3c24xx_timer,
    8. MACHINE_END
    这个宏的定义在arch/arm/include/asm/mach/arch.h
    1. /*     
    2.  * Set of macros to define architecture features. This is built     into
    3.  * a table by the linker.
    4.  */
    5. #define MACHINE_START(_type,_name)            
    6. static const struct machine_desc __mach_desc_##_type    
    7.  __used                            
    8.  __attribute__((__section__(".arch.info.init"))) = {    
    9.     
    10. .nr        =     MACH_TYPE_##_type,        
    11.     
    12. .name        = _name,
    13. #define     MACHINE_END                
    14. };
    这个宏定义扩展之后的machine type 就成了    MACHINE_TYPE_MIN6410。  
    MACHINE_TYPE_MIN6410这个宏定义在include/generated/mach-types.h
      1. #define MACH_TYPE_MINI6410  2520
    machine type在u-boot
    的配置在board/samsung/mini6410/mini6410.c
      1. /*    
      2.  * Miscellaneous platform dependent initialisations    
      3.  */    
      4. int board_init(void)    
      5. {    
      6.     s3c64xx_gpio * const     gpio = s3c64xx_get_base_gpio();    
      7. .....    
      8.     gd->bd->bi_arch_number = MACH_TYPE;    
      9.     gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;    
      10.     return     0;    
      11. }
    这个宏的定义在:include/configs/mini6410.h
      1. /*    
      2.  * Architecture magic and machine type    
      3.  */    
      4. #define     MACH_TYPE        2520
    只要这两个数对上就可以了。
     
    2、串口驱动没有编译入内核

    在弄MINI6410的时候我就犯了这个错误,因为还没有MINI6410的默认配置文件,所有这个要自己选上的。位置在Device  Drivers->Character devices->Serial drivers中

     

    1. <*> Samsung SoC serial support   
    2. [*] Support for console on Samsung SoC serial port    
    3. <*> Samsung S3C6400/S3C6410/S5P6440/S5P6450/S5PC100 Serial port   support

    3、内核启动参数设置错误   

    内核的启动参数的错误也可以造成同样的错误,但是这种错误可能有几种:

    (1)控制台串口配置字符串不匹配

    比如有一个配置是:

     

    1. noinitrd root=/dev/mtdblock4 rootfstype=jffs2 rw console=ttySAC0,115200   init=/linuxrc mem=64M

    关键是在console=ttySAC0,115200上,如果ttySAC0弄错了,或者波特率不对就会出问题。

    不同的CPU的console有可能不一样,比如:

    有的可能是ttyS0,

    三星的CPU一般是ttySAC0,

    早期TI  ARM 处理器的一般是ttyS2,

    后来TI  Omap系列的高版本内核变成了ttyO2。把“S”变成了“  O”,代表Omap。自恋阿~~~~

        (2)内存大小配置错误
         如果在“mem=64M这个参数上配置出现了问题,比如配置过大了,也会出现同样的现象。
       请注意你的系统内存和这个值的匹配关系。
     
     
         4、在bootloader中开启并配置了外部总线(GPMC)   
        在移植TI  Omap系列的内核时,发现如果在uboot中开启并配置了GPMC的某个bank,可能导致无法启动,也是这个现象。这个可能和Linux内核中对于启动时的GPMC寄存器读取和设置有关,暂时还没有去分析过代码。
         解决的办法是在bootloader用完外部总线,将控制权交给内核前,关闭外部总线,让内核自己去配置。或者干脆就别开。
     
  • 相关阅读:
    ocilib(简介2)
    C++ Socket编程步骤 (转载)
    服务端和客户端的疑问
    var和public的区别
    vs2010如何设置能实现输入关键字的时候自动提示呢?
    ocilib(简介)
    iostream.h , iostream
    error C2110: cannot add two pointers
    Array 越界不报错的问题
    char* + int or char or ...
  • 原文地址:https://www.cnblogs.com/timssd/p/4373059.html
Copyright © 2020-2023  润新知