文档章节

Uncompressing Linux... done, booting the kernel

hades2011
 hades2011
发布于 2014/09/16 22:23
字数 898
阅读 22
收藏 0

今天用主线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用完外部总线,将控制权交给内核前,关闭外部总线,让内核自己去配置。或者干脆就别开。


© 著作权归作者所有

hades2011
粉丝 2
博文 16
码字总数 32442
作品 0
深圳
程序员
私信 提问
virtualbox无法启动gust机

安装完毕后,重新引导就这样了,尝试多次重启也不行。Oracle Linux 4.8 卡在 uncompressing Linux OK ,booting the kernel 谢谢!...

IdleMan
2013/04/02
266
2
Linux内核移植常见错误及解决方法

下边列举几类移植中经常遇到到一下额问题,以及问题发生到原因和解决方法。 1、machine ID问题 machine ID问题跟CPU具体到型号相关,启动时打印信息如下: Uncompressing Linux................

乐学为上
2012/03/24
1K
0
U boot 引导linux kernel过程

[在网络上各位大侠的指导下,用u boot 成功引导linux。正在阅读U boot源码,第一次读U boot 源码,很多地方还不明白。本人会不定时修正文中谬论,也请各路大侠不吝赐教!] 在u boot 中可以使...

金衣人
2012/09/18
730
0
mkimage的-a 和 –c参数和内核引导

目录 一、mkimage工具简介 二、-a参数与-e参数和内核引导的关系 三、实例测试 3.1 -a参数与-e参数相同,可以将内核下载到SDRAM的任何地址,然后从这启动 3.2 -a参数与-e参数不同,只能将内核...

长平狐
2013/06/03
100
0
uncompressing linux .................................................后没反应解决办法

编译kernel是的no machine record defined 错误,网上有一些解法,其实都是错误的,以讹传讹。不打算自己写,找到一篇还算靠谱的,转摘一下。 其根本原因是没有在 procinfoend 与 procinfobe...

qq_26671365
2017/12/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

006-Sigle-基于blockstack去中心化博客

本篇文章主要讲解有关基于Blockstack的Sigle是一个去中心化的博客项目; 官网地址:https://www.sigle.io/ Github地址:https://github.com/pradel/sigle 页面展示: 介绍: A beautiful de...

Riverzhou
22分钟前
9
0
驰骋工作流引擎开发平台属性功能的隐藏显示介绍

关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明 工作流设计 工作流快速开发平台 业务流程管理 bpm工作流系统 java工作流主流框架 自定义...

孟娟
24分钟前
8
0
MyBatis binding 模块分析

MyBatis binding 模块分析 binding功能代码所在包 org.apache.ibatis.binding binding模块作用 封装ibatis编程模型 ibatis编程模型中,SqlSession作为sql执行的入口,实用方法为sqlSession.se...

红妍落日
26分钟前
7
0
网易互娱的数据库选型和 TiDB 应用实践

作者介绍:李文杰,网易互娱计费组,高级数据库管理工程师,TiDB User Group Ambassador。 一、业务架构简介 计费组是为网易互娱产品提供统一登录和支付高效解决方案的公共支持部门,对内是互...

TiDB
32分钟前
8
0
Debezium接入Mysql遇到到的Tinyint坑

问题背景: 在Debezium做数据初始化的时候,对于一些tinyint字段的值,出现0,1的值的异常。 经过源码排查,数据在JDBC上面,读取到的数据是Boolean值。 通过排查,原来是MYSQL特有的数据问题...

吐槽的达达仔
41分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部