Chinaunix首页 | 论坛 | 博客
  • 博客访问: 306283
  • 博文数量: 85
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 800
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-18 15:21
文章分类

全部博文(85)

文章存档

2017年(1)

2016年(19)

2015年(55)

2014年(10)

我的朋友

分类: 嵌入式

2015-07-05 15:07:16

Bootloader:Uboot
内核 启动是在Uboot将 Linux 内核映像拷贝到 RAM 以后,可以通过下例代码启动 Linux 内核:

theKernel (0, machid, bd->bi_boot_params);
其中
machidbootloader传递到kernel 的机器ID,用于标识单板类型
bd->bi_boot_params 是启动参数在起始地址。通过这种方式将 Linux 启动需要的参数从 bootloader传递到内核。

启动条件

通常从系统上电执行的boot loader的代码, 而要从boot loader跳转到linux kernel的第一条指令处执行需要一些特定的条件。

这里讨论下进入到linux kernel时必须具备的一些条件,这一般是boot loader在跳转到kernel之前要完成的:   

  1. CPU必须处于SVC(supervisor)模式,并且IRQ和FIQ中断都是禁止的;   
  2. MMU(内存管理单元)必须是关闭的, 此时虚拟地址就是物理地址;   
  3. 数据cache(Data cache)必须是关闭的   
  4. 指令cache(Instruction cache)可以是打开的,也可以是关闭的,这个没有强制要求;   
  5. CPU 通用寄存器0 (r0)必须是 0;   
  6. CPU 通用寄存器1 (r1)必须是 ARM Linux machine type (关于machine type, 我们后面会有讲解)   
  7. CPU 通用寄存器2 (r2) 必须是 kernel parameter list 的物理地址(parameter list 是由boot loader传递给kernel,用来描述设备信息属性的列表)。

更详细的关于启动arm linux之前要做哪些准备工作可以参考,“Booting ARM Linux"文档


Linux Kernel的启动过程分两个部分:
1.架构/开发板相关的引导过程
2.后续通用的启动过程

补充说明:
若是从压缩文件中启动需要首先自解压。
Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫 zImage。根据内核映像的不同,Linux 内核的启动在开始阶段也有所不同。zImage 是 Image经过压缩形成的,所以它的大小比 Image 小。但为了能使用 zImage,必须在它的开头加上解压缩的代码,将 zImage 解压缩之后才能执行,因此它的执行速度比 Image 要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用 zImage 可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。所以一般的嵌入式系统均采用压缩内核的方式。

然后从自解压后的文件进入架构/开发板相关的引导过程。-----------------这部分描述是正确的吗?

一 架构/开发板相关的引导过程概述
引导过程按以下几步进行
1.检查内核是否支持当前处理器架构--在arch/arm/kernel/head.s文件中的见调用了 __lookup_processor_type
2.检查是否支持当前的开发板machid--在arch/arm/kernel/head.s文件中的见调用了__lookup_machine_type
3.设置页表,使能MMU,为了连接内核时使用虚拟地址
4.调用C语言编写的start_kernel之前的常规性工作,包括复制数据段、清楚BSS段、调用start_kernel函数

后续通用的启动过程
1.输出kerne 版本信息==??通过谁来输出?还没初始化串口
2.设置和架构相关的环境,如系统时钟、串口等
3.初始化控制台
4.启动init进程

后面将分两篇文章来描述记录一 架构/开发板相关的引导过程概述 后续通用的启动过程这两部分。
链接如下



阅读(933) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~