1、Bootloader的启动过程启动过程可以分为单阶段(Single Stage)、多阶段(Multi-Stage)两种。通常多阶段的Bootloader能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的Bootloader大多都是 2 阶段的启动过程。这从前面的硬件实验可以很好地理解这点:第一阶段使用汇编来实现,它完成一些依赖于 CPU 体系结构的初始化,并调用第二阶段的代码。第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性。
一般而言,这两个阶段完成的功能可以如下分类,但这不是绝对的:
(1)Bootloader第一阶段的功能。
·
- 硬件设备初始化。
- 为加载Bootloader的第二阶段代码准备RAM空间。
- 拷贝Bootloader的第二阶段代码到 RAM 空间中。
- 设置好栈。
- 跳转到第二阶段代码的C入口点。
在第一阶段进行的硬件初始化一般包括:关闭WATCHDOG、关中断、设置CPU的速度和时钟频率、RAM初始化等。这些并不都是必需的,比如S3C2410/S3C2440的开发板所使用的U-Boot中,就将CPU的速度和时钟频率的设置放在第二阶段。
甚至,将第二阶段的代码复制到RAM空间中也不是必需的,对于NOR Flash等存储设备,完全可以在上面直接执行代码,只不过这相比在RAM中执行效率大为降低。
(2)Bootloader第二阶段的功能。
·
- 初始化本阶段要使用到的硬件设备。
- 检测系统内存映射(memory map)。
- 将内核映像和根文件系统映像从Flash上读到RAM空间中。
- 为内核设置启动参数。
- 调用内核。
为了方便开发,至少要初始化一个串口以便程序员与Bootloader进行交互。
所谓检测内存映射,就是确定板上使用了多少内存,它们的地址空间是什么。
2、将内核存放在适当的位置后,直接跳到到它的入口点即可调用内核。调用内核之前,下列条件要满足:
(1)CPU 寄存器的设置。
·
- R0=0
- R1=机器类型ID;对于ARM结构的CPU,其机器类型ID可以参见 linux/arch/arm/tools/mach-types。
- R2=启动参数标记列表在 RAM 中起始基地址
(2)CPU工作模式。
·
- 必须禁止中断(IRQs和FIQs)
- CPU 必须 SVC 模式
(3)Cache 和 MMU 的设置。
·
- MMU 必须关闭
- 指令 Cache 可以打开也可以关闭
- 数据 Cache 必须关闭
3、U-Boot顶层目录说明
目录 | 特性 | 解释说明 |
board | 开发板相关 | 对应不同配置的电路板(即使CPU相同),比如smdk2410、sbc2410x |
cpu | 平台相关 | 对应不同的CPU,比如arm920t、arm925t、i386等;在它们的子目录下仍可以进一步细分,比如arm920t下就有at91rm9200、s3c24x0 |
lib_i386类似 | 某一架构下通用的文件 |
|
include | 通用的函数 | 头文件和开发板配置文件,开发板的配置文件都放在include/configs目录下,U-Boot没有make menuconfig类似的莱单来进行可视化配置,需要手动地修改配置文件中的宏定义 |
lib_generic | 通用的库函数,比如printf等 | |
common | 通用的函数,多是对下一层驱动程序的进一步封装 | |
disk | 通用的设备驱动程序 | 硬盘接口程序 |
drivers | 各类具体设备的驱动程序,基本上可以通用,它们通过宏从外面引入平台/开发板相关的函数 |
|
dtt | 数字温度测量器或者传感器的驱动 |
|
fs | 文件系统 |
|
nand_spl | U-Boot一般从ROM、NOR Flash等设备启动,现在开始支持从NAND Flash启动,但是支持的CPU种类还不多 |
|
net | 各种网络协议 |
|
post | 上电自检程序 |
|
rtc | 实时时钟的驱动 |
|
doc | 文档 | 开发、使用文档 |
examples | 示例程序 | 一些测试程序,可以使用U-Boot下载后运行 |
tools | 工具 | 制作S-Record、U-Boot格式映像的工具,比如mkimage |
4、根据顶层Readme文件的说明,可以知道如果要使用开发板board/<board_name>,就先执行“make <board_name>_config”命令进行配置,然后执行“makeall”,就可以生成如下3个文件:
- u-boot.bin:二进制可执行文件,它就是可以直接烧入ROM、NOR Flash的文件。
- u-boot:ELF格式的可执行文件
- u-boot.srec:Motorola S-Record格式的可执行文件