Intel EPT技术

Jun 27, 2023


当一个逻辑CPU处于Non-root Mode下运行客户机代码时,使用的地址是客户机虚拟地址(GVA),而访问这个虚拟地址时,同样会发生地址的转换,这里的转换还没有涉及到VMM层,和正常的系统一样,这里依然是采用CR3作为基址,利用客户机(Guest OS)页表进行地址转换,虽然已经转换成物理地址,但是由于是客户机物理地址(GPA),不等同于宿主机的物理地址(HPA),所以并不能直接访问,需要借助于第二次的转换,也就是EPT的转换。

假设已经获取到了客户机的物理地址,下面分析下如何利用一个客户机的物理地址,通过EPT进行寻址。

注意不管是32位客户机还是64位客户机,这里统一按照64位物理地址来寻址。EPT页表是4级页表,页表的大小仍然是一个页即4KB,但是一个表项是8个字节,所以一张表只能容纳512个表项,需要9位来定位具体的表项。客户机的物理地址使用低48位来完成这一工作。如下图所示,一个48位的客户机物理地址被分为5部分,前4部分按9位划分,最后12位作为页内偏移。当处于非根模式下的CPU使用客户机操作一个客户机虚拟地址时,首先使用客户机页表进行地址转换,得到客户机物理地址(GPA),然后CPU根据此物理地址查询EPT,在VMCS结构中有一个EPTP的指针,其中的12-51位指向EPT页表的一级目录即PML4 Table.这样根据客户机物理地址的首个9位就可以定位一个PML4 entry,一个PML4 entry理论上可以控制512GB的区域。 4级页表

  1. 根据PML4 entry的12-51位记录下一级页表的地址。
  2. 使用对应的地址位数定位下一级的页表EPT Page-Directory-Pointer-Table的基址,根据客户物理地址的30-38位定位此页表中的一个表项EPT Page-Directory-Pointer-Table entry。注意这里如果该表项的第7位为1,该表项指向一个1G字节的page.第7位为0,则指向下一级页表。
  3. 然后根据表项中的12-51位,继续往下定位到第三级页表EPT Page-Directory-Table的基址,在根据客户物理地址的21-29位来定位到一个EPT Page-Directory-Table Entry。如果此Entry的第7位为1,则表示该Entry指向一个2M的page,第7位为0就指向下一级页表。
  4. 根据entry的12-51位定位第四级页表EPT Page-Table基址 ,然后根据客户物理地址的12-20位定位一个Page Table。 PTE中的12-51位指向一个4K物理页面,最后根据客户物理地址的最低12位作为偏移,定位到具体的物理地址。

接下来我们重点看下EPT的每一级表的Entry格式,PML4 entry的格式如下:
PML4E 众所周知,PML4 entry的12-51位记录下一级页表的地址,而这40位肯定是用不完的,根据CPU的架构,采取不同的位数,具体如下:

在Intel中使用MAXPHYADDR来表示最大的物理地址,我们可以通过CPUID的指令来获得处理支持的最大物理地址,然而这已经不在此次的讨论范围之内,我们需要知道的只是: 当MAXPHYADDR 为36位,在Intel平台的桌面处理器上普遍实现了36位的最高物理地址值,也就是我们普通的个人计算机,可寻址64G空间; 当MAXPHYADDR 为40位,在Inter的服务器产品和AMD 的平台上普遍实现40位的最高物理地址,可寻址达1TB; 当MAXPHYADDR为52位,这是x64体系结构描述最高实现值,目前尚未有处理器实现。

而对下级表的物理地址的存储4K页面寻址遵循如下规则: 1). 当MAXPHYADDR为52位时,上一级table entry的12-51位提供下一级table物理基地址的高40位,低12位补零,达到基地址在4K边界对齐; 2). 当MAXPHYADDR为40位时,上一级table entry的12-39位提供下一级table物理基地址的高28位,此时40-51是保留位,必须置0,低12位补零,达到基地址在4K边界对齐; 3). 当MAXPHYADDR为36位时,上一级table entry的12-35位提供下一级table物理基地址的高24位,此时36-51是保留位,必须置0,低12位补零,达到基地址在4K边界对齐。

而MAXPHYADDR为36位正是普通32位机的PAE模式。

在上述的第二个步骤中提到了EPT Page-Directory-Pointer-Table entry,当entry中的第七位为1时,该表项指向一个1G字节的page,entry的格式如下,
指向1GB的PDPTE

而第七位为0时,指向下一级的Page Directly。
指向PD的PDPTE

在第三步中提到的EPT Page-Directory-Table Entry,其第七位为1时,该表项指向一个2M字节的page,entry的格式如下,
指向2MB的PDE

而第七位为0时,指向下一级的Page Table。
指向PT的PDE

最后,我们来看下匹配4KB的PTE的格式,
PTE

至此,Intel SDM手册中有关EPT的原理就介绍到这。