1. 启动流程总览:嵌入式Linux启动的完整阶段
嵌入式Linux系统的启动是一个多阶段、高度协同的过程,从硬件上电到用户空间就绪,通常经历四个核心阶段:BootROM、Bootloader、内核、init进程。每个阶段承担不同的职责,且对整体启动时间的贡献差异显著。本章将系统梳理各阶段的工作内容、时间占比,并建立后续延迟排查的全局视角。
1.1 启动四阶段全景
下图展示了嵌入式Linux从硬件复位到用户空间就绪的完整流程,以及各阶段之间的衔接关系。
1.2 各阶段详细职责
| 阶段 | 执行主体 | 核心工作 | 典型耗时 | 优化潜力 |
|---|---|---|---|---|
| BootROM | 芯片内部ROM代码 | CPU复位、时钟源选择、启动介质检测、加载SPL/第一阶段Bootloader | 10 ~ 50 ms | 低(固化在芯片内) |
| Bootloader | U-Boot / Barebox / ATF | DDR初始化、时钟树配置、外设(MMC/NAND/网络)初始化、设备树加载、内核镜像加载到内存 | 100 ~ 500 ms | 高(裁剪驱动、优化初始化顺序) |
| 内核 | Linux Kernel | 解压(如压缩)、架构初始化、内存管理、调度器、驱动加载、设备树解析、挂载根文件系统 | 200 ~ 1000 ms | 高(模块延迟、驱动并行、initcall优化) |
| init进程 | systemd / BusyBox init / 自定义init | 执行初始化脚本、启动系统服务、挂载文件系统、启动应用程序 | 100 ~ 500 ms | 中(服务并行化、延迟启动) |
关键洞察:在典型的嵌入式Linux系统中,内核阶段和Bootloader阶段合计占总启动时间的70%~85%。其中,内核阶段的驱动加载和initcall执行是延迟的主要来源,也是本手册后续章节重点排查的对象。
1.3 各阶段时间占比分析
不同应用场景下,各阶段的时间占比存在差异。以下给出三种典型场景的分布数据,帮助读者建立量化认知。
1.4 启动时间关键指标
在启动优化工作中,通常关注以下三个关键时间指标:
- 冷启动时间(Cold Boot Time):从系统上电到用户空间首个应用程序就绪的总时间。这是最常用的优化目标。
- 内核启动时间(Kernel Boot Time):从Bootloader跳转到内核入口(start_kernel)到init进程启动的时间。本手册主要关注此阶段。
- 用户空间就绪时间(Userspace Ready Time):从init进程启动到关键服务/应用程序完成初始化的时间。
优化优先级建议:按照“二八原则”,优先排查内核阶段的驱动加载和initcall执行。通常,优化内核启动时间可以带来最大的收益。建议使用initcall_debug内核参数和bootgraph工具进行第一轮延迟定位。
1.5 启动流程中的关键事件点
下表列出了启动流程中可用于测量和插桩的关键事件点,这些点将作为后续章节延迟排查的基准。
| 事件点 | 所属阶段 | 测量方法 | 说明 |
|---|---|---|---|
| 上电复位 | BootROM | 示波器/逻辑分析仪 | 硬件复位信号释放时刻 |
| Bootloader入口 | Bootloader | U-Boot串口输出时间戳 | SPL或U-Boot开始执行 |
| 内核解压完成 | 内核 | 内核早期printk时间戳 | 解压完成,开始执行start_kernel |
| initcall开始 | 内核 | initcall_debug日志 | 内核开始执行各级初始化调用 |
| initcall结束 | 内核 | initcall_debug日志 | 所有initcall执行完毕 |
| 根文件系统挂载 | 内核 | 内核日志“VFS: Mounted root” | 根文件系统挂载成功 |
| init进程启动 | init | 内核日志“Run /sbin/init” | 内核启动第一个用户空间进程 |
| 用户空间就绪 | init | 应用程序日志/看门狗 | 关键服务或应用程序完成初始化 |