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

标签 linux virtual-machine virtualization qemu kvm

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

最佳答案

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

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

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

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

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

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

关于linux - QEMU和KVM在虚拟机I/O中扮演什么角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47151936/

相关文章:

linux - 为什么我不能处理 NMI?

PHPMAKER,如何创建 View mysql

linux - 无法在 redhat 6.5 中启动 Virtual Box

virtualization - VirtualBox 端口转发不起作用

desktop - RDP、ICA 和类似协议(protocol)的免费替代品

c++ - GDB 显示文件名 : no cpp file

azure - 更改docker ubuntu默认安装路径

c - 显示完整的 Linux 命令行(gcc 输出)? (虚拟机上的c编程)

windows - 尝试创建新的 vmswitch 时出现 hyper-v 一般失败

linux - 从我的 bash 脚本调用另一个 bash 脚本,给它一些输入值