启动流程解剖:从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. 启动介质选择策略

选哪种介质,不是拍脑袋决定的。我一般从三个维度来权衡:

  1. 启动速度要求——汽车电子、工业控制器要求毫秒级启动,NOR Flash是首选
  2. 成本与容量——消费电子量大,eMMC性价比高,NAND次之
  3. 可靠性要求——NAND有坏块问题,需要ECC和坏块管理;NOR几乎没有坏块

我个人习惯画一张决策树,帮你快速定位:

启动介质选择决策树 启动介质选型 启动速度要求 < 500ms? 是 否 NOR Flash 容量 > 2GB? 否 是 NAND Flash eMMC / SD卡 说明 • NOR:启动最快,适合工业/汽车,但容量小、成本高 • NAND:容量适中,需坏块管理,适合中等规模嵌入式 • eMMC:容量大、集成度高,适合消费电子和Linux系统

4. 完整启动链路:一步一步来

现在我们把所有环节串起来。从CPU上电到内核启动,一共经历五个阶段:

  1. Stage 0 — BootROM:芯片内部固件,初始化时钟、SRAM,检测启动引脚,加载SPL
  2. Stage 1 — SPL(Secondary Program Loader):初始化DDR控制器,把U-Boot从Flash搬到DDR
  3. Stage 2 — U-Boot:完整的Bootloader,初始化外设,加载设备树和内核镜像
  4. Stage 3 — 内核解压与初始化:内核自解压,初始化子系统,挂载根文件系统
  5. 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上浪费调试时间。