Uncompressing Linux... done, booting the kernel

今天用主线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 <[email protected]> */
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.     
14.    # define MACHINE_END                \
15.    };
这个宏定义扩展之后的 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.                     
5.                    int board_init(void)
6.                    {
7.                        s3c64xx_gpio * const gpio = s3c64xx_get_base_gpio();
8.                     
9.                    .....
10.                   
11.                      gd->bd->bi_arch_number = MACH_TYPE;
12.                      gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
13.                   
14.                      return 0;
15.                  }
这个宏的定义在: 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.                            noinitrd root=/dev/mtdblock4 rootfstype=jffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M
关键是在 console=ttySAC0,115200 上,如果 ttySAC0 弄错了,或者波特率不对就会出问题。
不同的 CPU console 有可能不一样,比如有的可能是 ttyS0
http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=129729
 

你可能感兴趣的:(linux,移植,休闲,linux内核,MINI6410)