Intel EPT是Intel VT-x提供的内存虚拟化支持技术。EPT页表存在于VMM内核空间中,由VMM来维护。EPT页表的基地址是由VMCS“VM-Execution”控制域的Extended Page Table Pointer字段指定的,它包含了EPT页表的宿主机系统物理地址。EPT是一个多级页表,各级页表的表项格式相同,如图3-7所示。
图3-7 页表项格式图
页表各项含义如下:
ADDR:下一级页表的物理地址。如果已经是最后一级页表,那么就是GPA对应的物理地址。
SP:超级页(Super Page)所指向的页是大小超过4KB的超级页,CPU在遇到SP=1时,就会停止继续往下查询。对于最后一级页表,这一位可以供软件使用。
X:可执行,X=1表示该页是可执行的。
R:可读,R=1表示该页是可读的。
W:可写,W=1表示该页是可写的。
Intel EPT通过使用硬件支持内存虚拟化技术,使其能在原有的CR3页表地址映射的基础上,引入了EPT页表来实现另一次映射。通过这个页表能够将客户机物理地址直接翻译成宿主机物理地址,这样,GVA→GPA→HPA两次地址转换都由CPU硬件自动完成,从而减少整个内存虚拟化所需的代价。其基本原理如图3-8所示。
(www.xing528.com)
图3-8 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首先根据引起异常的GHA,映射到对应的HVA;然后为此虚拟地址分配新的物理页;最后KVM再更新EPT页表,建立起引起异常的GPA到HPA的映射。
EPT页表相对于影子页表,其实现方式大大简化,主要地址转换工作都由硬件自动完成,而且客户机内部的缺页异常也不会导致VM-Exit,因此客户机运行性能更好,开销更小。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。