戚正伟
QEMU/KVM 源代码分析之内存管理
2017-9-12 16:50
阅读:6080
标签:内存管理

内存管理是虚拟机管理比较复杂的部分。


影子页表


KVM通过维护 GVA 到 HVA 的页表SPT,实现了直接映射。于是可以被物理MMU寻址使用。


guest OS的页表被设置为read-only,当guest OS进行修改时会触发page fault,VMEXIT到KVM。KVM会对GVA对应的页表项进行访问权限检查,结合错误码进行判断,如果是由guest OS引起的,则将该异常注入回去。如果是guest OS的页表和SPT不一致引起的,则同步SPT,根据guest OS页表和mmap映射找到GVA到GPA再到HVA的映射关系,然后在SPT中增加/更新 GVA - HVA 的表项。


当guest OS切换进程时,会把待切换进程的页表基址载入CR3,触发VM EXIT到KVM,通过哈希表找到对应的SPT,然后加载到guest的CR3。


缺点:每个进程都有一张SPT,带来额外的内存开销。需要维护guest OS页表和SPT的同步。每当guest发送page fault都会VM exit(即使是guest自身缺页导致的),开销大。


EPT / NPT


Intel EPT(Extended Page Table)引入了EPT页表和EPTP(EPT base pointer),EPT中维护着GPA到HVA的映射,而EPT base pointer负责指向EPT。在guest OS运行时,该VM对应的EPT地址被加载到EPTP,而guest OS当前运行的进程页表基址被加载到CR3,于是在进行地址转换时,通过CR3指向的页表从GVA到GPA,再通过EPTP指向的EPT从GPA到HPA。


在page fault时,更新 EPT。


AMD NPT(Nested Page Table)原理类似,但实现上略有不同。Guest OS和Host都有自己的CR3。当进行地址转换时,根据gCR3指向的页表从GVA到GPA,然后根据nCR3指向的页表从GPA到HPA。


优点:guest的缺页在guest内处理,不会vm exit。地址转换基本由硬件(MMU)查页表完成。 缺点:两级页表查询,只能寄望于TLB命中。



详情可参考我们实验室的源码分析: https://github.com/GiantVM/doc/blob/master/memory.md

转载本文请联系原作者获取授权,同时请注明本文来自戚正伟科学网博客。

链接地址:https://wap.sciencenet.cn/blog-279072-1075608.html?mobile=1

收藏

分享到:

当前推荐数:0
推荐到博客首页
网友评论0 条评论
确定删除指定的回复吗?
确定删除本博文吗?