Bootloader 设计分析 3.1 Bootloader 的操作模式 (Operation Mode) 大多数 Bootloader 都包含两种不同的操作模式[2]: (1). 启动加载(Boot loading)模式:也称为“自主”模式。即Bootloader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。 (2).下载(Downloading) 模式:在这种模式下,目标机上的Bootloader 将通过串口或网络连接等通信手段从主机( Host) 下载内核映像和根文件系统映像等,然后保存到目标机上的FLASH 类固态存储设备中。Bootloader 的这种模式通常在系统初次安装和更新时被使用,工作于这种模式下的Bootloader 通常都会向它的终端用户提供一个简单的命令行接口。 在我们的Bootloader 设计中我们同时支持这两种工作模式,采用的方法是:一开始启动时处于正常的启动加载模式,但并不立即启动进入uClinux 内核,而是提示延时5 秒,等待终端用户如果按下某一特定按键,则切换到下载模式,否则继续启动uCLinux 内核。 3.2 Bootloader 的启动及初始化 基于ARM 的芯片多数为复杂的片上系统(SoC),这类复杂系统里的多数硬件模块都是可配置的[3]。 因此大多数 Bootloader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,通常都放在 stage1 中,而且在这一部分,我们直接对处理器内核和硬件控制器进行编程,因此常常都用汇编语言来实现。而stage2 则通常用C 语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。 3.2.1 Bootloader 的 stage1 这部分代码必须首先完成一些基本的硬件初始化,为stage2 的执行以及随后的kernel 的执行准备好一些基本的硬件环境[2]。 Bootloader 的 stage1 一般通用的内容包括: * 定义程序入口点 * 设置异常向量表 * 初始化存储系统(包括地址重映射) * 初始化有特殊要求的端口,设备 * 初始化用户程序的执行环境 * 初始化堆栈指针寄存器,必要时改变处理器的模式 * 设置FIQ/IRQ 中断处理程序入口 * 进入C 程序 在整个Bootloader 的初始化过程中我们都不必响应中断,因此首先禁止系统的中断,然后程序设置CPU 的速度和时钟频率,设置CPU 内部指令/数据cache, DRAM 初始化,DRAM 初始化完成后即可拷贝ROM 中的代码到DRAM 中, 然后内存重映射,程序开始进入DRAM 中执行,然后再初始化一些用户有特殊要求的端口、设备,比...