什么是Bootloader
- Bootloader是硬件启动的引导程序,是启动操作系统的根本;
- 是在操作系统内核或用户程序运行之前的一段小程序;
- 通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用准备好环境;
- 在一般典型的系统中, 整个系统的加载启动任务就完全由Bootloader来完成。
Bootloader的特点
- Bootloader不属于操作系统内核,采用汇编语言编写,因此针对不同的CPU体系结构,这一部分代码不具备有可移植性;
- 在移植操作系统时,这部分代码必须加以改写;
- Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。
Bootloader操作模式
- 启动加载模式: 在这种模式下,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
- 下载模式: 在这种模式下,目标机上的Bootloader将通过串口或网络等通信手段从开发主机(Host)上下载内核映像和根文件系统映像等到ARM中。然后可以再将被Bootloader写到目标机上的固态存储设媒质中,或直接进行系统的引导。
Bootloader 基本功能
- 初始化硬件
- 将操作系统内核从Flash拷贝到SDRAM中,如果是压缩格式的内核,还要进行解压缩
- 改写系统的内存映射,原先Flash起始映射为0地址,这是需要将ARM的起始映射为0
- 提供Linux内核的启动参数
- 启动Linux内核
- 设置堆栈指针并将bss段清零将来执行C语言程序和调用子函数要用到
- 改变pc值,使得CPU开始执行真正的操作系统内核
Bootloader启动
- 系统加电或复位后,所有CPU都会从某个地址开始运行
- 嵌入式系统的开发板都要把板上ROM或FLASH映射到这个地址。因此,必须把Bootloader程序存储在相应的FLASH位置。系统加电后,CPU将首先执行它。
Bootloader启动两个阶段
Bootloader第一阶段
- 屏蔽所有中断。为中断提供服务通常是OS设备驱动程序的责任,因此在Bootloader的执行全过程中可以不必响应任何中断
- 设置CPU的速度和时钟频率
- RAM初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制器寄存器等
- 初始化LED。其目的是表明系统的状态。如果板子上没有LED,可以通过初始化UART串口打印Bootloader的Logo字符信息来完成这一点
- 为加载stage2准备RAM空间,通常为了获得更快的执行速度,通常把 stage2加载到RAM空间中来执行, 因此必须为加载Bootloader的stage2准备好一段可用的RAM空间范围
- 拷贝stage2到RAM中,在这里要确定两点:①stage2的可执行映像在固态存储设备的存放起始地址和终止地址;②RAM空间的起始地址
- 设置堆栈指针sp,这是为执行stage2的 C语言代码做好准备
Bootloader第二阶段
- 在stage2中Bootloader 主要完成以下工作。 用汇编语言跳转到main入口函数 由于stage2的代码通常用C语言来实现,目的是实现更复杂的功能和取得更好的代码可读性和可移植性。但是与普通C语言应用程序不同的是,在编译和链接 Bootloader 这样的程序时,不能使用glibc库中的任何支持函数
- 初始化本阶段要使用到的硬件设备,包括初始化串口、初始化计时器等。在初始化这些设备之前、可以输出一些打印信息。
- 检测系统的内存映射,所谓内存映射就是指在整个 4GB 物理地址空间中有指出哪些地址范围被分配用来寻址系统的RAM单元
- 加载内核映像和根文件系统映像, 这里包括规划内存占用的布局和从 Flash上拷贝数据
- 设置内核的启动参数
- 调用内核
常见Bootloader
Uboot简介
- U-boot (Universal Boot Loader) 是德国DENX小组开发的用于多种嵌入式CPU的Bootloader程序。遵循GPL条款。
- 从FADSROM、8xxROM、PPCBOOT、Armboot逐步发展演化而来;
- 当前版本号:见include/version 中的定义
U-boot的特点
- 代码结构清晰、易于移植
- 支持多种处理器体系结构
- 支持多种开发板
- 命令丰富、有监控功能
- 支持网络协议、USB、SD等多种协议和设备
- 支持文件系统
- 更新较活跃,使用者多,有助于解决问题
U-boot结构
编译U-boot
- U-boot的源码是通过gcc和Makefile组织编译的。顶层目录下的Makefile首先可以设置开发板的定义,然后递归地调用各级子目录下的Makefile,最后把编译过的程序链接成U-boot映像。
- 顶层目录下的Makefile
- 它负责U-boot整体配置编译。每一种开发板在Makefile都需要有板子配置的定义。
- 配置U-boot:make xxx_config
- 编译:make
U-boot编译生成的文件
文件名称 | 说明 |
---|---|
System.map | U-boot映像的符号表 |
U-boot | U-boot映像的ELF格式 |
U-boot.bin | U-boot映像原始的二进制格式 |
U-boot.srec | U-boot映像的S-Record格式 |
U-boot工具
工具名称 | 说明 |
---|---|
bmp_logo | 制作标记的位图结构体 |
envcrc | 校验U-boot内部嵌入式的环境变量 |
gen_eth_addr | 生成以太网接口MAC地址 |
img2srec | 转换SREC格式映像 |
mkimage | 转换U-boot格式映像 |
updater | U-boot自动更新升级工具 |