1. BootROM 概述:系统启动的第一行代码
各位做嵌入式或固件开发的同行,咱们今天聊聊 BootROM。说实话,很多工程师干了几年,对 BootROM 的理解还停留在「芯片里有个只读程序」这个层面。我个人觉得,搞懂 BootROM 是理解整个启动流程的基石。
1.1 什么是 BootROM?
BootROM,全称 Boot Read-Only Memory,是固化在芯片内部的一块只读存储器里的程序。芯片一上电,CPU 复位后执行的第一条指令,就来自这里。
你想想看,这时候内存还没初始化,硬盘、Flash 都还不可访问,CPU 能跑什么?只能跑芯片内部固化的这段代码。这就是 BootROM。
核心特征:
- 固化在芯片内部 ROM 中,出厂后不可修改
- 芯片上电后最先执行
- 大小通常只有 4KB ~ 256KB
- 由芯片厂商提供,OEM 无法更改
我在项目中遇到过不少同事把 BootROM 和 BIOS 搞混。其实它们完全是两码事——BootROM 是芯片级的,BIOS/UEFI 是板级或系统级的。
1.2 BootROM 在系统启动中的角色
BootROM 的角色可以用一句话概括:它是整个启动链条的起点。没有它,后面的 BIOS、操作系统都无从谈起。
具体来说,BootROM 负责以下几件事:
- 初始化最基础的硬件——比如 CPU 本身、Cache、一部分内部寄存器
- 确定启动设备——从哪加载下一级代码?NAND Flash?eMMC?SPI NOR?还是 USB/网络?
- 加载并验证下一级引导程序——通常是 SPL(Secondary Program Loader)或 BIOS/UEFI 的初始部分
- 提供安全启动的根信任——BootROM 是不可篡改的,所以它天然适合作为信任根
避坑指南:我曾经在一个项目中,芯片的 BootROM 里默认的启动设备顺序是 SPI NOR → eMMC → UART。结果板子上 SPI NOR 没焊,BootROM 尝试 SPI NOR 失败后超时等待了 3 秒才跳到 eMMC。整个启动时间多了 3 秒,客户不接受。后来我们只能改板子设计,把 SPI NOR 的片选拉高骗过 BootROM。嗯,这种坑踩过一次就记住了。
BootROM 的执行流程大致如下:
1.3 BootROM 与 BIOS/UEFI 的关系
这个问题我经常被问到。说白了,BootROM 和 BIOS/UEFI 是不同层级的东西,但它们协同工作。
| 对比维度 | BootROM | BIOS / UEFI |
|---|---|---|
| 存储位置 | 芯片内部 ROM | 外部 SPI Flash / NOR Flash |
| 可修改性 | 出厂固化,不可改 | 可更新(BIOS Update / Capsule Update) |
| 提供方 | 芯片厂商(Intel/AMD/ARM SoC 厂商) | OEM / BIOS 厂商(AMI/Insyde/Phoenix) |
| 执行时机 | 上电即执行 | BootROM 加载后才执行 |
| 大小 | 4KB ~ 256KB | 8MB ~ 32MB(UEFI) |
| 主要任务 | 初始化最小硬件,加载下一级 | 初始化所有硬件,加载操作系统 |
拿 x86 平台举个例子:
- Intel 的 BootROM(也叫微码 + Initial Boot Block)固化在 PCH 或 CPU 内部
- 它初始化最小硬件后,从 SPI Flash 加载 BIOS/UEFI 的初始代码(SEC 阶段)
- 然后 BIOS/UEFI 才接管后续的 PEI、DXE、BDS 等阶段
在 ARM 嵌入式平台,情况类似:
- SoC 内部的 BootROM 从 eMMC/NAND 加载 SPL(Secondary Program Loader)
- SPL 再加载 U-Boot 或 UEFI 的完整固件
- 最终由 UEFI 或 U-Boot 加载操作系统
注意:有些芯片的 BootROM 支持多种启动模式,通过采样 GPIO 电平来决定。我见过一个案例,某 ARM 芯片的 BootROM 启动模式引脚被干扰,导致芯片反复从 USB 下载模式启动,系统死活起不来。排查了两天才发现是 PCB 走线过长,信号被耦合了。所以硬件设计时,BootROM 的启动模式引脚一定要加弱上拉或下拉。
1.4 为什么 BootROM 对日志分析很重要
咱们这门课叫《BootROM 启动日志分析与解读》,那 BootROM 的日志到底有什么用?
我个人经验是,BootROM 日志是系统启动失败的「第一现场」。因为:
- BootROM 是最早执行的代码,它的日志能反映最底层的硬件状态
- 如果 BootROM 阶段就失败了,后面的 BIOS/UEFI 根本跑不起来
- BootROM 日志通常通过硬件调试接口输出(如 JTAG、UART),不受操作系统影响
实用技巧:很多芯片的 BootROM 支持在特定 GPIO 电平下输出调试日志。比如某款 SoC,在 GPIO0 拉高时上电,BootROM 会通过 UART0 输出详细的启动日志。这个功能在量产时默认关闭,但开发阶段一定要打开。我曾经因为没开这个功能,花了一周才定位到一个内存初始化的问题——其实 BootROM 日志里第一行就告诉你了。
典型的 BootROM 日志片段长这样:
BootROM v1.2.3 (Build Apr 10 2024 14:30:00)
CPU: Cortex-A72 r1p2, Rev 2.0
PMIC: ready (voltage: 1.12V)
PLL: CPU PLL locked @ 1.8GHz
DDR: training started...
DDR: training completed (size: 4096MB, rate: 3200MT/s)
Boot device: eMMC (HS400, 200MHz)
Loading SPL from eMMC offset 0x200...
SPL loaded (size: 128KB, hash: 0xA3B2C1D0)
Jumping to SPL at 0x18000000
你看,每一行都包含了关键信息:芯片版本、电源状态、时钟、DDR 训练结果、启动设备、加载地址。这些信息在排查硬件问题时,比任何示波器抓波形都来得直接。
嗯,关于 BootROM 的概述就先聊到这儿。记住一句话:BootROM 是系统启动的根,读懂它的日志,你就掌握了系统启动的命脉。