1、BootROM概述:什么是BootROM、BootROM在SoC启动流程中的位置、BootROM与Bootloader的区别
1.1 什么是BootROM?
BootROM,说白了就是芯片内部的一块只读存储器。它出厂时就被固化好了一段代码。这段代码是芯片上电后,CPU执行的第一段程序。
我个人习惯把BootROM叫做「芯片的原始本能」。你想想看,芯片刚上电时,DDR还没初始化,Flash还没准备好,甚至连时钟都还没稳定。这时候CPU能跑什么?只能跑BootROM里的代码。
BootROM有几个关键特征:
- 只读性——出厂后不可更改。这是硬伤,也是优势。坏处是发现bug没法修,好处是绝对安全,不会被篡改。
- 芯片厂商提供——你拿到的每一颗SoC,里面都已经烧好了BootROM。这不是你写的,是芯片原厂写的。
- 极小且高效——通常只有几KB到几十KB。我见过最小的BootROM只有4KB,跑完基本初始化就跳走了。
核心理解:BootROM是芯片的「第一口气」。没有它,整个系统连呼吸都做不到。
我在项目中遇到过一件事:某次调试一块新板子,死活起不来。查了三天,最后发现是BootROM里的一段时序配置跟外部晶振不匹配。嗯,BootROM改不了,只能换晶振。从那以后,我选型时一定会先看BootROM的参考时钟要求。
1.2 BootROM在SoC启动流程中的位置
SoC的启动流程,其实是一条清晰的链条。BootROM就在这条链条的最前端。
典型的启动流程是这样的:
- 上电复位——电源稳定后,复位信号释放。
- CPU从复位向量取指——复位向量通常指向BootROM的起始地址。
- BootROM执行——做最基本的硬件初始化。
- 读取启动设备——从SPI Flash、NAND、SD卡等介质中加载下一级程序。
- 跳转到Bootloader——比如U-Boot、ATF等。
- Bootloader加载OS——最终启动Linux或RTOS。
为了让你更直观地理解,我画了一张流程图:
看到没?BootROM处在整个流程的「咽喉」位置。它后面的一切,都依赖于它正确执行。
我的经验:调试启动问题时,第一步永远是确认BootROM有没有跑完。怎么确认?看芯片的某个GPIO是否被拉高,或者串口有没有输出BootROM的打印信息。如果BootROM没跑完,后面全是白费功夫。
1.3 BootROM与Bootloader的区别
这个问题我经常被问到。很多人觉得BootROM和Bootloader差不多,都是做初始化的嘛。其实差别大了去了。
我整理了一张对比表,你看完就明白了:
| 对比维度 | BootROM | Bootloader |
|---|---|---|
| 存储位置 | 芯片内部ROM | 外部Flash(SPI、NAND、eMMC等) |
| 可修改性 | 不可修改(只读) | 可更新(OTA升级) |
| 大小 | 几KB ~ 几十KB | 几百KB ~ 几MB |
| 功能范围 | 最小硬件初始化 + 加载Bootloader | 完整硬件初始化 + 加载OS + 升级功能 |
| 开发者 | 芯片原厂 | 板级开发者 / 系统集成商 |
| 调试难度 | 极高(无法修改,只能换芯片) | 中等(可重刷、可加打印) |
说白了,BootROM是芯片出厂自带的「最小启动套件」。它只做一件事:把系统带到能运行Bootloader的程度。而Bootloader是你可以自由发挥的「启动管家」。
我曾经踩过一个坑:某款芯片的BootROM只支持从SPI Flash加载,不支持NAND。项目中期想换NAND,结果发现BootROM不支持,改不了。最后只能加一颗SPI Flash做中转。嗯,选型时一定要看清楚BootROM支持的启动介质列表。
1.4 为什么BootROM对OTA兼容性至关重要?
你可能会问:BootROM不是只读的吗?跟OTA有什么关系?
关系大了。BootROM决定了你的OTA方案能做多「激进」。举个例子:
- 如果BootROM支持从多个启动分区加载,你就可以做A/B分区OTA。
- 如果BootROM支持安全启动,你的OTA固件就必须签名。
- 如果BootROM不支持从某个介质启动,你的OTA就只能往它支持的介质里写。
注意:BootROM的启动介质优先级是写死的。比如它先看SPI Flash,再看SD卡。如果你OTA升级时把SPI Flash刷坏了,BootROM会尝试从SD卡启动——前提是BootROM支持这个fallback逻辑。不支持的话,板子就变砖了。
我在做一款IoT设备时,OTA升级过程中断电了。BootROM检测到主分区校验失败,自动回退到备份分区。这就是BootROM支持多分区启动的好处。如果BootROM没有这个能力,那块板子就得返厂了。
1.5 小结
这一章我们聊了BootROM是什么、它在启动流程中的位置、以及它跟Bootloader的区别。核心就三点:
- BootROM是芯片的「第一段代码」,只读、极小、由原厂提供。
- 它处在启动流程的最前端,负责把Bootloader加载起来。
- BootROM的能力边界,直接决定了你的OTA方案能做多大。