Boot Loader 概述 简单地说,在操作系统内核运行之前,通过一小程序,可以初始化硬件设备、建立内存空间的映射图等,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核配置好相应的环境,也可以下载文件到系统板上的SDRAM,对 Flash进行擦除与编程,这个小程序一般称为 Boot Loader。可以说,一个功能完善的 Boot Loader已经相当于一个微型的操作系统了。 Boot Loader作为系统复位或上电后首先运行的代码,一般应写入Flash存储器并从起始物理地址 0x0开始。Boot Loader是非常依赖于硬件而实现的,而且根据实现的功能不同,其复杂程度也各不相同。一个简单的 Boot Loader可以只完成 USB口的初始化,而功能完善的 Boot Loader可以支持比较复杂的命令集,对系统的软硬件资源进行合理的配置与管理。因此,建立一个通用的 Boot Loader几乎是不可能的。 系统初始化代码直接对 ARM微处理器内核及硬件控制器编程,多采用汇编语言编程,初始化代码一般应包括如下典型任务: 1. 定义程序入口点; 2. 设置异常和中断向量表; 3. 初始化存储设备; 4. 初始化堆栈指针寄存器; 5. 初始化用户执行环境; 6. 呼叫主应用程序。 1.1 定义程序入口 初始化代码必须定义整个程序的入口点。通过伪指令 Entry 指定编译器保留该段代码,同时配合链接器的设置,确定整个程序的入口点。 1.2 设置异常和中断向量表 1.3 初始化存储设备 1. 存储器类型和时序的配置 2. 存储器的地址分配与地址重映射 一种典型的存储器地址重映射过程描述如下:当系统上电或复位以后,PC指针指向 0x0,程序从 0x0地址开始执行,因此,为了能正确读取代码,要求此时 Flash(或其它类型的 ROM)的起始地址为 0x0。但 Flash(或其它类型的ROM)的访问速度大大低于 RAM,每次产生异常后,都要从 Flash(或其它类型的 ROM)的异常向量表调转到相应的处理程序,会影响异常的响应速度,因此,系统便提供一种灵活的地址重映射方法,在系统完成必要地初始化以后,将RAM安排到 0x0地址处,而将原来位于 0x0处的 Flash(或其它类型的 ROM)安排到其他的地方上去,加快异常的响应速度。 这个过程中最容易出错的地方是如何保证程序执行流程的连续性。因为 PC指针最初在 Flash里取指令执行,在进行地址重映射以后,Flash(或其它类型的 ROM)被安排到其他地址上去了,而当前地址被安排为 RAM,如果事先没有对RAM的内容...