嵌入式Linux引导加载程序全解析
1. 引导加载程序的作用
在嵌入式Linux系统中,引导加载程序主要有两项任务:将系统初始化为基本状态,并加载操作系统内核。实际上,第一项任务是为第二项服务的,即只需确保系统的部分功能正常运行,以满足加载内核的需求。
当设备上电或复位后,引导加载程序的代码开始执行,此时系统处于非常原始的状态。DRAM控制器尚未设置,主内存无法访问;其他接口也未配置,通过NAND闪存控制器、MMC控制器等访问的存储设备同样不可用。通常,最初可用的资源只有一个CPU核心和一些片上静态内存。因此,系统的引导过程包含多个阶段的代码,每个阶段都会使系统的更多部分开始运行。
引导加载程序的最终操作是将内核加载到RAM中,并为其创建执行环境。引导加载程序与内核之间的接口细节因架构而异,但一般都需要完成两件事:一是传递指向包含硬件配置信息的结构的指针,二是传递指向内核命令行的指针。内核命令行是一个ASCII字符串,用于控制Linux的行为。一旦内核开始执行,引导加载程序就不再需要,其占用的内存可以被回收。
此外,引导加载程序还提供维护模式,用于更新引导配置、将新的引导镜像加载到内存中,甚至运行诊断程序。这通常通过一个简单的命令行用户界面来控制,常见的是通过串行接口。
2. 引导序列
2.1 简单情况
在过去,只需将引导加载程序放置在处理器复位向量处的非易失性内存中即可。当时,NOR闪存很常见,由于它可以直接映射到地址空间,因此是理想的存储方式。复位向量位于闪存区域的高端,地址为0xfffffffc,引导加载程序在此处设置了一个跳转指令,指向其代码的起始位置。
引导加载程