深入计算机的世界分享 http://blog.sciencenet.cn/u/qizhwei 虚拟化、云计算、Dev-Test-Ops

博文

QEMU/KVM 源代码分析之内存管理

已有 6022 次阅读 2017-9-12 16:50 |个人分类:学术探讨|系统分类:科研笔记| 内存管理

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


影子页表


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://blog.sciencenet.cn/blog-279072-1075608.html

上一篇:QEMU/KVM 源代码分析之中断处理
下一篇:APP启动时间分析
收藏 IP: 112.65.223.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-23 16:06

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部