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(),提示系统内核缺页的函数

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐