首页 理论教育 基于KVM的内存虚拟化解决方案研究

基于KVM的内存虚拟化解决方案研究

时间:2023-10-19 理论教育 版权反馈
【摘要】:而在虚拟环境下,由于VMM与客户机操作系统在对物理内存的认识上存在冲突,造成了物理内存的真正拥有者VMM必须对客户机操作系统所访问的内存进行虚拟化,使模拟出来的内存符合客户机操作系统的两条基本认识,这个模拟过程就是内存虚拟化。图3-6内存虚拟化示意图当引入了客户机地址之后,内存虚拟化的主要任务就是处理以下两个方面的问题:实现地址空间的虚拟化,维护宿主机物理地址和客户机物理地址之间的映射关系。

基于KVM的内存虚拟化解决方案研究

从一个操作系统的角度,对物理内存有两个基本认识:

(1)内存都是从物理地址0开始;

(2)内存地址都是连续的,或者说至少在一些大的粒度上连续。

而在虚拟环境下,由于VMM与客户机操作系统在对物理内存的认识上存在冲突,造成了物理内存的真正拥有者VMM必须对客户机操作系统所访问的内存进行虚拟化,使模拟出来的内存符合客户机操作系统的两条基本认识,这个模拟过程就是内存虚拟化。因此,内存虚拟化面临如下问题:

(1)物理内存要被多个客户机操作系统使用,但是物理内存只有一份,物理地址0也只有一个,无法同时满足所有客户机操作系统内存从0开始的需求。

(2)由于使用内存分区方式,把物理内存分给多个客户机操作系统使用,虽然可以保证虚拟机的内存访问时连续的,但是内存的使用效率低。

为了解决这些问题,内存虚拟化引入一层新的地址空间——客户机物理地址空间,这个地址并不是真正的物理地址,而是被VMM管理的“伪”物理地址。为了虚拟内存,现在所有基于x86架构的CPU都配置了内存管理单元(Memory Management Unit,MMU)和页面转换缓冲(Translation Lookaside Buffer,TLB),通过他们来优化虚拟内存的性能。

如图3-6所示,VMM负责管理和分配每个虚拟机的物理内存,客户机操作系统所看到的是一个虚拟的客户机物理地址空间,其指令目标地址也是一个客户机物理地址。那么在虚拟化环境中,客户机物理地址不能直接被发送到系统总线上去,VMM需要先将客户机物理地址转换成一个实际物理地址后,再交由处理器来执行。

(www.xing528.com)

图3-6 内存虚拟化示意图

当引入了客户机地址之后,内存虚拟化的主要任务就是处理以下两个方面的问题:

(1)实现地址空间的虚拟化,维护宿主机物理地址和客户机物理地址之间的映射关系。

(2)截获宿主机对客户机物理地址的访问,并根据所记录的映射关系,将其转换成宿主机物理地址。

第一个问题比较简单,只是一个简单的地址映射问题。在引入客户机物理地址空间后,可以通过两次地址转换来支持地址空间的虚拟化,即客户机虚拟地址(GVA,Guest Virtual Address)→客户机物理地址(Guest Physical Address,GPA)→宿主机物理地址(Host Physical Address,HPA)的转换。在实现过程中,GVA到GPA的转换通常是由客户机操作系统通过VMCS(AMD SVM中的VMCB)中客户机状态域CR3指向的页表来指定,而GPA到HPA的转换是由VMM决定的,VMM通常会用内部数据结构来记录客户机物理地址到宿主机物理地址之间的动态映射关系。

但是,传统的IA32架构只支持一次地址转换,即通过CR3指定的页面来实现“虚拟地址”到“物理地址”的转换,这和内存虚拟化要求的两次地址转换相矛盾。为了解决这个问题,可以通过将两次转换合二为一,计算出GVA到HPA的映射关系写入“影子页表”(Shadow Page Table)。这样虽然能够解决问题,但是缺点也很明显,实现复杂,例如需要考虑各种各样页表同步情况等,这样导致开发、调试以及维护都比较困难。另外,使用“影子页表”需要为每一个客户机进程对应的页表都维护一个“影子页表”,内存开销很大。

为了解决这个问题,Intel公司提供了EPT技术,AMD公司提供了AMD NPT技术,直接在硬件上支持GVA→GPA→HPA的两次地址转换,大大降低了内存虚拟化的难度,也进一步提高了内存虚拟化的性能。

第二个问题从实现上来说比较复杂,它要求地址转换一定要在处理器处理目标指令之前进行,否则会造成客户机物理地址直接被发到系统总线上这样的重大漏洞。最简单的解决办法就是让客户机对宿主机物理地址空间的每一次访问都触发异常,由VMM查询地址转换表模仿棋访问,但是这种方法性能很差。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈