系统启动流程

一、完整流程

按下电源
  │
  ▼
[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

2. SPL / MLO

3. U-Boot

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 进程

四、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