bootloader:
bootloader是系统上的后最初加载运行的代码。
简单的说,bootloader就是在操作系统内核运行前就运行的一段小程序。这段小程序可以初始化必要的硬件设备,将系统的软硬件
环境带到一个合适的状态,并从外部存储器或通过网络等通信方式加载内核,创建内核需要的一些信息并将这些信息通过相关机制传递
给内核,最终调用操作系统内核。
一个嵌入式Linux系统从软件的角度看通常可以分为四个部分:bootloader、Linux内核、跟文件系统及用户的应用程序。bootloader
处于系统的最底层,运行于系统启动的最初阶段。
bootloader的启动过程可以是单阶段的,也可以是多阶段的。多阶段的bootloader一般比单阶段的bootloader提供更为复杂的功能,
以及更好的可移植性。从固态存储设备上启动的bootloader大多数是二阶段的启动过程,比如U-boot。
以U-boot为例对两个阶段中bootloader所做的操作进行简要说明:
第一阶段:
bootloader执行最基本的硬件初始化操作,如关闭中断、关闭看门狗以避免处理器被复位,以及关闭MMU功能、关闭处理器缓存、
设置系统时钟、初始化内存等。
这一阶段的代码通常由汇编编写,为了运行下一阶段的C语言程序还必须设置好堆栈。
如果是从NAND Flash启动,则必须通过NAND Flash控制器将bootloader代码复制到内存。
第二阶段:
此阶段一般用C语言编写,大体分为以下步骤.
1:初始化各种硬件设备,比如配置处理器正常工作的时钟频率、初始化串口等。
2:检测系统内存,主要是确定系统内存容量以及其他地址空间信息。
3:将内核映像文件加载到内存。
4:准备内核引导参数。
5:跳转到内核的第一条指令处,开始执行内核初始化代码,控制权转移到内核代码,bootloader的使命结束。
大多数bootloader都包含两种不同的操作模式:“启动加载”模式和“下载”模式。
对于一个运行于ARM平台的系统来说,bootloader作为引导与加载内核映像的工具需要提供以下几个功能.
1.初始化内存
2.初始化串口
3.参加内核参数列表
4.加载内核映像到内存
5.启动内核镜像
在实际使用中,U-boot被固化在CPU的上电/复位启动地址处(通常在非易失存储器中)。每当嵌入式设备上电/复位时,CPU总是从启动
地址处执行,也就是执行U-boot。U-boot启动后,首先初始化各种硬件设备,如CPU、缓冲、存储器、MMU、总线控制器、各种I/O接口等,
然后从远程或者本地非易失存储设备中装载可执行文件或操作系统,为整个嵌入式系统准备运行环境。
MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控
制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。