我发现 QEMU 和 KVM 之间的界限非常模糊。我发现有人说虚拟机是qemu进程,而另一些人说是kvm进程。究竟是什么?
而QEMU和KVM在虚拟机I/O中扮演什么角色呢?比如一个vm做PIO/MMIO的时候,是qemu还是kvm会把它困住,转成硬件操作。还是双方都有责任?
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 的执行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)