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 <[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. .nr        =     MACH_TYPE_##_type,        \
  10. .name        = _name,
  11. #define     MACHINE_END                \
  12. };

这个宏定义扩展之后的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用完外部总线,将控制权交给内核前,关闭外部总线,让内核自己去配置。或者干脆就别开。

时间: 2024-08-26 01:50:06

Uncompressing Linux___ done, booting the kernel_tekkamanninja-ChinaUnix博客的相关文章

QT 生成的exe 无法打开 说缺少QTCORED4.DLL文件-三点水兽-ChinaUnix博客

还需要已经运行时提示缺少的组件添加一些dll 来源:http://blog.chinaunix.net/uid-20620288-id-3356186.html#0-hi-1-67586-89fdc647f52c5196c0d5da60d38d89ea

MYSQL 博客

DavidYang的博客 - CSDN.NET DimitriK's (dim) Weblog Xaprb · Stay Curious! 飞鸿无痕的博客 - ChinaUnix博客 何登成的技术博客 贺春阳的博客(hcymysql) - 51CTO技术博客 简朝阳的博客 - Sky.Jian 姜承尧的博客 - InsideMySQL 陆炫志的博客 - 博客园 那海蓝蓝的博客 宁海元的博客 - NinGoo.net 彭立勋的博客 - P.Linux Laboratory 淘宝丁奇的微博 王恒He

牛人博客网址

高手博客: 嵌入式学习园地-华清远见-在21ic的的博客 1. 陈莉君老师的个人空间-仰空冥思2. linuxtrave-linux内核之旅3. edsiontel-和linuxtrave链接4. fudan_abc csdn博客 1. 宋宝华在51的博客2. 刘洪涛 csdn博客3. 周立功 sina博客4. 孙天泽 csdn博客 1. 李先静同志csdn博客2. 李先静同志http://www.limodev.cn/blog/3. 赵春江csdn博客4. 黄刚chinaunix博客5. te

我的Android进阶之旅------&gt;经典的大牛博客推荐(排名不分先后)!!

本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超博客 Android中文Wiki AndroidStudio-NDK开发-移动开发团队谦虚的天下 - 博客园gundumw100博客 - android进阶分类文章列表 - ITeye技术网站CSDN博文精选:Android系列开发博客资源汇总 - CSDN.NET - CSDN资讯Android笔

其他博客

永生ChinaUnix博客 http://blog.chinaunix.net/blog/index/pattern/list.html 刘梦阳_1的博客 http://blog.sina.com.cn/s/articlelist_6025773636_0_1.html 网易博客 http://m15313061209.blog.163.com/

各大知名博客推荐

博客园 http://www.cnblogs.com/ampafang/ 8 可挂友链 凤凰网博客 http://blog.ifeng.com/article/35150737.html 7 可挂友链 中金博客 http://blog.cnfol.com/wuyishaonian/article/1426576112-100725607.html 6   宝宝树博客 http://home.babytree.com/u14326295731/journal/show/13261273 6   中

MYSQL 名人博客

: DavidYang的博客 - CSDN.NET DimitriK's (dim) Weblog Xaprb · Stay Curious! 飞鸿无痕的博客 - ChinaUnix博客 何登成的技术博客 贺春阳的博客(hcymysql) - 51CTO技术博客 简朝阳的博客 - Sky.Jian 姜承尧的博客 - InsideMySQL 陆炫志的博客 - 博客园 那海蓝蓝的博客 宁海元的博客 - NinGoo.net 彭立勋的博客 - P.Linux Laboratory 淘宝丁奇的微博 王恒

基于FL2440的3.6.6内核移植出现Uncompressing Linux... done, booting the kernel.

具体问题 参考解决方案 解决思路 深入解决 1.具体问题: 在移植3.6.6的内核后,下载启动卡死,具体是串口打印信息停留在"Uncompressing Linux- done, booting the kernel." 2. 参考解决方案: 依据网上的说法要确保如下情况: 2.1 内核的时钟频率正确 2.2 boot和kerel 配置一致的MACH_TYPE,即板子MACHINE ID 2.3 串口驱动配置正常 在内核配置device drivers->character de

funtoo 安装手册阅读 (博客第 100 篇文章纪念)

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}