3. 固件启动流程与信任根

在 AMD EPYC 平台上,服务器上电后并不是 CPU 直接跳到 BIOS 代码开始执行。真正最先“醒来”的,是集成在 SoC 内部的一颗独立安全处理器——PSP(Platform Security Processor,平台安全处理器)。它基于 ARM Cortex-A5 内核,拥有独立的 ROM、SRAM 和密钥存储区,构成了整条启动链的硬件信任根(Hardware Root of Trust, HRoT)。理解 EPYC 的固件启动流程,本质上就是理解“信任如何从一颗不可篡改的 ROM 逐级传递到操作系统”的过程。

一、信任根:为什么是 PSP 而不是 BIOS

传统 x86 平台的信任根通常落在 BIOS Flash 上,但 Flash 是可被物理替换或刷写的,因此“BIOS 是否可信”本身无法自证。EPYC 的设计把信任根下沉到芯片内部:PSP 的片上 ROM(Boot ROM)在流片时固化,无法被外部修改,其中包含第一段启动代码和 AMD 公钥。上电复位后,x86 核心仍处于复位状态,只有 PSP 开始执行,它负责验证并加载后续所有固件。这就是“PSP 先启动、x86 后启动”的基本秩序。

二、从 PSP 到 UEFI 的完整启动链

EPYC 的启动链可以划分为若干可验证的阶段,每一阶段在把控制权交给下一阶段之前,都要先验证对方的签名。下图展示了从加电到操作系统加载的信任传递路径,以及各阶段对应的固件对象与验证动作。

AMD EPYC 固件启动链与信任传递 ① PSP Boot ROM 片上固化,不可修改 内置 AMD 公钥 (ROTPK) 硬件信任根 HRoT ② PSP 固件目录 SPI Flash 中的 PSP 目录 RSA-4096 签名验证 加载 SMU / 微码 / MP2 ③ 释放 x86 复位 PSP 验证通过后 x86 核心退出复位 跳转至 UEFI SEC 阶段 ④ UEFI SEC / PEI 临时 RAM 初始化 验证 PEI 卷签名 建立最小执行环境 ⑤ UEFI DXE 驱动调度与分发 验证 DXE 驱动签名 PCIe / 内存 / 存储枚举 ⑥ BDS → OS Loader 启动项选择 Secure Boot 校验 移交操作系统 各阶段验证动作与失败后果 PSP ROM → PSP 目录:用 ROTPK 验证目录签名,失败则 PSP 停止,x86 永不释放复位(无显示、无日志)。 PSP → x86:验证 SMU/微码镜像,失败则平台无法完成上电自检。 UEFI SEC/PEI → DXE:验证固件卷 FV 签名,失败则进入恢复模式或挂起。 BDS → OS:Secure Boot 用 db/KEK/PK 校验引导器,失败则拒绝加载并记录事件。 信任层级 硬件固化 PSP 固件 x86 释放 UEFI 阶段

三、安全启动链的关键机制

整条链的核心是逐级签名验证。PSP Boot ROM 中固化的 AMD 根公钥(ROTPK)是信任的起点,它验证 PSP 目录的签名;PSP 目录中又包含用于验证下一级固件的公钥哈希。这种“上一级验证下一级”的链式结构,使得任何一级被篡改都会导致验证失败,从而阻断启动。

在 UEFI 阶段,验证机制由 Secure Boot 接管。它使用 PK(Platform Key)、KEK(Key Exchange Key)、db(Authorized Signature Database)和 dbx(Forbidden Signature Database)四级密钥体系。固件在加载每个驱动或引导器前,会检查其签名是否在 db 中、是否不在 dbx 中。EPYC 平台还支持 AMD Secure Processor 的固件 TPM(fTPM),用于度量启动过程并将结果记录到 PCR 寄存器,供操作系统远程证明使用。

四、实操观察:如何确认启动链状态

在 Linux 下,可以通过以下方式观察信任链是否完整建立。首先检查 PSP 是否成功加载固件:

# 查看 PSP 相关内核日志
dmesg | grep -i "psp\|sev\|ccp"
# 典型输出:
# ccp 0000:00:08.0: PSP enabled, firmware version: 0x0b00210a
# ccp 0000:00:08.0: SEV firmware version: 1.55

其次确认 Secure Boot 状态:

# 检查 Secure Boot 是否启用
mokutil --sb-state
# 输出:SecureBoot enabled

# 查看固件度量日志(需 root)
cat /sys/kernel/security/tpm0/binary_bios_measurements | xxd | head

如果 dmesg 中看不到 PSP 固件版本,通常意味着 PSP 固件加载失败或平台未正确配置。此时应检查 SPI Flash 中的 PSP 目录是否完整、签名是否与 ROTPK 匹配。若 Secure Boot 显示 disabled,则需在 BIOS 中确认是否已导入 PK/KEK/db 证书。

注意:修改 PSP 目录或 UEFI 固件卷后,必须使用 AMD 提供的签名工具重新签名,否则 PSP 会拒绝加载,表现为“上电无显示、无串口输出”。这是硬件信任根最直接的体现——没有正确签名,平台根本无法启动到可调试阶段。

五、信任根验证的边界与常见误区

需要明确的是,PSP 信任根验证的是固件来源的完整性与真实性,而不是固件内容的功能正确性。一个签名合法但存在缺陷的固件仍会被加载。此外,ROTPK 一旦熔断到芯片中便不可更改,因此密钥管理必须在生产阶段完成。对于运维人员而言,理解这条链的意义在于:当服务器出现“无法上电自检”或“Secure Boot 拒绝加载”时,能够快速定位是 PSP 阶段、UEFI 阶段还是 OS 阶段的验证失败,而不是盲目更换硬件。

总结来看,EPYC 的启动流程是一条从 PSP Boot ROM 出发、经 PSP 固件目录、UEFI SEC/PEI、DXE,最终到达操作系统引导器的信任链。每一级都通过密码学签名验证下一级,任何一环断裂都会导致启动中止。掌握这条链的结构与验证点,是进行固件调试、安全加固和故障排查的基础。