启动过程
开发板依次通过 ROM、SPL、OpenSBI 和 U-Boot 启动 Linux。本页说明各阶段的 作用,以及启动在早期停止时应检查哪些文件。
1. ROM 与 SPL
项目构建将 SPL 打包为 out/images/spl_app.bin,其原始 Flash 偏移为 0x002000,容量限制为 48 KiB;之前的 8 KiB 为 FlashEncryption 强制保留区。SPL 初始化内存和时钟,将完整 Flash 从原始偏移零映射到物理 0x40000000,再加载位于 0x00E000 的 U-Boot FIT。
构建入口见 mk/boot.mk,运行时板级初始化见 u-boot-esp32-s31/board/espressif/esp32s31/spl.c。
2. OpenSBI 和 U-Boot
SPL 在机器模式下进入 OpenSBI,并传入 U-Boot 主程序的地址。OpenSBI 初始化 平台服务,并在监管者模式下启动 U-Boot。启动完成后,OpenSBI 仍负责处理 Linux 的 SBI 调用。
U-Boot 使用 Linux 设备树启动内核。默认启动命令使用以下映射地址:
booti 0x40400000 - 0x4005e000
第一个地址是内核,第二个是设备树,对应原始 Flash 偏移 0x400000 和 0x05E000。修改 XIP 布局时,必须保留内核起点的 4 MiB Sv32 大页对齐。OpenSBI 位于 FIT 固定外部数据偏移 0x400,从 0x4000E400 XIP 执行;可写数据位于内部 SRAM。地址与分区约定见Flash 布局。
3. Linux 和根文件系统
Linux 初始化内存、中断、定时器和设备驱动,然后启动根文件系统中的 /init。
早期初始化脚本组建可写根文件系统,恢复保存的设备树覆盖层,加载所选无线模式, 然后启动 BusyBox init。文件系统布局和保存的设置见 配置。
如果持久化文件系统挂载失败,脚本会打印错误,并从只读基础系统启动 BusyBox init。
恢复路径为 /run、/tmp 和 /var/log 挂载易失存储,持久化设置不可用,
并跳过早期覆盖层恢复和无线模块加载。检查步骤见调试。
4. 服务和串口登录
BusyBox 启动开发板服务和串口登录。服务通过 rcS 运行,输出保存到
/run/rcS.log。服务仍在启动时,登录提示符就可能已经出现。
cat /run/rcS.log
test -e /run/rcS.done && cat /run/rcS.status
启动文件
文件 |
启动阶段 |
|---|---|
|
可由 ROM 加载的 SPL |
|
OpenSBI 和 U-Boot |
|
Linux 硬件描述 |
|
Linux 内核 |
|
早期初始化、BusyBox 和应用 |
|
预链接无线 XIP 载荷;匹配模块位于 rootfs |
烧录命令见烧录和首次启动。