banner
NEWS LETTER

嵌入式 Linux 系列 03:从上电到 Shell 的启动链路

Scroll down

理解启动链路,是排查嵌入式 Linux 问题的基础。系统启动失败时,不能只说“板子起不来”,而要能判断卡在 BootROM、Bootloader、Kernel、RootFS 还是 init 阶段。

一、启动链路总览

典型流程:

1
2
3
4
5
6
7
8
9
上电
-> BootROM
-> SPL / First stage bootloader
-> U-Boot
-> Linux Kernel
-> Device Tree
-> RootFS
-> init
-> shell / service

不同芯片厂商细节不同,但排查思路类似。

二、BootROM 和 SPL

BootROM 是芯片内部固化代码,负责从固定介质加载下一阶段。

常见启动介质:

  • eMMC。
  • NAND。
  • NOR Flash。
  • SD 卡。
  • USB。
  • SPI Flash。

如果串口完全没有输出,要先怀疑:

  • 供电问题。
  • 启动模式拨码错误。
  • Flash 镜像损坏。
  • 串口接线错误。
  • BootROM 没有找到可启动介质。

三、U-Boot 阶段看什么

U-Boot 日志里重点看:

1
2
3
4
DRAM:  512 MiB
MMC: mmc@...
Loading Environment from MMC...
Hit any key to stop autoboot

进入 U-Boot 命令行后常用命令:

1
2
3
4
5
6
7
8
printenv
setenv
saveenv
mmc list
mmc dev 0
fatls mmc 0:1
ext4ls mmc 0:2 /
boot

关键环境变量:

1
2
3
4
5
6
bootcmd
bootargs
kernel_addr_r
fdt_addr_r
root
console

如果 kernel 没有加载成功,就查存储分区、文件路径和加载地址。

四、Kernel 阶段看什么

内核启动后日志通常会显示:

1
2
3
4
5
6
Linux version ...
Kernel command line: ...
Memory: ...
OF: fdt: Machine model: ...
VFS: Mounted root ...
Run /sbin/init as init process

重点看:

  • kernel command line 是否正确。
  • console 参数是否正确。
  • rootfs 是否挂载成功。
  • 设备树是否匹配板子。
  • 内核是否 panic。

常见 root 参数:

1
2
3
root=/dev/mmcblk0p2 rootwait rw
root=/dev/nfs nfsroot=192.168.1.10:/nfs/rootfs
rootfstype=ext4

如果看到:

1
VFS: Unable to mount root fs

就优先查 root 参数、文件系统驱动和分区。

五、RootFS 和 init 阶段

内核挂载 rootfs 后,会尝试启动 init。

常见路径:

1
2
3
4
/sbin/init
/etc/init
/bin/init
/bin/sh

如果 init 不存在或动态库缺失,可能出现 kernel panic:

1
No working init found

BusyBox 系统一般有:

1
2
3
/sbin/init
/etc/inittab
/etc/init.d/rcS

rcS 负责挂载 proc、sysfs、devtmpfs,启动网络和业务服务。

六、一个启动问题定位方法

按阶段提问:

  1. 串口有没有任何输出。
  2. U-Boot 有没有起来。
  3. U-Boot 能不能找到 kernel 和 dtb。
  4. Kernel 有没有打印 command line。
  5. RootFS 有没有挂载成功。
  6. init 有没有启动。
  7. rcS 有没有执行。
  8. 业务服务有没有启动。

每一步都对应不同工具和日志,不要把所有问题都归到“系统坏了”。

七、建议保存基准日志

每个可用版本都保存一份完整启动日志:

1
2
3
logs/
boot-v1.0.0.log
boot-v1.0.1.log

升级后如果启动失败,对比日志通常比直接看代码更快。

其他文章
目录导航 置顶
  1. 1. 一、启动链路总览
  2. 2. 二、BootROM 和 SPL
  3. 3. 三、U-Boot 阶段看什么
  4. 4. 四、Kernel 阶段看什么
  5. 5. 五、RootFS 和 init 阶段
  6. 6. 六、一个启动问题定位方法
  7. 7. 七、建议保存基准日志
请输入关键词进行搜索