AMD SEV基本原理
背景
- 在云生成环境中,存在两个角色分别是Platform ower和Guest owner,Platform owner通常指云厂商,比如公有云厂商阿里、腾讯、华为等,或者企业云厂商VMware、SmartX、H3C等;Guest owner通常就是希望在云厂商提供的iass服务中运行自己业务的客户。
- 传统模式下,Guest owner完全信任Platform owner提供的基础设置,将安全防护的工作交给Hypervisor来做,假如Hypervisor被恶意程序通过管理程序或其他软件中漏洞攻破,那么它就可以任意访问客户机内存。对于某些数据敏感的Guest owner,这样的安全事故是无法接受的,因此希望其业务数据受到保护。
- 另一方面,Platform owner即云长商当然也想实现客户业务数据保护的需求,但提供的解决方案除了要解决用户的问题,也要考虑方案对传统计算资源管理方式的兼容,方案能够高效管理计算资源,可以做灵活的分配和释放。
- SEV特性就是AMD为满足上述需求提供的硬件机密计算解决方案,它不仅支持机密虚机功能(对客户虚机数据加密),也很好地支持了传统虚机的生命周期(启动、热迁移、快照等),能够让虚机的管理方式平滑切换。
SME
- SME(Secure Memory Encryption)是AMD内存加密硬件特性,AMD通过在SOC的内存控制器上增加加解密引擎,实现对内存数据的加解密。
Arch
- SME内存加密原理如下图所示:
- AMD在其SOC的内存控制器中增加支持AES加解密的硬件引擎,当CPU向内存写数据时,数据首先被内存控制器中的加密引擎加密,然后写入到内存;当CPU从内存读数据时控制器做对应的解密处理并返回给CPU。
C-bit
- 为支持对内存的加密并且兼容原有的MMU硬件设计,AMD将页表项中原来存放物理页地址的字段划分出1个bit作为
C-bit
(enCrypted bit
),用于控制该表项指向的物理内存页是否需要加密。由于页表项的低12bit已经被用做传统的页表转换功能,因此C-bit
只能放到存放物理页地址的字段,并且其具体位置和硬件架构相关,需要通过CPUID获取得到。注意,C-bit
可以存在于PTE、PDE、PDPE甚至PML4E的表项中,因此C-bit
既可以控制1个具体的物理页是否加密,可以控制整个PDE、PDPE、PML4E表包含的物理页是否加密。 - 下图是AMD手册中1个4K页表项的字段描述,对于Hygon C86 7380 32-core Processor,其
C-bit
为bit 47。从硬件设计来看,AMD牺牲了至少1 bit物理地址位宽来支持内存页加密。
- AMD利用页表项中的物理地址来支持内存加密,势必会导致物理地址位宽减少,AMD没有给出计算减少物理地址位宽的方式,而是提供了CPUID指令让用户查询, AMD手册中查询
C-bit
和PhysAddrReduction
介绍如下图所示(Volume 3 Appendix E.4.17):
- 当EAX输入为0x8000001F,执行CPUID指令后,EBX寄存器中存放了
CbitPosition
和PhysAddrReduction
相关信息:
- CbitPosition: C-bit在页表项中的位置,单位bit
- PhysAddrReduction:引入C-bit后页表项中物理地址减少的宽度,单位bit
- C-bit既能在CPU的非虚拟化(non-vitualized)模式打开,也可以在虚拟化模式且SEV特性使能的时候打开。在虚拟化模式下,使用NPT实现硬件辅助的内存虚拟化时,AMD CPU支持通过在Guest的页表项中设置C-bit来控制是否对GPA对应的物理页是否加密。Guest页表项的C-bit控制物理页是否加密原理示意图如下所示:
- AMD NPT在检测到C-bit使能后,会在页地址转换时增加额外逻辑处理C-bit,具体为:
- 提取NPT的输入 — Guest页表项内容(GPA),根据CPUID查询得到的
CbitPosition
信息在页表项中定位C-bit
的位置,提取其内容并保存。 - 将GPA作为硬件NPT页地址转换的输入,得到HPA
- 将C-bit内容和2中得到的HPA一道,作为页表项内容填入物理内存页表
- 注意,通过CPUID查询得到的
PhysAddrReduction
,只对物理地址的宽度有影响,对Guest的GPA地址没有影响。假设查询得到PhysAddrReduction
为5,那么原来52bit的物理地址HPA
变为了52-5=47bit。对于GPA,其宽度只减少了1bit,即C-bit占用的那1bit。
SME-MK
C-bit
的引入为系统软件提供了1个内存页加密的开关。在非虚拟化的应用场景下,为了让OS软件实现更细粒度的加密控制,AMD还设计了Multi-Key Secure Memory Encryption (SME-MK)
特性,该特性允许OS软件将加密内存使用的密钥导入到SOC的内存控制器中,然后在内存加密时通过选择密钥ID(EncrKeyID
)指定使用的密钥。SME-MK
可以通过CPUID Fn8000_0023_EAX[MemHmk]
来查询CPU是否支持,可以通过CPUID Fn8000_0023_EBX[MaxMemHmkEncrKeyID]
查询EncrKeyID
的最大值。SME-MK
特性可以支持OS上不同应用