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读取启动项。

Intel平台Flash固件分区与启动阶段映射 Flash 地址空间(高→低) Descriptor(区域划分/权限) CSME / ME 区域 GbE 区域 BIOS 区域 FV_BB(Boot Block / SEC入口) FV_PEI(PEIM 模块) FV_DXE(DXE 驱动) FV_BDS / NVRAM(启动项) FV_RECOVERY(恢复镜像) 启动阶段控制权移交 SEC 复位向量→CAR临时RAM→定位FV_BB PEI 内存初始化→加载微码→发布HOB DXE 调度驱动→建立协议→PCI枚举 BDS 读启动项→策略选择→移交OS Loader Recovery 校验失败→从FV_RECOVERY恢复

二、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盘或网络加载恢复镜像,重新写入主固件区。

恢复镜像本身必须经过验证,否则恢复机制会成为攻击入口。工程上应确保FV_RECOVERY受Boot Guard或等效机制保护,且恢复介质来源可信。

六、阶段与分区对照速查

阶段执行环境主要来源分区关键输出
SECCAR(Cache-as-RAM)FV_BB临时栈、IBB验证结果
PEICAR → DDRFV_PEIHOB列表、微码生效
DXEDDRFV_DXE协议、PCI枚举、控制台
BDSDDRFV_BDS / NVRAM启动项选择、OS移交
Recovery最小DDRFV_RECOVERY主固件区重写

把这条链记成一句话:SEC建环境,PEI通内存并加载微码,DXE连设备,BDS选系统,Recovery兜底。每一阶段的输出都是下一阶段的输入,任一环节校验失败,信任链就会在对应位置断开,恢复机制随即介入。