可以把 Linux 启动理解成一场接力赛:板子上电后,程序一个接一个跑起来,每一棒只负责自己的任务,跑完就把接力棒交给下一棒。
启动流程一览
Reset(上电/复位)
↓
BootROM(RK3576 芯片固化引导)
↓
前级 Loader / SPL(初始化 DDR)
↓
U-Boot(加载内核、准备启动参数)
↓
Kernel(Linux 内核启动)
↓
rootfs(挂载根文件系统)
↓
init / shell(进入用户空间,出现命令行)
每一棒在干什么?
| 阶段 | 像什么 | 它做什么 |
|---|---|---|
| Reset | 按下开机键 | 板子上电或复位,CPU 从固定位置开始执行代码 |
| BootROM | RK3576 芯片自带的“最小启动程序” | 出厂固化在 RK3576 芯片里,负责选择从 eMMC、SD 卡等设备加载下一段程序 |
| 前级 Loader | 先帮板子“醒过来”的小助手 | 通常叫 SPL 或 preloader,先初始化 DDR、串口等基础硬件,再把完整 U-Boot 加载到内存 |
| U-Boot | 板子的 BIOS + 启动管理器 | 初始化更多硬件,找到内核镜像和设备树,设置启动参数,然后启动内核 |
| Kernel | Linux 内核 | 初始化内存管理、驱动、文件系统,最后挂载根文件系统并启动第一个进程 |
| rootfs | 系统盘 / C 盘 | 提供 / 目录、命令、库、配置文件和应用,是用户空间的运行环境 |
| init / shell | 系统进入“可用状态” | 内核启动 init 或 systemd,再拉起 shell,就能看到命令行并输入命令 |
用一句话串起来
Reset 让板子醒来,BootROM 找到启动设备,前级 Loader 初始化 DDR 并加载 U-Boot,U-Boot 找到内核并启动它,Kernel 初始化驱动并挂载 rootfs,最后 init 拉起 shell,系统进入可操作状态。
容易混淆的点
- BootROM 不是 U-Boot:BootROM 是 RK3576 芯片里固化的,不能修改;U-Boot 是烧写在 eMMC 或 SD 卡上的引导程序。
- 前级 Loader 不是完整 U-Boot:它很小,主要任务是让 DDR 可用,然后加载完整 U-Boot。
- Kernel 启动不等于系统已经可用:内核起来后还要挂载 rootfs,启动 init,最后才会出现 shell。
- rootfs 不是内核的一部分:内核负责驱动和系统管理,rootfs 负责提供用户能用的命令、服务和应用。