理解启动链路,是排查嵌入式 Linux 问题的基础。系统启动失败时,不能只说“板子起不来”,而要能判断卡在 BootROM、Bootloader、Kernel、RootFS 还是 init 阶段。
一、启动链路总览
典型流程:
1 | 上电 |
不同芯片厂商细节不同,但排查思路类似。
二、BootROM 和 SPL
BootROM 是芯片内部固化代码,负责从固定介质加载下一阶段。
常见启动介质:
- eMMC。
- NAND。
- NOR Flash。
- SD 卡。
- USB。
- SPI Flash。
如果串口完全没有输出,要先怀疑:
- 供电问题。
- 启动模式拨码错误。
- Flash 镜像损坏。
- 串口接线错误。
- BootROM 没有找到可启动介质。
三、U-Boot 阶段看什么
U-Boot 日志里重点看:
1 | DRAM: 512 MiB |
进入 U-Boot 命令行后常用命令:
1 | printenv |
关键环境变量:
1 | bootcmd |
如果 kernel 没有加载成功,就查存储分区、文件路径和加载地址。
四、Kernel 阶段看什么
内核启动后日志通常会显示:
1 | Linux version ... |
重点看:
- kernel command line 是否正确。
- console 参数是否正确。
- rootfs 是否挂载成功。
- 设备树是否匹配板子。
- 内核是否 panic。
常见 root 参数:
1 | root=/dev/mmcblk0p2 rootwait rw |
如果看到:
1 | VFS: Unable to mount root fs |
就优先查 root 参数、文件系统驱动和分区。
五、RootFS 和 init 阶段
内核挂载 rootfs 后,会尝试启动 init。
常见路径:
1 | /sbin/init |
如果 init 不存在或动态库缺失,可能出现 kernel panic:
1 | No working init found |
BusyBox 系统一般有:
1 | /sbin/init |
rcS 负责挂载 proc、sysfs、devtmpfs,启动网络和业务服务。
六、一个启动问题定位方法
按阶段提问:
- 串口有没有任何输出。
- U-Boot 有没有起来。
- U-Boot 能不能找到 kernel 和 dtb。
- Kernel 有没有打印 command line。
- RootFS 有没有挂载成功。
- init 有没有启动。
- rcS 有没有执行。
- 业务服务有没有启动。
每一步都对应不同工具和日志,不要把所有问题都归到“系统坏了”。
七、建议保存基准日志
每个可用版本都保存一份完整启动日志:
1 | logs/ |
升级后如果启动失败,对比日志通常比直接看代码更快。
- 本文链接: https://blog.hansong.icu/2026/06/26/Embedded_Linux_Series_03_Boot_Chain/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。