一个嵌入式系统从软件角度来看分为三个层次:
-
引导加载程序
包括固化在固件(firmware)中的boot程序(可选),和BootLoader两大部分。 -
Linux内核
特定于嵌入式平台的定制内核 -
文件系统
包括了系统命令和应用程序。
BootLoader概念
BootLoader 就是在操作系统运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件系统带到一个合适的状态,以便为最终调用操作系统做好准备。
为什么需要进行 bootloader 移植?
- 每种不同的CPU体系结构都有不同 BootLoader。除了依赖于CPU的体系结构外,BootLoader 还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片的类型等。
- 这就是说,对于两块不同的开发板而言,即使它们是基于同一种CPU而搭建的,但如果它们的硬件资源或配置不一致的话,要想在一块开发板上运行的 BootLoader 程序也能在另一块板子上运行,还是需要修改。
BootLoader 的启动流程
BootLoader 的启动过程可分为单阶段(Single-Stage)和多阶段(Multi-Stage)两种,通常的 BootLoader 具有更复杂的功能,更好的可移植性。从固态存储设备上启动的 BootLoader 大多采用两阶段,即启动过程可以分为 stage1 和 stage2:stage 1完成初始化硬件,为 stage2 准备内存空间,并将 stage2 复制到内存中,设备堆栈,然后跳转到stage 2.
stage 1通常包括以下步骤:
- 硬件设备初始化
- 为加载 BootLoader 的stage 2 准备RAM空间
- 拷贝 BootLoader 的stage 2 到RAM空间
- 设置好堆栈
- 跳转到 stage 2 的 C 入口点
stage 2通常包括以下步骤:
- 初始化本阶段要使用到的硬件设备
- 将内核映像和根文件系统映像从 flash 上读到 RAM 中
- 调用内核