1. 启动流程概述

嵌入式系统的启动过程是一条从硬件复位到操作系统稳定运行的完整链路。理解这条链路上的每一个环节,是进行启动性能调优的前提。本章将拆解从系统上电到内核启动的完整流程,并明确 Bootloader 与内核的角色划分。

1.1 启动流程全景图

嵌入式系统启动通常经历以下五个核心阶段:

  1. 上电复位与硬件初始化:CPU 从复位向量取指,执行固化在 ROM 中的启动代码(如 ROM Bootloader)。
  2. 一级 Bootloader(SPL / MBR):极小体积的引导程序,负责初始化关键外设(时钟、DDR 控制器),加载二级 Bootloader。
  3. 二级 Bootloader(U-Boot / UEFI):功能完整的引导加载程序,负责初始化外设、加载内核映像与设备树到内存。
  4. 内核解压与初始化:Bootloader 跳转到内核入口,内核自解压(若压缩),执行架构级初始化。
  5. 根文件系统挂载与用户空间启动:内核挂载根文件系统,启动 init 进程,进入用户空间。
性能调优关键点:启动时间优化的主要战场集中在阶段 2、3、4。减少 Bootloader 的初始化冗余、优化内核解压算法、精简设备树,是缩短启动时间的三大核心手段。
嵌入式系统启动流程全景图 嵌入式系统启动流程全景图 上电复位 ROM Bootloader 一级 Bootloader SPL / MBR 二级 Bootloader U-Boot / UEFI 内核解压与初始化 Linux Kernel 根文件系统 init / systemd 各阶段典型耗时占比(以典型嵌入式 Linux 系统为例) • 上电复位 & 一级 Bootloader:5% – 15%(硬件初始化 + 加载二级 Bootloader) • 二级 Bootloader:20% – 40%(外设初始化、网络/存储驱动、内核加载) • 内核解压与初始化:30% – 50%(解压、架构初始化、驱动 probe) • 根文件系统挂载与用户空间:10% – 20%(init 启动、服务加载)

1.2 Bootloader 与内核的角色划分

Bootloader 和内核在启动链路中承担截然不同的职责。明确两者的边界,有助于在优化时精准定位瓶颈。

维度 Bootloader 内核
主要职责 硬件初始化、加载内核映像到内存、传递启动参数 进程管理、内存管理、驱动框架、文件系统、网络协议栈
运行环境 实模式 / 非保护模式(早期),无操作系统依赖 保护模式 / 虚拟内存模式,依赖 MMU
代码体积 通常 64KB – 2MB(U-Boot 约 500KB – 1MB) 通常 2MB – 20MB(压缩后)
执行时间 毫秒级(100ms – 2s) 秒级(1s – 10s,含驱动初始化)
优化重点 减少外设初始化冗余、优化存储读取速度、精简设备树 压缩算法选择、驱动异步 probe、initcall 裁剪
实践建议:在启动性能调优项目中,建议先使用 bootgraph 或 ftrace 工具分别测量 Bootloader 和内核各阶段的耗时,再针对占比最高的阶段进行优化。通常内核解压和驱动初始化是最大的时间消耗点。

1.3 启动链路的详细阶段分解

下面以典型的 ARM Cortex-A 系列处理器 + U-Boot + Linux 组合为例,展示从上电到内核启动的详细阶段分解:

  • 阶段 0:ROM Bootloader(固化在芯片内部 ROM)
    • CPU 从复位向量(0x00000000 或 0xFFFF0000)取指。
    • 执行芯片厂商固化的启动代码,初始化 CPU 模式、堆栈指针。
    • 根据启动引脚(eMMC / NAND / SPI / UART)加载一级 Bootloader 到 SRAM。
  • 阶段 1:SPL(Secondary Program Loader)
    • 初始化时钟、DDR 控制器、串口(用于调试输出)。
    • 从存储介质读取 U-Boot 完整映像到 DDR。
    • 跳转到 U-Boot 入口。
  • 阶段 2:U-Boot(完整 Bootloader)
    • 初始化更多外设:网络、USB、存储控制器。
    • 执行环境变量脚本(bootcmd),加载内核映像(zImage / Image)和设备树(DTB)到内存。
    • 设置内核启动参数(ATAG / DTB),跳转到内核入口。
  • 阶段 3:内核启动
    • 解压内核(若为压缩映像),设置页表,开启 MMU。
    • 执行 start_kernel(),初始化调度器、内存管理、中断系统。
    • 调用 do_initcalls(),按优先级执行各级驱动初始化。
    • 挂载根文件系统,执行 /sbin/init。
Bootloader 与内核角色划分架构图 Bootloader 与内核角色划分架构图 Bootloader 阶段 硬件初始化 时钟 / DDR / 串口 加载内核映像 从存储到 DDR 传递启动参数 ATAG / DTB 跳转到内核 修改 PC 寄存器 内核阶段 内核解压 自解压 / 重定位 架构初始化 MMU / 中断 / 调度器 驱动初始化 do_initcalls() 挂载根文件系统 init / systemd

1.4 启动时间关键指标

在启动性能调优中,以下指标用于量化启动速度:

指标 定义 典型目标值
Cold Boot Time 从系统上电到用户空间第一个应用程序就绪的时间 < 3s(消费电子) / < 1s(汽车仪表)
Warm Boot Time 从软件复位到用户空间就绪的时间(DDR 保持自刷新) < 1s
Kernel Boot Time 从 Bootloader 跳转到内核到 init 进程启动的时间 < 1.5s
Bootloader Time 从一级 Bootloader 开始到跳转到内核的时间 < 500ms
常见误区:不要只优化 Bootloader 而忽略内核。实际项目中,内核解压和驱动初始化往往占据总启动时间的 50% 以上。建议使用 bootchart 或 initcall_debug 内核参数来精确测量内核各阶段的耗时。

1.5 启动流程中的关键硬件依赖

启动速度受硬件选型直接影响。以下是影响启动时间的关键硬件因素:

  • 存储介质读取速度:eMMC(200-400 MB/s)> NAND Flash(20-40 MB/s)> SPI NOR Flash(1-5 MB/s)。
  • DDR 初始化时间:DDR4 初始化约 50-100ms,DDR3 约 30-80ms,LPDDR4 约 100-200ms(含训练)。
  • CPU 主频与缓存:更高的主频和更大的 L2/L3 缓存可加速内核解压和驱动初始化。
  • 启动介质接口:8-bit eMMC HS400 模式 vs 4-bit SD 卡,读取速度差异可达 10 倍。
调优前置检查清单:
✅ 确认存储介质工作在最高传输模式(如 eMMC HS400 / DDR50)。
✅ 确认 DDR 训练参数已固化(跳过每次启动的重新训练)。
✅ 确认 Bootloader 中未初始化不必要的硬件(如未使用的 USB、以太网 PHY)。
✅ 确认内核映像使用 LZ4 或 LZO 压缩(比 gzip 解压速度快 2-3 倍)。