EPT支持1G、2M和4K三种页面,VMX架构实现最高4级EPT页表结构,每个EPT页表大小为4K,每个EPT页表项为64位宽。使用1G页面时,GPA转换只需要两级EPT页表;使用2M页面时,GPA转换只需要三级EPT页表;使用4K页面时,GPA转换需要四级EPT页表。具体的页表结构请参考INTEL手册。下面以4K页面转换流程图介绍GPA地址转换位HPA地址的流程。
EPT初始化EPT初始化主要涉及设置虚拟机的VMCS相关字段和构建EPT映射表。
VMCS设置主要包括processor-based VM-execution control(0x00004002)、secondary processor-based VM-execution control(0x0000401e)和EPTP(0x0000201a)字段。
(1)设置processor-based VM-execution control 字段相关位域 ,包括CR3-load exiting、CR3-store exiting和active secondary controls位。其中31位的active secondary controls位使能secondary processor-based VM-execution control字段有效,该字段提供一些扩展功能的控制,包括使能EPT、执行WBINVD指令产生VM-exit控制等能力。需要设置的相关位信息如下图:
(2)设置secondary processor-based VM-execution control扩展控制字段的enable EPT和WBINVD exiting位,使其使能EPT和BINVD指令产生VM-exit。需要设置的相关位信息如下图红色标识部分:
(3)设置扩展页表指针EPTP(Extended Page Table Pointer)字段,字段相关位域信息如下图:
(4)设置页故障屏蔽码(0x00004006)为0和页故障匹配码(0x00004008)为0xffffffff,使其虚拟机的所有#PF异常都不产生VM-exit。
vmcs关于EPT的初始化代码如下图:
,