RK3576 Linux 启动链路:BootROM、preloader、U-Boot、Kernel 全解析
本文把 RK3576 代入 Linux 启动流程,按 BootROM、preloader、U-Boot、Kernel 和 rootfs 五个阶段说明控制权如何转移,并整理常见故障的定位方法。
1. 启动链路总览
上电/复位
↓
BootROM(芯片固化代码)
↓
preloader / SPL(初始化 DDR 等基础硬件)
↓
U-Boot(加载内核并准备启动参数)
↓
Linux Kernel(初始化内核子系统)
↓
rootfs(启动 init/systemd 和用户空间)
trust 组件是 RK 平台安全启动架构的重要组成部分,会贯穿相关启动阶段。固件打包方式可能把多个组件组合在一起,但调试时仍可以按职责划分。
2. BootROM:一级引导
BootROM 固化在芯片内部,用户无法修改。RK3576 上电或复位后首先运行 BootROM。
它主要负责:
- 读取 SARADC_IN0_BOOT,根据 ADC 值选择启动顺序;
- 初始化片内 SRAM 和基础外设;
- 按选定顺序访问启动设备;
- 将 preloader 下载到片内 SRAM;
- 把控制权交给 preloader。
BootROM 通常不会输出用户可见日志,因此早期无串口打印不等于没有执行。
3. preloader / SPL:二级引导
preloader 也称 SPL(Second Program Loader),负责把系统从片内 SRAM 运行环境推进到可以运行完整 U-Boot 的状态。
主要工作:
从这个阶段开始,通常可以在串口看到启动打印,后续程序主要加载到 DDR 中运行。
4. U-Boot:三级引导
U-Boot 的目标是准备 Linux 并把控制权交给内核。
主要工作包括:
- 初始化串口并输出日志;
- 从 eMMC、SD 等设备读取环境变量;
- 获取 Kernel、设备树和 rootfs 的位置;
- 设置 Linux 启动参数;
- 准备硬件并把内核加载到外部 RAM;
- 跳转执行内核。
进入 U-Boot 后,重点检查启动介质是否识别、环境变量是否正确、内核和设备树是否在预期位置,以及 bootargs 是否指向正确的 rootfs。
5. Linux Kernel 阶段
Kernel 阶段完成平台相关初始化,并为用户空间准备运行环境:
- 初始化串口并输出内核日志;
- 初始化内存管理和各个内核子系统;
- 检测内存大小和占用情况;
- 创建页表,映射物理内存和 I/O 空间;
- 加载编译进内核的驱动;
- 创建第一个用户空间进程,通常是 init 或 systemd。
看到 Kernel banner 只说明内核已经运行,不代表 rootfs 已经挂载成功。
6. rootfs:根文件系统
rootfs 是内核启动时挂载的第一个文件系统,提供:
- 根目录 /;
- init 或 systemd;
- Shell、命令和共享库;
- 用户空间服务、配置文件和应用程序。
如果内核日志正常,却停在挂载 rootfs 附近,应检查存储驱动、分区、文件系统类型、root 设备参数以及文件系统内容。
7. 按现象定位问题
| 上电后完全无输出 | 电源、复位、启动脚、DDR、启动介质和串口 |
| BootROM 后无法继续 | preloader 是否存在、启动介质是否可读 |
| preloader 阶段 DDR 初始化失败 | DDR 焊接、供电、训练参数和板级信号 |
| U-Boot 找不到内核 | 启动介质、分区、环境变量、文件名和地址 |
| Kernel 无法挂载 rootfs | 存储驱动、root 参数、文件系统和分区 |
| 用户空间服务失败 | rootfs 内容、init/systemd 配置和应用依赖 |
在没有定制 U-Boot 的情况下,BootROM 和默认引导代码通常经过充分验证。启动早期完全无日志时,应优先排查 DDR、电源时序、eMMC 接触等硬件因素。
8. 总结
RK3576 启动链路可以概括为:BootROM 选择并加载 preloader;preloader 初始化 DDR 并加载 U-Boot;U-Boot 准备参数并启动 Kernel;Kernel 挂载 rootfs 后进入用户空间。
排查时先根据最后一条日志确定阶段,再检查该阶段负责的软硬件,避免跨阶段盲目修改。


