KVM和QEMU的区别

我一直在阅读关于KVMQemu 。 到目前为止,我对他们的工作有了清晰的认识。

KVM支持硬件虚拟化,为客户操作系统提供接近本地的性能。 另一方面,QEmu模拟目标操作系统。

我感到困惑的是这两个协调的层次。 喜欢

  1. 谁来pipe理RAM和/或内存的共享?
  2. 谁安排I / O操作?

    Qemu

    QEmu是一个完整的,独立的软件。 你用它来模拟机器,它非常灵活和便携。 它主要是通过一个特殊的“重新编译器”来工作,它将为给定处理器编写的二进制代码转换成另一个(比如说,在PPC mac上运行MIPS代码,或者在x86 PC上运行ARM)。

    为了模拟不仅仅是处理器,Qemu还包括一系列外设模拟器:磁盘,networking,VGA,PCI,USB,串行/并行端口等。

    KQemu

    在特定情况下,源和目标都是相同的体系结构(比如x86上x86的常见情况),它仍然需要parsing代码以删除任何“特权指令”,并用上下文切换replace它们。 为了在x86 Linux上尽可能高效,有一个名为KQemu的内核模块来处理这个问题。

    作为一个内核模块,KQemu能够执行大部分的代码,只replace最底层的ring0-only指令。 在这种情况下,用户空间Qemu仍然分配模拟机器的所有RAM,并加载代码。 不同的是,它不是重新编译代码,而是调用KQemu来扫描/修补/执行它。 所有的外设硬件仿真都在Qemu中完成。

    这比普通的Qemu快很多,因为大部分代码是不变的,但仍然需要转换ring0代码(VM内核中的大部分代码),所以性能仍然会受到影响。

    KVM

    KVM有两个好处:首先它是一个Linux内核模块(现在包含在mainline中)将处理器切换到新的“guest”状态。 来宾状态具有自己的一组环状态,但特权ring0指令回退到pipe理程序代码。 由于这是一种新的处理器执行模式,所以代码不必以任何方式进行修改。

    除了处理器状态切换外,内核模块还处理模拟的一些低级部分,如MMU寄存器(用于处理VM)以及PCI模拟硬件的某些部分。

    其次,KVM是Qemu可执行文件的一个分支。 两支队伍积极合作,将分歧保持在最低水平,并且有进展。 最终目标是Qemu可以在任何地方工作,如果KVM内核模块可用,它可以被自动使用。 但是在可预见的未来,Qemu团队专注于硬件仿真和可移植性,而KVM人员则专注于内核模块(有时会移动小部分仿真(如果它提高了性能),并与其他用户空间代码进行交互。

    kvm-qemu可执行文件与普通的Qemu一样工作:分配RAM,加载代码,而不是重新编译它,或者调用KQemu,它会产生一个线程(这很重要)。 线程调用KVM内核模块切换到访客模式并继续执行VM代码。 在特权指令中,它切换回KVM内核模块,如果需要的话,它将通知Qemu线程处理大部分的硬件仿真。

    这种体系结构的好处之一就是客户代码是在一个posix线程中模拟的,你可以用普通的Linux工具来pipe理它。 如果你想要一个2核或者4核的虚拟机,kvm-qemu创build2或者4个线程,每个线程调用KVM内核模块开始执行。 并发 – 如果你有足够的真正的核心,或者如果没有进行调度的话,是由普通的Linux调度器pipe理的,保持代码小而惊喜有限。

    当KVM协同工作时,仲裁访问CPU和内存,QEMU模拟硬件资源(硬盘,video,USB等)。 单独工作时,QEMU模拟CPU和硬件。

    QEMU速度较慢,KVM可以帮助QEMU实现非常快的硬件速度,为系统提供最好的性能。 QEMU是pipe理程序/模拟器。