硬件准备:Intel SGX 的 CPU 要求与 BIOS 配置

做 TEE 环境部署,第一步不是装系统,而是确认你的 CPU 到底行不行。我见过不少团队,软件栈搭好了,一跑发现 SGX 压根没启用——回头一查,CPU 不支持。嗯,这种返工最浪费时间。

这一章,咱们就把硬件底子打牢。说白了,就是三件事:选对 CPU、进 BIOS 开 SGX、验证它到底开了没。

支持 SGX 的 CPU 型号清单

Intel SGX 不是所有酷睿都有的。它从第六代 Skylake 开始引入,但早期只有部分高端型号才支持。我个人习惯直接查 ark.intel.com,但为了方便,我把常见可用的系列整理了一下。

代际 架构代号 支持 SGX 的系列 注意事项
6th Gen Skylake Core i5/i7 6xxx(部分) 仅限高端 SKU,i3 不支持
7th Gen Kaby Lake Core i5/i7 7xxx 移动端部分型号被砍掉 SGX
8th/9th Gen Coffee Lake Core i5/i7/i9 8xxx/9xxx 桌面端基本全覆盖
10th Gen Comet Lake / Ice Lake Core i5/i7/i9 10xxx Ice Lake 的 SGX 版本升级到 2.0
11th Gen Tiger Lake Core i5/i7/i9 11xxx 支持 SGX 2.0,EPC 容量更大
12th/13th Gen Alder Lake / Raptor Lake Core i5/i7/i9 12xxx/13xxx P-core + E-core 混合架构,SGX 兼容性需确认
Xeon 系列 Skylake-SP 起 Xeon E3/E5/E7(部分) 服务器端首选,EPC 容量大
避坑提醒: 我曾经遇到过一台 i7-8700 的机器,系统里怎么都找不到 SGX 选项。后来才发现,那批 OEM 主板的 BIOS 直接把 SGX 功能给屏蔽了。所以,光看 CPU 型号还不够——主板厂商也可能在 BIOS 层面做手脚。

BIOS 中开启 SGX 的步骤

确认 CPU 支持之后,下一步就是进 BIOS。不同厂商的 BIOS 界面长得不一样,但核心选项就那么几个。我一般按这个顺序找:

  1. 重启机器,按 Del / F2 / F10 进 BIOS(具体看开机画面提示)
  2. 找到 Advanced 或 Security 菜单——有些主板把它藏在 Overclocking 或 Chipset 下面
  3. 定位到 SGX 相关选项,常见名称有:
    • Intel SGX
    • SGX Enable
    • Software Guard Extensions
  4. 设置为 Enabled(部分 BIOS 提供 Auto / Disabled / Enabled 三档,选 Enabled)
  5. 保存并退出(F10 保存重启)
我的习惯: 如果 BIOS 里找不到 SGX 选项,先检查 BIOS 版本是不是太老。我有一台 Dell 工作站,出厂 BIOS 里根本没有 SGX 开关,升级到最新版后才出现。更新 BIOS 前记得备份当前配置。

有些 BIOS 还会多出一个叫 SGX PRMRR Size 或 EPC Size 的选项。这个控制分配给 SGX 的内存大小。默认值通常是 128MB 或 256MB。如果你要跑大 enclave,建议手动调到最大。

关键参数: EPC(Enclave Page Cache)是 SGX 的加密内存区域。EPC 越大,能同时运行的 enclave 就越多。服务器端的 Xeon 通常支持 512MB 甚至 1GB 的 EPC,消费级 CPU 一般只有 128MB-256MB。

检查 SGX 是否开启的方法

BIOS 设置完了,别急着往下走。先确认 SGX 真的在工作。我习惯用三种方法交叉验证:

方法一:通过 CPU 指令集检测

最简单的方式,用 cpuid 工具看 SGX 特性位。Linux 下直接跑:

# 安装 cpuid(如果没装)
sudo apt install cpuid

# 检查 SGX 支持
cpuid -1 | grep -i sgx

如果输出里有 SGX: Software Guard Extensions supported = true,说明 CPU 支持。但注意,这只能证明硬件支持,不代表 BIOS 已经开启了。

方法二:通过内核模块检测

Linux 内核从 4.12 开始原生支持 SGX。我一般用这个命令看驱动是否加载:

# 检查 SGX 驱动
ls /dev/sgx*

# 如果输出类似 /dev/sgx_enclave /dev/sgx_provision
# 说明 SGX 驱动已加载,BIOS 配置正确

如果 /dev/sgx* 不存在,可能是内核没编入 SGX 支持,也可能是 BIOS 没开。先确认内核版本:

uname -r
# 建议 5.11 以上,对 SGX 2.0 支持更好

方法三:通过 Intel SGX 软件包检测

Intel 官方提供了 sgx_enable 工具,可以一键检测并启用 SGX:

# 下载并运行 sgx_enable
wget https://download.01.org/intel-sgx/sgx-linux/2.18/distro/ubuntu20.04-server/sgx_enable
chmod +x sgx_enable
sudo ./sgx_enable

它会输出类似 sgx already enabled 或 sgx enabled successfully。如果提示 sgx not supported,那基本可以断定是硬件或 BIOS 的问题了。

避坑指南: 我曾经在一台 HP 工作站上遇到怪事——cpuid 显示 SGX 支持,/dev/sgx 也存在,但跑 enclave 就报错。折腾了半天,发现是 BIOS 里把 SGX 的 Flexible Launch Control 设成了 Disabled。这个选项必须开启,否则 enclave 无法正常启动。

SGX 硬件准备核心流程

下面这张图把整个流程串起来了。你照着走一遍,基本不会漏掉什么。

SGX 硬件准备核心流程 确认 CPU 型号 检查 BIOS 版本 进入 BIOS 开启 SGX 保存并重启 验证 SGX 是否开启 常见踩坑点 • OEM 主板屏蔽 SGX • BIOS 版本过旧 • Flexible Launch Control 未开 验证工具推荐 • cpuid • ls /dev/sgx* • sgx_enable 工具

常见问题与排查思路

硬件准备阶段,我遇到最多的问题就三个。这里直接列出来,省得你走弯路。

  • BIOS 里找不到 SGX 选项——先升级 BIOS 到最新版。如果还找不到,去 Intel 官网查 CPU 的 SKU 编号,确认它真的支持 SGX。有些 i5-8400 和 i5-8500 就差一个数字,SGX 支持情况完全不同。
  • SGX 开启后系统无法启动——可能是 EPC 大小设置不合理。试着把 PRMRR Size 调小一点,或者先设成 Auto。我遇到过一台机器,手动设 256MB 就黑屏,改成 Auto 反而正常了。
  • Linux 下 /dev/sgx 设备不存在——先确认内核版本,低于 5.11 的建议升级。另外检查内核启动参数,确保没有加 nosgx 或 sgx_disable=1 这类禁用参数。
一个小技巧: 如果你用的是云服务器或虚拟机,SGX 通常需要宿主机透传支持。AWS 的 Nitro Enclaves、Azure 的 DCsv3 系列都原生支持 SGX,但记得在创建实例时勾选「启用 SGX」的选项。我自己在 Azure 上踩过这个坑——默认是不开的。