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 负责以下几件事:

  1. 初始化最基础的硬件——比如 CPU 本身、Cache、一部分内部寄存器
  2. 确定启动设备——从哪加载下一级代码?NAND Flash?eMMC?SPI NOR?还是 USB/网络?
  3. 加载并验证下一级引导程序——通常是 SPL(Secondary Program Loader)或 BIOS/UEFI 的初始部分
  4. 提供安全启动的根信任——BootROM 是不可篡改的,所以它天然适合作为信任根

避坑指南:我曾经在一个项目中,芯片的 BootROM 里默认的启动设备顺序是 SPI NOR → eMMC → UART。结果板子上 SPI NOR 没焊,BootROM 尝试 SPI NOR 失败后超时等待了 3 秒才跳到 eMMC。整个启动时间多了 3 秒,客户不接受。后来我们只能改板子设计,把 SPI NOR 的片选拉高骗过 BootROM。嗯,这种坑踩过一次就记住了。

BootROM 的执行流程大致如下:

BootROM 启动流程 芯片上电 / 复位 CPU 从 BootROM 地址取指执行 初始化最小硬件(CPU/Cache/寄存器) 检测启动设备(按优先级轮询) 加载并验证下一级引导程序 关键特点 • 代码不可修改 • 执行时间极短(毫秒级) • 无内存依赖 • 是安全信任根

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 日志是系统启动失败的「第一现场」。因为:

  1. BootROM 是最早执行的代码,它的日志能反映最底层的硬件状态
  2. 如果 BootROM 阶段就失败了,后面的 BIOS/UEFI 根本跑不起来
  3. 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 是系统启动的根,读懂它的日志,你就掌握了系统启动的命脉。