我发现 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/