我一直在阅读有关KVM
和Qemu
了一段时间。到目前为止,我对他们的工作有清晰的了解。
KVM支持硬件虚拟化,以为来宾操作系统提供接近本机的性能。另一方面,QEmu模拟目标操作系统。
我感到困惑的是,这两个坐标处于什么水平。喜欢
- 谁管理RAM和/或内存的共享?
- 谁安排I / O操作?
我一直在阅读有关KVM
和Qemu
了一段时间。到目前为止,我对他们的工作有清晰的了解。
KVM支持硬件虚拟化,以为来宾操作系统提供接近本机的性能。另一方面,QEmu模拟目标操作系统。
我感到困惑的是,这两个坐标处于什么水平。喜欢
Answers:
Qemu:
QEmu是一个完整的独立软件。您可以使用它来模拟机器,它非常灵活且可移植。它主要由一个特殊的“重新编译器”工作,该编译器将为给定处理器编写的二进制代码转换为另一个(例如,在PPC mac上运行MIPS代码,或在x86 PC上运行ARM)。
为了不仅仿真处理器,Qemu还提供了很多外围仿真器:磁盘,网络,VGA,PCI,USB,串行/并行端口等。
克木:
在特定的情况下,源和目标都是相同的体系结构(例如x86在x86上的常见情况),它仍然必须解析代码以删除任何“特权指令”并将其替换为上下文切换。为了使它在x86 Linux上尽可能高效,有一个称为KQemu的内核模块可以处理此问题。
作为内核模块,KQemu能够不变地执行大多数代码,仅替换最低级别的仅ring0指令。在这种情况下,用户空间Qemu仍会为仿真机分配所有RAM,并加载代码。不同之处在于,它无需重新编译代码,而是调用KQemu进行扫描/修补/执行。所有外围硬件仿真均在Qemu中完成。
这比普通Qemu快很多,因为大多数代码未更改,但是仍然必须转换ring0代码(VM内核中的大多数代码),因此性能仍然会受到影响。
KVM:
KVM有两点:首先,它是一个Linux内核模块(现已包含在主线中),可将处理器切换到新的“来宾”状态。来宾状态具有其自己的一组环状态,但是特权ring0指令回退到系统管理程序代码。由于这是一种新的处理器执行模式,因此无需以任何方式修改代码。
除了处理器状态切换之外,内核模块还处理仿真的一些低级部分,例如MMU寄存器(用于处理VM)和PCI仿真的硬件的某些部分。
其次,KVM是Qemu可执行文件的分支。两个团队都在积极工作,以尽量减少差异,并且在减少差异方面取得了进步。最终,目标是Qemu应该可以在任何地方工作,并且如果有KVM内核模块,则可以自动使用它。但是在可预见的未来,Qemu团队专注于硬件仿真和可移植性,而KVM团队则专注于内核模块(有时将仿真的一小部分移到那里,以提高性能),并与其余用户空间代码交互。
kvm-qemu可执行文件的工作方式与普通的Qemu一样:分配RAM,加载代码,而不是重新编译或调用KQemu,而是生成线程(这很重要)。该线程调用KVM内核模块以切换到访客模式,然后继续执行VM代码。在特权指令上,它切换回KVM内核模块,必要时,该模块会发信号通知Qemu线程以处理大多数硬件仿真。
该体系结构的优点之一是,来宾代码是在posix线程中模拟的,您可以使用普通的Linux工具进行管理。如果要使用2个或4个内核的VM,则kvm-qemu创建2个或4个线程,它们中的每个都调用KVM内核模块以开始执行。并发(如果您有足够的实际核心)或调度(如果没有)是由常规Linux调度程序管理的,从而使代码变小且限制意外。
一起工作时,KVM会仲裁对CPU和内存的访问,而QEMU会仿真硬件资源(硬盘,视频,USB等)。单独工作时,QEMU会仿真CPU和硬件。