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

时间:2017-11-07 07:11:40

标签: linux virtual-machine virtualization qemu kvm

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

回答有关MMIO会发生什么的问题:

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