文章目录
- 内存虚拟化
- 常见缩写
- 虚拟机内存访问原理
- 影子页表
- 扩展页表
- VPID(Virtual Processor Identifier):TLB(Translation Lookaside Buffer)资源优化
内存虚拟化
- 能够提供在Guest机制中识别为从零开始的连续的物理地址空间
- 各个VM之间进行有效隔离,调度,共享内存资源
常见缩写
HPA:Host Physical Address
HVA:Host Virtual Address
GPA:Guest Physical Address
GVA:Guest Virtual Address
PDBR:页目录表物理基地址寄存器,X86上叫CR3(Page Directory Base Register)
EPT:扩展页表(Extend Page Table)
SPT:影子页表 (shadow page table)
ptr:这里用来描述指向某个页表的寄存器
虚拟机内存访问原理
当Guest 访问自身内存时,步骤如下
1.通过Guest 页表将GVA转换位GPA
2.GPA在对应的式Host中一大块mmap的内存上的,所以要将GPA再转换为HVA
3.最后通过Host上的页表将HVA转化为HPA
缺点:流程繁重,从而使得虚拟机中的内存访问性能极其低下
影子页表
影子页表: GVA→HPA 映射关系的页表
实现机制:
内存访问时,需要使用到读写CR3(存放页目录表物理基地址的寄存器)的操作指令,而该操作为敏感指令,所以VMM会截获这个操作,并将页表替换为影子页表,这样页表便被替换为 GVA→HPA 映射关系的页表。
缺点:每套页表都要独立维护一份影子页表,且需要多次在VMM与VM进行切换,开销不小
扩展页表
EPT:GPA→HPA 映射关系的页表
硬件层面引入EPTP寄存器,来指向EPT页表基地址。Guest运行时,Guest页表被载入PDBR,而 EPT 页表被载入专门的EPT 页表指针寄存器 EPTP。
实现机制:
GVA->GPA的转换依然是通过查找原来页表完成,而GPA->HPA的转换则通过查找EPT来实现,每个guest VM有一个由VMM维护的EPT。同时 Hypervisor 仅需要截获 EPT Violation 异常(EPT 表项为空)
VPID(Virtual Processor Identifier):TLB(Translation Lookaside Buffer)资源优化
TLB为页表项缓存,缓存了最近的虚拟地址转换记录。当进行地址转换时 CPU 首先会先查询 TLB,TLB 根据虚拟地址查找是否存在对应的 cache,若 cache 没有才会查询页表。
由于 TLB 是与对应的页表进行工作的,因此在切换页表时 TLB 原有的内容就失效了,此时我们应当使用 INVLPG 使 TLB 失效,如在 VM-Entry 与 VM-Exit 时 页表会切换,CPU 都会强制让 TLB 失效,但这么做仍存在一定的性能损耗。
VPID是对TLB资源管理的优化,它为每个TLB表项标记一个VPID标识(VMM 为每个 vCPU 分配一个唯一的 VPID,存放在 VMCS 中,逻辑 CPU 的 VPID 为 0),在 CPU 查找 TLB 缓存时会先比对 VPID,这样我们就无需在每次进行 VM entry/exit 时刷掉所有的缓存,而可以继续复用之前保留的 cache。