Bootloader 是设备上电后先于操作系统运行的启动程序,负责完成关键硬件初始化、选择启动介质、加载内核或下一级启动阶段,并把启动参数交给操作系统。
核心问题
设备刚上电时,DRAM、时钟、存储控制器、电源域和外设通常还没有完全可用。操作系统内核不能凭空开始运行,它需要一个更早期的程序把硬件带到可启动状态。
Bootloader 解决的是“从芯片复位到操作系统内核接管之间如何过渡”的问题。
核心机制
嵌入式启动链通常是多阶段的:
- Boot ROM:固化在 SoC 内部,选择启动介质并加载早期启动代码。
- SPL / TPL 等早期阶段:初始化 DDR、时钟和存储等最小硬件集合。
- 主 Bootloader:常见如 U-Boot,负责环境变量、启动菜单、网络启动、镜像校验和内核加载。
- Kernel handoff:加载 Linux kernel、initramfs 和 设备树,传递命令行参数。
在安全设备中,Bootloader 还可能参与安全启动,验证下一级镜像签名,防止未授权固件运行。
工程用途
Bootloader 在 设备 BSP 中承担启动和维护入口:
- 板级 bring-up:最早看到串口日志、验证 DDR 和存储初始化。
- 镜像加载:从 eMMC、NAND、NOR、SD、USB、网络或 A/B 分区加载系统。
- 升级和恢复:支持 recovery、fastboot、TFTP、USB 烧录或 OTA 回滚。
- 启动参数管理:传递 rootfs 路径、console、分区、内核参数和 DTB 地址。
- 安全启动:验证 boot、kernel、dtb、rootfs 或固件签名。
边界与常见坑
- Bootloader 不等于 BIOS:它们都参与启动,但嵌入式 bootloader 更贴近具体 SoC 和板级硬件。
- Bootloader 能启动不代表内核配置正确:内核驱动、设备树和 rootfs 仍可能失败。
- 环境变量会造成版本漂移:量产设备要明确 bootargs、分区表和镜像路径来源。
- DDR 初始化错误可能表现为随机崩溃:不是所有 boot 问题都会稳定复现。
- 安全启动链不能只验一段:如果只验证 bootloader,不验证 kernel、dtb 或 rootfs,仍可能被替换后续镜像。