云计算虚拟化技术与开发
上QQ阅读APP看书,第一时间看更新

2.2.1 Intel EPT

Intel EPT是Intel VT-x提供的内存虚拟化支持技术。EPT页表存在于VMM内核空间中,由VMM来维护。EPT页表的基地址是由VMCS“VM-Execution”控制域的Extended Page Table Pointer字段指定的,它包含了EPT页表的宿主机系统物理地址。EPT是一个多级页表,各级页表的表项格式相同,如图2-6所示。

图2-6 页表项格式

页表各项含义如下:

(1)ADDR:下一级页表的物理地址。如果已经是最后一级页表,就是GPA对应的物理地址。

(2)SP:超级页(Super Page)所指向的页是大小超过4KB的超级页,CPU在遇到SP=l时,就会停止继续往下查询。对于最后一级页表,这一位可以供软件使用。

(3)X:可执行,X=1表示该页是可执行的。

(4)R:可读,R=1表示该页是可读的。

(5)W:可写,W=1表示该页是可写的。

Intel EPT通过使用硬件支持内存虚拟化技术,使其能在原有的CR3页表地址映射的基础上,引入EPT页表来实现另一次映射。通过这个页表能够将客户机物理地址直接翻译成宿主机物理地址,这样,GVA→GPA→HPA两次地址转换都由CPU硬件自动完成,从而减少整个内存虚拟化所需的代价。其基本原理如图2-7所示。

图2-7 EPT原理图

这里假设客户机页表和EPT页表都是4级页表,CPU完成一次地址转换的基本过程如下:

CPU先查找客户机CR3指向的L4页表。由于客户机CR3给出的是GPA,因此CPU需要通过EPT页表来实现客户机CR3中的GPA→HPA的转换。CPU首先会查找硬件的EPT TLB,如果没有对应的转换,CPU会进一步查找EPT页表,如果还没有,CPU则抛出EPT Violation异常由VMM来处理。

获得L4页表地址后,CPU根据GVA和L4页表项的内容,来获取L3页表项的GPA。如果L4页表中GVA对应的表项显示为“缺页”,那么CPU产生Page Fault,直接交由客户机内核来处理。获得L3页表项的GPA后,CPU同样要通过查询EPT页表来实现L3的GPA到HPA的转换。

同样,CPU会依次查找L2、L1页表,最后获得GVA对应的GPA,然后通过查询EPT页表获得HPA。

从上面的过程可以看出,CPU需要5次查询EPT页表,每次查询都需要4次内存访问,因此最坏情况下总共需要20次内存访问。EPT硬件通过增大EPT TLB来尽量减少内存访问。

在GPA到HPA转换的过程中,由于缺页、写权限不足等原因也会导致客户机退出,产生EPT异常。对于EPT缺页异常,处理过程大致如下:

KVM(内核虚拟机)首先根据引起异常的GVA,映射到对应的HPA;然后为此虚拟地址分配新的物理页;最后KVM再更新EPT页表,建立起引起异常的GPA到HPA的映射。

EPT页表相对于影子页表,其实现方式大大简化,主要地址转换工作都由硬件自动完成,而且客户机内部的缺页异常也不会导致VM-Exit,因此客户机运行性能更好,开销更小。