4. Intel平台启动流程与固件分区
Intel平台从上电到操作系统接管,并不是“BIOS跑一段代码”这么简单,而是一条由硬件复位向量驱动、按阶段逐级移交控制权的固件执行链。理解这条链的关键,是先看清固件在Flash中的组织方式,再理解各阶段“谁在跑、跑在哪、把什么交给谁”。
一、固件分区:UEFI固件卷与Flash布局
现代Intel平台固件遵循UEFI PI(Platform Initialization)规范,Flash中不再是一整块连续镜像,而是由多个固件卷(Firmware Volume, FV)组成。每个FV是一个自描述容器,内部封装若干固件文件(FFS, Firmware File System),每个文件又由文件头和若干Section构成,Section可承载PEIM、DXE驱动、微码、ACPI表、Setup变量默认值等。
典型布局从Flash顶部(高地址)向下依次为:Descriptor区域(描述Flash区域划分与访问权限)、ME/CSME区域、GbE区域、BIOS区域。BIOS区域内再细分FV_BB(Boot Block,含SEC入口)、FV_PEI、FV_DXE、FV_BDS、FV_RECOVERY、NVRAM等。这种分区不是随意划分,而是与启动阶段一一对应:SEC从FV_BB取指,PEI从FV_PEI加载PEIM,DXE从FV_DXE调度驱动,BDS从NVRAM读取启动项。
二、SEC阶段:从复位向量到临时RAM
CPU上电复位后,从Flash映射的复位向量处取第一条指令,这就是SEC(Security)阶段的起点。此时内存控制器尚未初始化,DDR不可用,SEC只能依赖CPU内部Cache作为RAM使用,即CAR(Cache-As-RAM)。SEC的核心任务有三项:建立临时执行环境、验证并定位Boot Block、把控制权交给PEI Core。
在开启Boot Guard的平台,SEC还承担验证职责:CPU内ROM中的ACM(Authenticated Code Module)先校验IBB(Initial Boot Block)的签名,校验通过才允许执行。若校验失败,平台会进入恢复或关机路径。这一步是信任链的根,后续所有阶段的度量都以此为起点。
三、PEI阶段:内存初始化与微码加载
PEI(Pre-EFI Initialization)阶段以PEIM(PEI Module)为执行单元,按依赖关系分阶段调度。最关键的PEIM是内存初始化参考代码(MRC),它完成DDR训练、时序参数配置,使系统拥有真实可用的物理内存。内存可用后,PEI把已初始化的资源、内存布局、固件卷位置等信息封装成HOB(Hand-Off Block)列表,传递给DXE。
微码加载通常发生在PEI早期。CPU复位后运行的是处理器内固化的微码,可能存在勘误或性能缺陷。固件从FV中读取与当前CPU Family/Model/Stepping匹配的微码更新块,通过WRMSR写入IA32_BIOS_UPDT_TRIG MSR触发加载。示例判断逻辑如下:
; 伪代码:微码匹配与加载
读取 CPUID.01H → Family/Model/Stepping
遍历 FV 中 Microcode FFS 文件:
读取微码头 HeaderVersion、ProcessorSignature、Checksum
if (ProcessorSignature 匹配 CPUID 且 Checksum 校验通过):
写入 IA32_BIOS_UPDT_TRIG (0x79)
再次读取 CPUID.01H 确认 Microcode Revision 已更新
break
若未找到匹配微码:记录 HOB 状态,继续启动但标记告警
加载后应通过CPUID.01H的Microcode Revision字段确认版本号已变化,这是判断微码是否真正生效的直接依据,而不是仅看固件是否“执行了加载动作”。
四、DXE与BDS:驱动调度与启动选择
DXE(Driver Execution Environment)阶段拥有完整内存,按依赖顺序调度DXE驱动。驱动通过协议(Protocol)互相发现与调用,例如PCI枚举驱动发布PciRootBridgeIo协议,磁盘驱动发布BlockIo协议。DXE Dispatcher依据依赖表达式(如BEFORE、AFTER、DEPEX)决定加载顺序,避免驱动间死锁。
BDS(Boot Device Selection)阶段读取NVRAM中的启动项(BootOrder、Boot####),按策略选择启动设备,加载OS Loader并把控制权移交。BDS同时负责进入Setup界面、处理启动超时、执行恢复判断。若所有启动项失败,BDS会尝试网络启动或进入恢复流程。
五、固件恢复机制
固件恢复用于应对主固件区损坏或校验失败。触发条件通常包括:Boot Block校验失败、IBB签名验证失败、看门狗超时、用户强制进入恢复模式(如跳线或组合键)。恢复流程从FV_RECOVERY读取最小可用固件镜像,仅初始化必要硬件,从U盘或网络加载恢复镜像,重新写入主固件区。
六、阶段与分区对照速查
| 阶段 | 执行环境 | 主要来源分区 | 关键输出 |
|---|---|---|---|
| SEC | CAR(Cache-as-RAM) | FV_BB | 临时栈、IBB验证结果 |
| PEI | CAR → DDR | FV_PEI | HOB列表、微码生效 |
| DXE | DDR | FV_DXE | 协议、PCI枚举、控制台 |
| BDS | DDR | FV_BDS / NVRAM | 启动项选择、OS移交 |
| Recovery | 最小DDR | FV_RECOVERY | 主固件区重写 |
把这条链记成一句话:SEC建环境,PEI通内存并加载微码,DXE连设备,BDS选系统,Recovery兜底。每一阶段的输出都是下一阶段的输入,任一环节校验失败,信任链就会在对应位置断开,恢复机制随即介入。