《KVM实战:原理、进阶与性能调优》 —2.1.2 内存虚拟化
2.1.2 内存虚拟化
内存虚拟化的目的是给虚拟客户机操作系统提供一个从0地址开始的连续物理内存空间,同时在多个客户机之间实现隔离和调度。在虚拟化环境中,内存地址的访问会主要涉及以下4个基础概念,图2-2形象地展示了虚拟化环境中内存地址。
图2-2 虚拟化环境下的内存地址
1)客户机虚拟地址,GVA(Guest Virtual Address)
2)客户机物理地址,GPA(Guest Physical Address)
3)宿主机虚拟地址,HVA(Host Virtual Address)
4)宿主机物理地址,HPA(Host Physical Address)
内存虚拟化就是要将客户机虚拟地址(GVA)转化为最终能够访问的宿主机上的物理地址(HPA)。对于客户机操作系统而言,它不感知内存虚拟化的存在,在程序访问客户机中虚拟地址时,通过CR3寄存器可以将其转化为物理地址,但是在虚拟化环境中这个物理地址只是客户机的物理地址,还不是真实内存硬件上的物理地址。所以,虚拟机监控器就需要维护从客户机虚拟地址到宿主机物理地址之间的一个映射关系,在没有硬件提供的内存虚拟化之前,这个维护映射关系的页表叫作影子页表(Shadow Page Table)。内存的访问和更新通常是非常频繁的,要维护影子页表中对应关系会非常复杂,开销也较大。同时需要为每一个客户机都维护一份影子页表,当客户机数量较多时,其影子页表占用的内存较大也会是一个问题。
Intel CPU 在硬件设计上就引入了EPT(Extended Page Tables,扩展页表),从而将客户机虚拟地址到宿主机物理地址的转换通过硬件来实现。当然,这个转换是通过两个步骤来实现的,如图2-3所示。首先,通过客户机CR3寄存器将客户机虚拟地址转化为客户机物理地址,然后通过查询EPT来实现客户机物理地址到宿主机物理地址的转化。EPT的控制权在虚拟机监控器中,只有当CPU工作在非根模式时才参与内存地址的转换。使用EPT后,客户机在读写CR3和执行INVLPG指令时不会导致VM Exit,而且客户页表结构自身导致的页故障也不会导致VM Exit。所以通过引入硬件上EPT的支持,简化了内存虚拟化的实现复杂度,同时也提高了内存地址转换的效率。
图2-3 基于EPT的内存地址转换
除了EPT,Intel在内存虚拟化效率方面还引入了VPID(Virtual-processor identifier)特性,在硬件级对TLB资源管理进行了优化。在没有VPID之前,不同客户机的逻辑CPU在切换执行时需要刷新TLB,而TLB的刷新会让内存访问的效率下降。VPID技术通过在硬件上为TLB增加一个标志,可以识别不同的虚拟处理器的地址空间,所以系统可以区分虚拟机监控器和不同虚拟机上不同处理器的TLB,在逻辑CPU切换执行时就不会刷新TLB,而只需要使用对应的TLB即可。VPID的示意图如图2-4所示。当CPU运行在非根模式下,且虚拟机执行控制寄存器的“enable VPID”比特位被置为1时,当前的VPID的值是VMCS中的VPID执行控制域的值,其值是非0的。VPID的值在3种情况下为0,第1种是在非虚拟化环境中执行时,第2种是在根模式下执行时,第3种情况是在非根模式下执行但“enable VPID”控制位被置0时。
图2-4 VPID示意图
- 点赞
- 收藏
- 关注作者
评论(0)