C-bit
(enCrypted bit
),用于控制该表项指向的物理内存页是否需要加密。由于页表项的低12bit已经被用做传统的页表转换功能,因此C-bit
只能放到存放物理页地址的字段,并且其具体位置和硬件架构相关,需要通过CPUID获取得到。注意,C-bit
可以存在于PTE、PDE、PDPE甚至PML4E的表项中,因此C-bit
既可以控制1个具体的物理页是否加密,可以控制整个PDE、PDPE、PML4E表包含的物理页是否加密。C-bit
为bit 47。从硬件设计来看,AMD牺牲了至少1 bit物理地址位宽来支持内存页加密。C-bit
和PhysAddrReduction
介绍如下图所示(Volume 3 Appendix E.4.17):CbitPosition
和PhysAddrReduction
相关信息:CbitPosition
信息在页表项中定位C-bit
的位置,提取其内容并保存。PhysAddrReduction
,只对物理地址的宽度有影响,对Guest的GPA地址没有影响。假设查询得到PhysAddrReduction
为5,那么原来52bit的物理地址HPA
变为了52-5=47bit。对于GPA,其宽度只减少了1bit,即C-bit占用的那1bit。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上不同应用程序独立加密自己的内存,其设计并非支持机密虚拟化,因此SME-MK
与SME
是互斥的。使能SME-MK
时SME
需要关闭,下文介绍SEV时我们可以知道,SEV特性依赖SME的打开。因此可以理解为,SME-MK
可以实现多个应用内存的独立加密,应用于非虚拟化场景,SME可以使多个虚机的内存独立加密,应用在虚拟化场景,即SEV场景。CPUID Fn8000_001F[EAX]
,可以查询CPU是否支持SME,查询信息字段解释如下 :CPUID Fn8000_0023_EAX[MemHmk]
指令可以查询CPU是否支持SME-MK
,如果CPU支持 ,可以通过CPUID Fn8000_0023_EBX[MaxMemHmkEncrKeyID]
查询CPU支持的密钥数上限;通过写SYSCFG MSR
可以使能SME-MK
。CPUID的输出信息如下图所示,使能SME-MK
的SYSCFG MSR
位在上一节已介绍。Guest Owner
,将Hypervisor权限中的上述部分剥离出来,赋给了新角色Guest Owner。Hypervisor的CPU计算能力仍然被使用,但管理属性被削弱。SEV架构下,可以将Hypervisor的看成是提供计算虚拟化能力的虚机管理代理角色。CPUID 8000_001F[ECX]
查询得到,ASID作为密钥ID,其值也不能大于该上限。同时ASID在SEV使能,SEV-ES未使能的模式下,其取值还有1个下限,下限值通过CPUID 8000_001F[EDX]
查询得到。CPUID Fn8000_001F
查询硬件对SME、SEV的支持情况,SEV相关字段总结如下:NumEncryptedGuests
和MinSevNoEsAsid
字段的含义,它确定了使能SEV禁用SEV-ES的模式下,ASID的取值范围是[1, 15]。Platform Management API
)和虚机管理API(Guest Management API
),供Hypervisor调用,整个架构示意图如下: