KVM/QEMU虚拟机申请和释放内存的步骤

1)内存申请

1,QEMU调用malloc()函数为虚拟机分配虚拟内存页,但是此时并没有申请真正的物理内存。

2,虚拟机开始访问该虚拟内存页,并且认为该虚拟内存页是真正的物理内存页,但是由于该内存页没有真正分配,所以开始向宿主机申请。

3,宿主机内核发现一个内存页错误,便会在已经分配的malloc()'d区域调用do_page_fault()函数,如果一切顺利,没有被打断,则宿主机开始响应虚拟机的操作。

4,宿主机内核创建pte_t,使malloc()'d虚拟地址连接到真正的物理内存地址,生成rmap,并把他们放到LRU中

5,此时,mmu_notifier_change_pte()被调用,其允许KVM为该内存页创建NPT/EPT.

6,宿主机从该错误的内存页中返回标识,虚拟机得到内存后执行操作恢复。

2)内存回收

1,宿主机内核利用rmap结构寻找需回收的内存页被映射到那个VMA中(vm_area_struct)

2,宿主机内核查找该VMA所关联的mm-struct,并遍历宿主机的内存分页表,查找该内存页在物理硬件上的位置。

3,宿主机内核替换出该内存页并清空pte_t

4,宿主机内核接着调用mmu_notifier_invalidate_page()函数,在NPT/EPT中查找该页并删除

5,现在,该页已经被释放。

备注:

1,NPT/EPT,这是两种技术,都使硬件重新识别架构,快速将虚拟机内存变化直接传递给宿主机物理内存,而不用再去访问宿主机内存分页表,减少一次,效率更高。

但是NPT/EPT使用时,宿主机的内存分页表像进程隔离一样被强制执行,当一个内存页在宿主机内标记为没有分配时,实际上该内存页可能已经被虚拟机占用了,所以必须与

NPT/EPT协商处理。可以在软件层面通过调用mmu_notifier()函数解决此问题,因为KVM/QEMU的内存本来就是正常的物理内存,Kernel可以像交换、替换和释放正常物理内存一样处理这些内存页。

2,do_page_fault(),提示系统内核缺页的函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值