启动流程解剖:从CPU上电到内核启动的完整链路
做嵌入式这么多年,我见过不少工程师把「启动」想得太简单。以为上电就该跑Linux,中间那几步全交给厂商的BootROM就完事了。结果呢?板子起不来,连个打印都没有,只能干瞪眼。
其实,从CPU上电到内核跑起来,中间是一条完整的链路。每一环都有它的设计逻辑。今天我就把这根链条从头到尾拆开给你看。
1. 上电瞬间:CPU在干什么?
按下电源键那一刻,CPU的复位引脚被拉高。它做的第一件事,不是加载操作系统,而是执行一段固化在芯片内部的代码——BootROM。
BootROM是芯片出厂就写死的,你改不了。它的任务很简单:
- 初始化最基本的硬件(时钟、SRAM、看门狗)
- 检测启动引脚的电平状态
- 根据引脚配置,决定从哪个介质读取下一级代码
嗯,这里要注意:BootROM通常只有几十KB,它没有能力直接加载庞大的内核。它只负责把第二级Bootloader(比如SPL、U-Boot SPL)搬进内部SRAM。
关键认知:BootROM不是Bootloader。它是芯片厂商写死的「启动引导器」,你无法修改它。真正的Bootloader是从SPL或U-Boot开始的。
2. 启动介质与启动模式
CPU怎么知道从哪儿读代码?靠的是启动模式选择引脚。芯片上电时,BootROM会采样这些引脚的电平,然后决定走哪条路。
常见的启动介质有四种:
| 介质 | 接口类型 | 读取速度 | 典型容量 | 是否支持XIP |
|---|---|---|---|---|
| NOR Flash | Parallel/SPI | 中等 | 1MB~64MB | ✅ 支持 |
| NAND Flash | Parallel | 较快(连续读) | 128MB~8GB | ❌ 不支持 |
| eMMC | MMC/SDIO | 快 | 4GB~128GB | ❌ 不支持 |
| SD卡 | SDIO | 中等 | 1GB~32GB | ❌ 不支持 |
这里有个概念叫XIP(eXecute In Place),说白了就是「原地执行」。NOR Flash支持XIP,CPU可以直接在Flash上跑代码,不用先拷到RAM里。NAND和eMMC不行,必须先把代码读到RAM才能执行。
我的经验:NOR Flash虽然贵,但启动速度极快。我在一个工业控制项目里用过NOR+SPL的方案,从上电到U-Boot打印,只用了不到200ms。如果换成NAND,光搬运代码就要多花300ms。
3. 启动介质选择策略
选哪种介质,不是拍脑袋决定的。我一般从三个维度来权衡:
- 启动速度要求——汽车电子、工业控制器要求毫秒级启动,NOR Flash是首选
- 成本与容量——消费电子量大,eMMC性价比高,NAND次之
- 可靠性要求——NAND有坏块问题,需要ECC和坏块管理;NOR几乎没有坏块
我个人习惯画一张决策树,帮你快速定位:
4. 完整启动链路:一步一步来
现在我们把所有环节串起来。从CPU上电到内核启动,一共经历五个阶段:
- Stage 0 — BootROM:芯片内部固件,初始化时钟、SRAM,检测启动引脚,加载SPL
- Stage 1 — SPL(Secondary Program Loader):初始化DDR控制器,把U-Boot从Flash搬到DDR
- Stage 2 — U-Boot:完整的Bootloader,初始化外设,加载设备树和内核镜像
- Stage 3 — 内核解压与初始化:内核自解压,初始化子系统,挂载根文件系统
- Stage 4 — 用户空间启动:init进程启动,系统进入用户态
我曾经踩过一个坑:在某款i.MX6平台上,SPL阶段DDR初始化时序配错了,导致U-Boot加载到DDR后随机崩溃。查了两天才发现是DDR控制器配置里的ODT(片上端接)参数没对齐。从那以后,我每次调DDR都会先跑一遍memtester。
5. 启动模式对比:谁快?谁稳?
不同启动模式,性能差异很大。我整理了一张对比表,方便你选型时参考:
| 启动模式 | 典型启动时间(到U-Boot) | 可靠性 | 典型应用场景 |
|---|---|---|---|
| NOR Flash(XIP) | 100~300ms | ⭐⭐⭐⭐⭐ | 工业控制、汽车ECU |
| NAND Flash | 400~800ms | ⭐⭐⭐(需ECC) | 路由器、IoT网关 |
| eMMC | 500~1200ms | ⭐⭐⭐⭐ | 消费电子、Linux平板 |
| SD卡 | 800~2000ms | ⭐⭐(接触不良风险) | 开发板、原型验证 |
你想想看,如果产品要求上电后1秒内显示画面,NOR Flash几乎是唯一选择。但如果产品是智能音箱,用户不介意等两三秒,那eMMC就够用了。
6. 避坑指南:启动介质选择的常见误区
- 误区一:NAND比NOR快——连续读确实快,但NAND需要坏块扫描和ECC校验,这部分时间容易被忽略
- 误区二:eMMC一定比SD卡可靠——eMMC的焊接质量很关键,虚焊会导致间歇性启动失败,我遇到过三次
- 误区三:BootROM可以随便改——改不了,别想了。但你可以通过修改启动引脚配置来切换介质
我的建议:量产产品优先选eMMC或NOR。NAND虽然便宜,但坏块管理和ECC实现起来工作量不小。除非你团队有存储专家,否则别在NAND上浪费调试时间。