系统启动流程
一、完整流程
按下电源
│
▼
[1] 硬件复位
│
▼
[2] SoC 内置 ROM 代码(BootROM)
- 读启动模式引脚 / eFUSE
- 选择启动源(NOR/NAND/eMMC/SD/USB/...)
- 加载第一阶段引导程序到 SRAM
│
▼
[3] SPL / MLO(First Stage Bootloader)
- 初始化 DRAM
- 加载第二阶段引导程序到 DRAM
│
▼
[4] U-Boot(Second Stage Bootloader)
- 进一步初始化(网络、USB、显示)
- 读环境变量 / 启动脚本
- 加载内核、设备树、根文件系统到 DRAM
│
▼
[5] Linux 内核自解压
│
▼
[6] start_kernel() → setup_arch() → ...
│
▼
[7] 内核初始化(控制台、调度、内存、网络、...)
│
▼
[8] 挂载根文件系统
- 内核命令参数 root=/dev/mmcblk0p2
- VFS 挂载
│
▼
[9] 启动第一个进程 /sbin/init
│
▼
[10] systemd / busybox init
- 启动服务
- 启动 shell / 登录
│
▼
[11] 用户登录 / 应用启动
二、典型启动日志
U-Boot SPL 2024.01 (Jul 20 2026 - 10:30:00 +0800)
Trying to boot from MMC1
Reading U-Boot from MMC
U-Boot 2024.01 (Jul 20 2026 - 10:30:00 +0800)
CPU: i.MX6ULL rev1.1 at 396 MHz
Model: MY Board
DRAM: 512 MiB
MMC: FSL_SDHC: 0
Loading Environment from MMC... OK
In: serial
Out: serial
Err: serial
Net: eth0
Hit any key to stop autoboot: 0
=>
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 6.1.0-myboard (builder@host)
[ 0.000000] Machine model: MY Board
...
[ 1.234567] Run /sbin/init as init process
[ 2.345678] systemd[1]: System Initialization started.
[ 3.456789] systemd[1]: Reached target Multi-User System.
[ 4.567890] systemd[1]: Startup finished in 3.5s.
MY Board login: root
三、关键点
1. BootROM
- 芯片内置,不可修改
- 一般支持多种启动源
- 找代码:芯片厂商 SDK 的
arch/arm/cpu/armv7/...
2. SPL / MLO
- 在 SRAM 中运行(只有几十 KB 空间)
- 唯一目的:初始化 DRAM
- 由 U-Boot 同一套代码编译
- 配置文件:
include/configs/<soc>.h
3. U-Boot
- 主要 bootloader
- 见
02-u-boot.md
4. 内核启动参数
root=/dev/mmcblk0p2 根文件系统
rootfstype=ext4 文件系统类型
rootwait 等待设备就绪
console=ttymxc0,115200 控制台
earlycon 早期控制台
init=/sbin/myinit 自定义 init
loglevel=7 日志级别
mem=256M 限制内存
设置方式:
- U-Boot:setenv bootargs "..."
- 设备树:/chosen 节点
- 内核默认
5. init 进程
- PID 1,所有进程的祖先
- 内核最后一步
- 退出则系统 panic
四、x86 vs ARM 启动对比
| 阶段 | x86 | ARM |
|---|---|---|
| 固件 | BIOS / UEFI | BootROM |
| 引导 | MBR / EFI | SPL + U-Boot |
| 内核 | 直接加载 | U-Boot 加载 |
五、嵌入式启动时间优化
# 内核
CONFIG_PRINTK_TIME=n # 关闭时间戳
CONFIG_INIT_DEBUG=n
CONFIG_PROFILING=n
# init 流程
# 1. 用 systemd-analyze
systemd-analyze blame
systemd-analyze plot > boot.svg
# 2. 删掉不需要的服务
systemctl disable xxx
# 3. 并行启动(systemd 默认)
systemd-analyze critical-chain
# 4. prelink / 静态库
六、关键文件位置
/boot/
├── vmlinuz-6.1.0 内核
├── initrd.img-6.1.0 initramfs
├── System.map-6.1.0 符号表
├── config-6.1.0 内核配置
└── dtb/ 设备树
└── myboard.dtb
七、安全启动链
BootROM (ROM)
↓ 验证
SPL(签名)
↓ 验证
U-Boot(签名 + 锁)
↓ 验证
内核(签名 + 校验)
↓ 验证
rootfs(dm-verity)
详见 07-advanced/02-secure-boot.md。