QEMU 和 KVM 在虚拟机 I/O 中扮演什么角色?

4va*_*ch3 3 linux virtualization kvm qemu virtual-machine

我发现 QEMU 和 KVM 之间的界限非常模糊。我发现有人说虚拟机是 qemu 进程,而其他人说是 kvm 进程。究竟是什么?QEMU 和 KVM 在虚拟机 I/O 中扮演什么角色?例如,当 vm 执行 PIO/MMIO 时,是 qemu 还是 kvm 会捕获它并将其转换为硬件操作。还是双方都有责任?

Pet*_*ell 6

KVM:Linux 内核中的代码,它为用户空间提供友好的界面以使用 CPU 虚拟化。这包括用户空间可以调用的“创建 CPU”、“运行 CPU”等功能。对于完整的虚拟机,您需要有一些可以使用它的用户空间代码。这通常是 QEMU,或者更简单的“kvmtool”;一些大型云提供商有自己的自定义用户空间代码。

QEMU:模拟虚拟硬件,包括磁盘、内存、CPU、串行端口、图形和其他设备。还提供了用于执行诸如启动、停止和迁移等操作的机制(UI 和一些可编程接口)。QEMU 支持几种不同的“加速器”模式来处理 CPU 仿真:

  • TCG:纯仿真——适用于任何地方,但速度很慢
  • KVM:使用 Linux 内核的 KVM API 来允许使用主机 CPU 硬件虚拟化支持运行来宾代码
  • hax:类似于 KVM,但使用 Intel HAXM 代码,可在 Windows 主机上运行

从实现的角度来看,KVM 和 QEMU 之间的界限非常清晰——KVM 是主机内核的一部分,而 QEMU 是一个单独的用户空间程序。对于用户,您通常不必关心边界在哪里,因为这是一个实现细节。

要回答您关于 MMIO 会发生什么的问题:

  • 来宾进行 MMIO 访问
  • 这被硬件困在主机内核中
  • 主机内核 (KVM) 然后可能会自己模拟此 MMIO 访问,因为出于性能原因,在内核中实现了一些设备。这通常仅适用于中断控制器,或许也适用于 iommu。
  • 否则,KVM 会将 MMIO 访问报告回用户空间(即 QEMU、kvmtool 等)
  • 然后用户空间可以使用其设备仿真代码处理访问
  • 用户空间然后将结果(例如要返回读取的数据)返回给内核
  • 内核根据需要更新vcpu的寄存器状态以完成指令的仿真
  • 然后内核在以下指令中恢复执行 VM