嵌入式系统引导加载程序与设备树详解
1. 引导加载程序的作用
在嵌入式 Linux 系统中,引导加载程序(bootloader)主要有两项任务:将系统初始化为基本状态以及加载内核。实际上,第一项任务在某种程度上是为第二项服务的,因为只需让系统达到足以加载内核的运行状态即可。
当系统上电或复位后,引导加载程序的首行代码开始执行,此时系统处于极简状态。DRAM 控制器尚未设置,主内存无法访问;其他接口也未配置,通过 NAND 闪存控制器、MMC 控制器等访问的存储设备同样不可用。通常,初始时唯一可用的资源是单个 CPU 核心和一些片上静态内存。
系统自举由多个代码阶段组成,每个阶段都会使更多系统组件投入运行。引导加载程序的最终操作是将内核加载到 RAM 中,并为其创建执行环境。引导加载程序与内核之间的接口细节因架构而异,但通常都需要完成两件事:一是传递一个指向包含硬件配置信息的结构的指针;二是传递一个指向内核命令行的指针。内核命令行是一个普通的 ASCII 字符串,用于控制 Linux 的行为。内核开始执行后,引导加载程序便不再需要,其所占用的内存也可被回收。
此外,引导加载程序还有一项辅助任务,即提供维护模式,用于更新引导配置、将新的引导镜像加载到内存中,甚至运行诊断程序。这通常通过一个简单的命令行用户界面来控制,常见的是通过串行接口实现。
2. 引导序列
早期,只需将引导加载程序放置在处理器复位向量处的非易失性内存中即可。当时 NOR 闪存很常见,由于它可以直接映射到地址空间,因此是理想的存储方式。以下是这种配置的示意图:
graph
超级会员免费看
订阅专栏 解锁全文
394

被折叠的 条评论
为什么被折叠?



