【发布时间】:2020-06-26 20:57:27
【问题描述】:
例如,我有一个启用了 KVM 的主机操作系统(比如 Ubuntu)。我用 QEMU 启动一个虚拟机来运行一个来宾操作系统(比如 CentOS)。据说对于主机操作系统来说,这个虚拟机只是一个进程。因此,从主机的角度来看,它像往常一样处理页面错误(例如,根据需要分配页框,必要时根据活动/非活动列表交换页面)。
这是问题和我的理解。在来宾操作系统中,由于它仍然是一个成熟的操作系统,我认为它仍然具有处理虚拟内存的所有机制。它看到了一些由 QEMU 提供的虚拟化物理内存。通过虚拟化物理内存,我的意思是客户操作系统不知道它在虚拟机中,并且仍然像在真实物理机器上一样工作,但它确实是 QEMU 给出的抽象。因此,即使为它分配了一个页框,如果它不在客户的页表中,客户操作系统仍然会触发页面错误,然后将一些页面映射到该框架。更糟糕的是,可能会出现双页错误,即客户机在页错误时首先分配一些页帧,这会触发主机操作系统的页错误。
不过,我也听说过浅(或影子)页表之类的东西,它似乎可以优化这种不必要的双页错误和双页表问题。我还查看了其他一些内核实现,特别是 unikernel,例如 OSv、IncludeOS 等。我没有找到任何与页面错误和页表机制相关的内容。我确实看到了一些像 page_fault_handler 这样的符号,但没有我在 Linux 内核代码中看到的那么大。在这些 unikernel 实现中,内存管理似乎没什么大不了的。所以我假设 QEMU/KVM 和一些英特尔的虚拟化技术已经处理了这个问题。
对这个主题有什么想法吗?或者,如果您对此问题有一些很好的参考资料/论文/资源,或者一些提示会非常有帮助。
【问题讨论】:
标签: linux-kernel kernel virtualization qemu kvm