内存虚拟化(1) Shadow Paging 特点 : 1. 每个虚拟机对应的 qemu-kvm 进程通过分配不同的虚拟内存区间来映射虚拟机不同的物理内存区域。每个虚拟机对应的 struct kvm 的 memslots 数组用来描述虚拟机物理内存和 qemu-kvm 虚拟区间的对应关系。 ( 在采用二维分页技术的 KVM 实现中,这种通过 qemu-kvm 的虚拟内存区域来映射虚拟机物理内存的方法是相同的 ) 2. 虚拟机运行时,Shadow 页表或 CPU 的 TLB 将客操作系统上的虚拟地址 (gva) 翻译成主机上的物理地址 (hpa)。 每个虚拟机的 CPU 的 CR3 寄存器指向的是shadow 页表的根目录的物理地址。 KVM 能截取并屏蔽客操作系统对 CR3 的访问。 在采用分页模式的虚拟机中,客操作系统内的页表记录的是客操作系统意义上的物理地址 (gpa) 3. 虚拟机进行内存访问时,只有 CPU 的 TLB 记录及 Shadow 页表项的缺失或访问控制才会导致“Page Fault”, 产生 VMEXIT 状态切换。 客户机操作系统的页表状态和“Page Fault”无关 4.KVM在处理 “PageFault”时,会首先检查客操作系统页表的状态,如果客操作系统页表本身就不存在从 gva 到 gpa 的映射, 则 KVM 要向虚拟机注入一个“Page Fault”, 由客操作系统首先完成其逻辑上的页分配; 如果客操作系统上已经存在 gva 到 gpa 的映射,则 KVM需要根据 gpa 和 memslots 的记录确定该 gpa 对应的 qemu-kvm 进程空间的虚拟地址,即 hva, 然后调用 get_user_pages() 确定或分配物理页,即确定 hpa, 最后根据 gva 和 hpa, 建立他们在 Shadow 页表中的映射关系。 ( get_user_pages 是 Linux 上用于用户进程空间的物理页分配接口,也就是说 KVM 的实现完全利用了 Linux 已有的物理页管理和分配功能 ) 详细: http://www.51rhca.com/archives/560
|