ept(ept鞋)

内存虚拟化

现代多任务操作系统设计,常见的进程使用不同的虚拟地址空来相互隔离。在实施中:

操作系统负责维护进程页表,映射虚拟地址和物理地址的关系;CPU的内存管理单元(MMU)负责地址翻译;提供CPU TLB(Translation look aside buffer)缓存最近使用的转换结果,加快转换效率;引入虚拟化技术后,内存地址空更加复杂,来宾和主机都有自己的地址空:

GVA:来宾虚拟地址GPA:来宾物理地址HVA:主机虚拟地址HPA:主机物理地址显然,来宾负责GVA和GPA之间的转换;负责主机HVA和HPA之间的转换;但是GPA和HPA之间的转换需要Hypervisor的辅助,这个过程一般称为内存虚拟化。

阴影页表

早期的X86 CPU硬件辅助虚拟化能力并不完善,需要Hypervisor通过软件实现内存虚拟化。因此,虚拟机管理程序为每个客户端维护一组额外的页表,也称为影子页表。

同时,Hypervisor拦截客户端中任何试图修改客户端页表或刷新TLB的操作,将GVA到GPA改为GVA到GPA。这些操作包括:

在gCR3(Guest CR3)寄存器中写入相同的内容一般用于刷新TLB;写入gCR3(访客CR3)寄存器的不同物理地址通常会导致进程切换;修改一些页表。此时必须调用INVLPG指令失效对应的TLB;这样,Guest中的页表实际上变成了虚拟页表,Hypervisor截获与Guest相关的修改操作并更新到影子页表,而影子页表实际上是加载到物理MMU中的;Guest中GVA和GPA之间的翻译实际上变成了GVA和HPA之间的翻译,GVA和HPA之间的映射缓存在TLB。访客存储器访问没有额外的地址转换开销。

当然,影子页表也带来了以下主要缺点:

Hypervisor需要为每个进程的每个客户端的页表维护一组对应的影子页表,这会带来额外的内存开销。当客户读写CR3,执行INVLPG指令,或者客户页表不完整时,会导致VM退出,导致内存虚拟化效率低下。客户机页表和影子页表之间的同步也很复杂。英特尔EPT技术

为了简化内存虚拟化的实现,提高内存虚拟化的性能,Intel推出了EPT(Enhanced Page Table,增强页表)技术,在原有页表的基础上增加EPT页表,实现另一种映射。这样,GVA-GPA-HPA的两次地址转换由CPU硬件自动完成。

ept(ept鞋)

EPT中GVA和HPA的近似翻译过程;

非根模式的CPU加载客户进程的gCR3GCR3是GPA,CPU需要查询EPT页表实现GPA->:HPA;如果不是,CPU触发EPT违例,由Hypervisor拦截处理;假设客户端有M级页表,主机EPT有N级,在TLB未命中的最坏情况下,会产生MxN次内存访问来完成客户端的地址翻译。ept(ept鞋)

摘要

为了解决GVA-GPA-HPA之间的转换关系,Hypervisor在没有硬件辅助的时代,巧妙地通过影子页表将GVA-GPA映射到GVA-HPA。虽然实现了功能,但是在很多实际场景下,比如频繁的进程切换,频繁的内存分配释放,性能损失会非常大。

借助硬件,EPT简单直接地实现了内存虚拟化。传统的页表继续负责GVA-GPA,而EPT负责GPA-HPA。虽然内存访问延迟可能会增加一点,但是页表更新导致的vmexit大大减少,综合性价比大大提高。所以现代内存虚拟化基本上是由EPT统一的。

本文来自投稿,仅供学习参考!不代表本站立场,该文观点仅代表原作者本人,本站不拥有所有权,不承担相关法律责任。如发现本站有抄袭侵权/违规的内容,请发送邮件至83771837@qq.com举报,一经查实,本站将立刻删除。