第1章 启动流程
1.1 上电复位
- CPU 复位,进入启动模式。
- 系统硬件查找启动设备(如 eMMC)。
1.2 ROM Code 阶段(硬件引导)
- 在片上 ROM 中存储的启动代码(BootROM)运行。
- ROM Code 从 eMMC 的 Boot 分区读取 Bootloader 的第一阶段程序(通常是 SPL,Secondary Program Loader)。
- 如果系统支持多种启动设备(如 eMMC、NAND、SPI Flash 等),ROM Code 会根据启动模式选择设备。
1.3 Bootloader阶段
SPL 或 MLO 负责 第一阶段 的启动,初始化一些基本硬件,并从存储设备加载第二阶段 Bootloader(U-Boot)。
U-Boot 负责 第二阶段 的启动,完成硬件的完整初始化,加载操作系统内核,最终启动操作系统。
因此,SPL 或 MLO 和 U-Boot 是两个不同的 Bootloader 阶段,U-Boot 主要负责第二阶段的启动。SPL 或 MLO 并不是 U-Boot 的一部分,而是一个精简的引导加载程序,通常由 U-Boot 提供支持和构建。如果 U-Boot 配置了 SPL(如 U-Boot SPL),那么它们就可以协同工作:SPL 进行初步引导,U-Boot 负责后续完整的引导和系统启动。
1.3.1 第一阶段 Bootloader
第一阶段SPL或者 MLO是系统引导的第一部分,它通常运行在片上存储(如 SRAM)中,并在硬件上电后执行。SPL或 MLO作用:
- 硬件初始化:
- 初始化基本的硬件组件,如 CPU、时钟、电源管理、外设等。
- 初始化 DDR 内存,但通常是非常基本的初始化,只为加载第二阶段 Bootloader 做准备。
- 加载 U-Boot:
- SPL 或 MLO 从存储介质(如 eMMC、NAND Flash 或 SD卡)加载第二阶段的 Bootloader(即 U-Boot)到 DDR 或者 SRAM 中。
- 启动:
- 当第一阶段 Bootloader(SPL 或 MLO)完成硬件初始化和加载任务后,它会跳转到第二阶段 Bootloader(U-Boot),以继续引导过程。
运行环境:
- SPL 或 MLO 代码非常精简,通常不依赖复杂的文件系统或网络支持,只进行基本的硬件初始化和加载 U-Boot。
1.3.2 第二阶段 Bootloader(U-Boot)
U-Boot 是第二阶段的 Bootloader,通常运行在 DDR 中,负责完成启动过程的剩余部分。U-Boot 是嵌入式系统中最常用的开源 Bootloader。U-Boot作用:
- 硬件初始化:
- 完成更复杂的硬件初始化,包括配置所有外设、网络、文件系统等。
- 加载操作系统:
- U-Boot 从存储设备(如 eMMC、NAND Flash、SD卡 等)加载操作系统内核(例如 Linux kernel)到 DDR 中。
- 它还可以加载 设备树(Device Tree)和根文件系统。
- 内核启动:
- 在内核加载到内存后,U-Boot 会跳转到内核的入口点,启动操作系统。
- 其他功能:
- 提供命令行接口,可以在启动过程中进行系统调试、修改引导参数、进行设备驱动加载等。
- 支持多种启动方式,比如网络启动(TFTP)、U-boot 命令行交互、从不同的存储设备启动等。
运行环境:
- U-Boot 可以运行在 DDR(大容量内存)中,提供完整的启动环境和更强大的功能。
- 它支持文件系统(如 FAT、EXT4)和网络协议(如 TFTP、NFS),用于更灵活的启动配置。
1.4操作系统加载
- 内核开始运行,从 DDR 中加载驱动程序、初始化外设。
- 文件系统挂载后,用户空间启动。
第2章 数据流解析
从CPU到BootROM
- CPU上电第一段开始执行的引导程序是从地址0xFFFF0000地址去运行BootROM
从BootROM到存储设备(如eMMC)
- 引导设备检测:根据系统设计,BootROM 会检测并确定从哪个存储设备加载引导程序。
- 设备的检测顺序:SPI NAND Flash > NAND Flash > EMMC > SDMMS > USB;
从 eMMC 到 DDR:
- Bootloader 通过存储接口(如 MMC/SD 接口)读取 eMMC 上的系统文件。
- 读取的数据通过总线(如 AXI、AHB)传输到 DDR。
从 DDR 到 CPU:
如 MMC/SD 接口)读取 eMMC 上的系统文件。
- 读取的数据通过总线(如 AXI、AHB)传输到 DDR。
从 DDR 到 CPU:
- 数据和指令从 DDR 送入 CPU 缓存,以供执行。