前面讲过,在Intel x86 CPU中,为了加快线性地址到物理地址的转换,引入了各种地址转换的cache(TLB、PDE cache、PDPTE cache、PML4 cache)和PCID(Processor Context Identifier)机制。不清楚的可以出门左转查看上一篇文章。
而在虚拟化环境中,即VMX(Virtual Machine Extension)中,Intel x86 CPU同样也引入了EPT(Extended Page Table)、地址转换Cache和VPID(Virtual Processor Identifier)机制用于加快地址的转换。
1. EPT(Extended Page Table)
在虚拟化环境中,由于VMM(Virtual Machine Monitor)可以同时管理、运行多个虚拟机,每个虚拟机看到的硬件资源都由VMM模拟或者分配,所以虚拟机看到的硬件资源可能不是真实的,比如内存,所以在虚拟化环境中就需要将虚拟机所认为的物理内存转换成实际的物理内存。即在虚拟机内部的客户机操作系统,它能感受到的是和普通的操作系统一样,即将虚拟地址转换为物理地址(客户机物理地址),而在实际的实现中,还需要在客户机操作系统无法感知的地方将客户机物理地址转换为真实的物理地址,即宿主机物理地址,这个过程即GVA(Guest Virtual Address)-> GPA(Guest Physical Address) -> HPA(Host Physical Address)。
为了实现这个目的,可以通过纯软件的方式,也可以通过硬件辅助的方式。对于纯软件的方式而言,由于硬件上只提供了一个地址转换页表的入口点——CR3寄存器。为了让一个页表实现两层的地址转换(GVA->GPA是虚拟机操作系统可以见的,GPA->HPA是虚拟机操作系统不可见的),VMM将采用陷入再模拟的方式,让虚拟机操作系统对CR3和页表的访问都触发退出到VMM,然后VMM将两次地址转换的页表结合起来形成一系列的页表,即影子页表。虚拟机操作系统以为自己将GVA->GPA的转换页表入口加载到CR3寄存器,而实际上已经被VMM“偷梁换柱”了,加载到C