KVM/QEMU虚拟机申请和释放内存的步骤
1)内存申请1,QEMU调用malloc()函数为虚拟机分配虚拟内存页,但是此时并没有申请真正的物理内存。2,虚拟机开始访问该虚拟内存页,并且认为该虚拟内存页是真正的物理内存页,但是由于该内存页没有真正分配,所以开始向宿主机申请。3,宿主机内核发现一个内存页错误,便会在已经分配的malloc()'d区域调用do_page_fault()函数,如果一切顺利,没有被打断,则宿主机开始响应虚
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)