1、Bootloader简介
①Bootloader是这么一小段程序,它在系统上电时开始执行,初始化硬件设备,准备好软件环境,最后调用操作系统内核。
②Bootloader的实现非常依赖于具体硬件,在嵌入式硬件配置中千差万别,即使是相同的CPU,它的外设也可能不同,所以不可能有一个Bootloader支持所有的CPU电路板。
③CPU上电后,会从某个地址开始执行,ARM架构的CPU会从0x00000000开始,需要把存储器件ROM或Flash等映射到这个 地址上。
④Bootloader的两种操作模式:
A、启动加载模式(Boot Loading)
上电后,Bootloader从板子的某个固态存储上将操作系统加载到RAM中运行,整个过程没有用户介入。
B、下载模式(Downloading)
该模式下,开发人员可使用各类命令,通过串口或网络从主机下载文件,将它们直接放在内存中运行或烧写入Flash类存储 设备中。
2、Bootloader结构和启动过程
①嵌入式LInux系统从软件角度分为4个层次:
A、引导加载文件
包括在固件(Firmware)中的boot代码和Bootloader两部分。
在X86中先运行BIOS中的固件,再运行Bootloader,而大多数嵌入式系统没有固件。
B、Linux内核
C、文件系统:包含了Linux系统能够运行的所有必备的应用程序、库等。
D、用户应用程序
Bootloader | Boot parameters (IP地址、波特率等) | Kernel | Root filesystem |
②Bootloader的两个阶段
A、第一阶段:(使用汇编来实现)
1、硬件设备初始化:关闭WATCHDOG、关闭中断、设置时钟、初始化内存控制器等。
2、加载Bootloader第二阶段准备RAM空间。
3、复制Bootloader的第二阶段代码到RAM中。
4、设置栈。
5、跳转到第二阶段的C入口。
B、第二阶段(使用C语言来实现)
1、初始化本阶段使用到的硬件设备。
2、检测系统内存映射:确定板上使用了多少内存,它们的地址空间是什么。
3、将内核映象和根文件系统映象从Flash读到RAM中。
4、为内核设置启动参数。
5、调用内核。
③Bootloader与内核的互动
A、两者交互是单向的,由于它们不能同时运行,Bootloader将参数放在某个约定的地方之后,再启动内核,内核启动后从 这个地方获取参数。
B、除了约定好参数地址外,还规定了参数的结构,Linux2.4.x以后的内核都期望以标记列表(tagged list)形式传递参数, 标记是一种数据结构,标记列表是挨着存放的多个标记,以ATAG_CORE开始,以ATAG_NONE结束。
C、标记的数据结构为tag,它由一个tag_header(标记类型和长度)结构和一个联合(union)组成,不同类型有不同类型 的联合(union),比如tag_men32(内存)、tag_cmdline(命令行)。