在嵌入式系统中,通常没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由Bootloader来完成。
Bootloader就是在操作系统内核运行之前运行的一段程序,类似于PC机中的BIOS程序。
Bootloader的功能是完成硬件设备的初始化、建立内存空间的映射图的功能,将系统的软硬件环境带到一个合适的状态,为最终调用系统内核做好准备。
嵌入式Bootloader一般都非常依赖于硬件,建立一个通用的Bootloader几乎是不可能的。Bootloader是引导与加载内核镜像的工具,需要具备以下几个功能。
1.初始化RAM(必须)
Bootloader必须能够初始化RAM,因为将来系统要通过它保存一些Volatile数据,但具体的实现要依赖于具体的CPU以及硬件系统。
2.初始化串口
3.启动内核镜像
根据内核镜像保存的存储介质不同,可以有两种启动方式,FLASH启动以及RAM启动,但是无论是哪种启动方式,下面的系统状态必须得到满足。
(1)CPU寄存器的设置
R0=0;
R1=机器类型
R2=启动参数标记列表在RAM中的起始地址
这3个寄存器的设置是在最后启动内核时通过启动参数来传递完成的。
(2)CPU模式
关闭中断,属于SVC模式
Bootloader中没有必要支持中断的实现,这属于内核机制以及设备驱动管理的管理范畴;SVC模式是系统的一种保护模式,这样就可以进行一些只能在SVC模式下的操作。例如一些特定寄存器访问操作。
(3)Cache和MMU的设置
MMU必须关闭。
数据cache必须关闭。
指令cache可以关闭也可以开启。
Bootloader中所有对地址的操作都是使用物理地址,是实地址,不存在虚拟地址,因此MMU必须关闭。Bootloader主要是装载内核镜像,镜像数据必须真实写回SDRAM中,所以数据cache必须关闭,而对于指令cache,不存在强制的规定,但是一般情况下,推荐关闭指令cache。