4. Microchip MCU/MPU启动流程解析
Microchip 的产品线横跨 8 位 AVR、32 位 SAM/PIC32 以及基于 Arm Cortex-A 的 SAMA5 MPU,它们的启动流程并不相同。理解启动流程的意义在于:安全启动的信任根必须锚定在“不可被应用修改的第一段代码”上,而固件升级则必须知道“哪一级可以被替换、替换后由谁校验”。因此,本节按“复位→固化引导→二级引导→应用”这条主线,分别解析各系列的启动阶段划分与向量表机制。
一、启动阶段的通用分层模型
无论哪个系列,启动都可以抽象为四个阶段:上电复位(POR)与时钟建立、固化 Boot ROM / 复位向量执行、二级引导程序(Second-Stage Bootloader)、应用固件跳转。区别在于:AVR 与 SAM 的“固化引导”往往只是复位向量和少量出厂校准代码,而 SAMA5 的 Boot ROM 是一段功能完整的 ROM 代码,能直接读取外部存储介质并完成 DDR 初始化。
上电复位阶段,MCU 内部 POR 电路监测 VDD 上升沿,当电压越过阈值后释放内部复位,同时启动主时钟(如 AVR 的 8 MHz 内部 RC、SAM 的 48 MHz RC 或外部晶振)。此时 CPU 从固定的复位向量地址取指。这个地址是硬件决定的,不可通过软件更改,因此它天然成为信任根候选点。
二、AVR 系列:复位向量与 Boot Section
以 ATmega328P 为例,Flash 从 0x0000 开始存放向量表,复位向量位于 0x0000,跳转到初始化代码。AVR 通过熔丝位 BOOTSZ 划分出 Boot Section(如 2 KB/4 KB),并由 BOOTRST 熔丝决定复位后是进入应用区还是 Boot 区。若 BOOTRST 被编程,复位向量指向 Boot Section 起始地址,Bootloader 可在此通过 UART/SPI 接收新固件并写入应用区。AVR 没有硬件加密引擎,安全启动通常依赖 Boot Section 中的校验逻辑(如 CRC 或签名比对)与熔丝位锁定(LB2/LB1)防止读出。
三、SAM 系列:ARM Cortex-M 的向量表重定位
SAM D5x、SAME70 等基于 Cortex-M7 的器件,复位后从 0x00000000 或别名地址取初始 MSP 与复位向量。出厂 Boot ROM 位于系统存储区,负责检查启动模式(如从 QSPI Flash、SD 卡或内部 Flash 启动)。二级引导程序通常放在内部 Flash 起始处,通过 SCB->VTOR 寄存器把向量表重定位到应用区。安全启动的关键在于:Boot ROM 是否校验二级引导程序的签名,以及 VTOR 重定位后应用是否再次校验自身镜像。
四、PIC32 系列:启动代码与向量表偏移
PIC32MZ 等器件复位后从 Boot Flash(BFM)执行,出厂引导代码负责加载配置字并跳转到程序 Flash。向量表默认位于 0x9D000000 附近,可通过 OFF 配置位或链接脚本调整偏移。PIC32 的启动代码(crt0)在跳转 main 之前完成栈指针设置、数据段复制与 BSS 清零。安全启动方案通常把 Boot Flash 中的引导程序作为信任根,校验程序 Flash 中的二级引导与应用。
五、SAMA5 系列:多级 Boot ROM 与 DDR 初始化
SAMA5D2/D3 等 Cortex-A5 MPU 的启动链最长:上电后执行内部 Boot ROM,ROM 代码根据 BUREG 与启动介质配置,从 SD/eMMC/QSPI/NAND 读取 AT91Bootstrap(一级引导)到内部 SRAM;AT91Bootstrap 完成 DDR 初始化、时钟配置后,加载 U-Boot(二级引导)到 DDR;U-Boot 再加载 Linux 内核与设备树。安全启动在此链路上逐级校验:Boot ROM 校验 AT91Bootstrap 签名,AT91Bootstrap 校验 U-Boot,U-Boot 校验内核。任何一级校验失败即停止启动。
六、向量表与启动阶段划分的工程意义
向量表是启动流程的“路标”。Cortex-M 的向量表前两项是初始 MSP 和复位向量,后续是异常向量;Cortex-A 的向量表则包含复位、未定义指令、SWI、预取中止等入口。安全启动设计时,必须保证向量表本身不被篡改,否则攻击者可以把复位向量指向恶意代码。常见做法是把向量表放在受签名保护的镜像头部,或在启动时由 Bootloader 校验向量表所在页的哈希。
启动阶段划分直接决定固件升级的粒度。以 SAMA5 为例,AT91Bootstrap 通常不参与 OTA 升级,因为它承担 DDR 初始化且体积小、变更风险高;U-Boot 与内核、根文件系统则可通过 A/B 分区升级。升级后由 U-Boot 校验新镜像签名,校验通过才切换启动分区。对于 AVR 与 SAM,Boot Section 或 Boot ROM 同样保持只读,应用区通过 Bootloader 写入并校验。
七、启动流程观察与验证方法
实际调试时,可通过以下方式确认启动阶段:在 AVR 上读取 MCUSR 判断复位源,用熔丝位读取确认 BOOTRST 与 BOOTSZ;在 SAM 上读取 RSTC_SR 的复位源位,并通过调试器查看 VTOR 当前值;在 SAMA5 上通过串口打印 AT91Bootstrap 与 U-Boot 的版本信息,观察 DDR 初始化是否成功。若启动停在 Boot ROM 阶段,通常意味着启动介质选择错误或镜像签名校验失败。
下表给出各系列启动阶段与信任根的对照,便于在方案选型时快速定位可升级边界。
| 系列 | 复位后首段代码 | 二级引导 | 向量表位置 | 信任根 | 可升级边界 |
|---|---|---|---|---|---|
| AVR ATmega | 0x0000 复位向量 | Boot Section | Flash 0x0000 | Boot Section + 熔丝 | 应用区 |
| SAM D5x/E70 | Boot ROM | 内部 Flash 引导 | VTOR 可重定位 | Boot ROM | 应用区 + 二级引导 |
| PIC32MZ | Boot Flash | crt0 + 应用 | 程序 Flash 偏移 | Boot Flash | 程序 Flash 应用 |
| SAMA5D2/D3 | Boot ROM | AT91Bootstrap → U-Boot | DDR 中重定位 | Boot ROM | U-Boot/内核/根文件系统 |
把启动流程拆解到“哪一级由谁校验、哪一级可被替换”,安全启动与固件升级的方案就有了明确的落点:信任根必须落在不可修改的固化代码上,升级则只作用于信任根之后的、可被校验的层级。