KVM / QEMU和来宾OS如何处理页面错误

问题描述 投票:0回答:1

例如,我有一个启用了KVM的主机操作系统(例如Ubuntu)。我使用QEMU启动虚拟机来运行客户机OS(例如CentOS)。据说对于主机OS而言,该VM只是一个过程。因此,从主机的角度来看,它可以照常处理页面错误(例如,根据需要分配页面框架,必要时根据活动/非活动列表交换页面)。

这里是问题和我的理解。在来宾操作系统中,由于它仍然是成熟的操作系统,因此我认为它仍然具有处理虚拟内存的所有机制。它看到QEMU提供的某些virtualized物理内存。通过虚拟化物理内存,我的意思是来宾OS不知道它在VM中,并且仍然可以像在真实物理机上那样工作,但是它的确是QEMU提供的抽象。因此,即使分配了页面框架,即使该页面框架不在来宾的页面表中,来宾操作系统仍会触发页面错误,然后将某些页面映射到该框架。更糟糕的是,可能会出现双重页面错误,其中来宾首先在页面错误时分配一些页面框架,这会在主机OS上触发页面错误。

但是,我也听到类似浅(或阴影)页表的问题,这似乎可以优化此不必要的双页错误和双页表问题。我还查看了其他一些内核实现,尤其是单内核,例如OSvIncludeOS等。我没有发现与页面错误和页面表机制相关的任何内容。我确实看到了一些符号,例如page_fault_handler,但没有我在Linux内核代码中看到的那么大。在这些Unikernel实现中,内存管理似乎并不是什么大问题。因此,我认为QEMU / KVM和某些英特尔的虚拟化技术已经解决了这一问题。

有关此主题的任何想法?或者,如果您有一些很好的参考资料/论文/资源来解决此问题,或者有些提示会很有帮助。

linux-kernel kernel virtualization qemu kvm
1个回答
0
投票

QEMU / KVM有两种支持来宾物理内存的方法:EPT和影子页表。 (EPT是Intel定义的一种机制。其他处理器也支持类似的功能,在此不再赘述。)

EPT代表扩展页表。除常规处理器页面表外,它是CPU支持的第二种页面调度。在VM中运行时,常规页表用于将客户机虚拟地址转换为客户机物理地址,而EPT表用于将客户机物理地址转换为主机物理地址。对来宾内的每个内存访问都执行此双层转换。 (处理器TLB隐藏了大部分成本。)EPT表由VMM管理,而常规页表由来宾管理。如果来宾页面表中没有页面,则将导致来宾页面错误,这与您所描述的完全相同。如果来宾页面表中存在页面,但EPT中不存在页面,则会导致EPT违规VM退出,因此VMM可以处理丢失的页面。

影子页表在EPT不可用时使用。影子页表是访客页表的副本,该访客页表将GVA到GPA以及GPA到HPA的映射都合并在一组页面表中。发生页面错误时,它总是导致VM退出。 VMM检查缺少的页面是否在来宾页面表中映射。如果不是,则VMM将页面错误injects输入来宾以使其处理。如果页面被映射到来宾页面表中,则VMM会像处理EPT冲突一样处理故障。来宾中跨多个进程的影子页表的有效管理可能非常复杂。

EPT不仅易于实现,而且对于大多数工作负载都具有更好的性能,因为页面错误是直接生成给来宾OS的,通常在需要处理它们的地方。使用影子页表需要针对每个页面故障退出VM。但是,影子页表对于某些很少导致页面错误的特定工作负载而言可能具有更好的性能。

© www.soinside.com 2019 - 2024. All rights reserved.