qemu是一套全虚拟化管理系统,他可以虚拟出不同架构的虚拟机,例如可以在X86平台上模拟出power机器或者mips机器。它是通过软件仿真的方式来模拟处理的取指、解码和执行,因此客户机的指令并不在物理平台上直接运行,因此性能会比较差。
但是,虚拟化并不是仿真,并不需要在一个x86的平台上虚拟出一个mips或者power的系统。虚拟化的目的是最大化资源利用率和便于管理,需要的是在x86平台之上虚拟出多个x86平台。
在硬件没有对虚拟化做出支持之前,虚拟化软件(如vmware)采用了动态二进制翻译技术,客户机需要执行的一般指令直接在硬件平台上运行,而一些特权指令(ring0-only指令)则会被动态的替换为可以在物理平台上直接运行的安全指令。此种方式下,大部分的指令都是直接在硬件上运行,只有部分指令做了替换,因此性能还说的过去。
不过随着虚拟化的巨大需求和广阔应用前景,intel、amd都提出了自己的硬件虚拟化方案。硬件虚拟化,简尔言之,就是物理平台本身提供了对特殊指令的截获和重定向的机制,甚至新的硬件会提供额外的指令来帮助软件实现对关键资源的虚拟化。例如,支持硬件虚拟化的x86 cpu提供了专门的指令来控制虚拟过程,通过这些指令,很容易会将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回VMM处理,VMM还可以将客户机对一定特定资源的访问重定向到VMM制定的虚拟资源,整个过程不需要暂停客户机的运行。由于硬件的支持,硬件虚拟化的性能就高出很多。
kvm是基于硬件虚拟化的,在KVM架构下,客户机实现为常规的Linux进程,客户机的每个CPU显示为一个常规的Linux进程。KVM是一个全虚拟化的解决方案,不需要客户机的操作系统做任何的修改。他有两部分构成:一个是KVM Driver ,是Linux 内核的一个模块,负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以及虚拟CPU的运行等;另一个部分是稍微修改过的Qemu,用于模拟PC硬件的用户空间组件,模拟I/O设备模型以及提供访问外设的途径。
KVM目前已经加入到标准的Linux内核中,被组织成Linux中标准的字符设备(/dev/kvm)。Qemu利用KVM提供的LibKvm应用程序接口,通过ioctl系统调用创建和运行虚拟机。KVM Driver使得整个Linux内核成为一个虚拟机监控器(VMM)。并且在原有的Linux两种执行模式(内核模式和用户模式)的基础上,新增加了客户模式,客户模式拥有自己的内核模式和用户模式。
在虚拟机运行下,三种模式的分工如下:
客户模式:执行非I/O的客户代码,虚拟机运行在客户模式下。
内核模式:实现到客户模式的切换,处理因为I/O或者其它指令引起的从客户模式的退出,KVM Driver工作在这种模式下。
用户模式:代表客户执行I/O指令Qemu运行在这种模式下。
在可预见的未来,Qemu团队专注于硬件模拟和可移植性,同时KVM团队专注于内核模块(如果某些部分确实有性能提升的话,KVM会将一小部分模拟代码移进来)和与剩下的用户空间代码的交互。
kvm-qemu可执行程序像普通Qemu一样:分配RAM,加载代码,不同于重新编译或者调用calling KQemu,它创建了一个线程(这个很重要);这个线程调用KVM内核模块去切换到用户模式,并且去执行VM代码。当遇到一个特权指令,它从新切换会KVM内核模块,该内核模块在需要的时候,像Qemu线程发信号去处理大部分的硬件仿真。
这个体系结构一个比较巧妙的一个地方就是客户代码被模拟在一个posix线程,这允许你使用通常Linux工具管理。如果你需要一个有2或者4核的虚拟机,kvm-qemu创建2或者4个线程,每个线程调用KVM内核模块并开始执行。并发性(若果你有足够多的真实核)或者调度(如果你不管)是被通用的Linux调度器,这个使得KVM代码量十分的小
当一起工作的时候,KVM管理CPU和MEM的访问,QEMU仿真硬件资源(硬盘,声卡,USB,等等)当QEMU单独运行时,QEMU同时模拟CPU和硬件。
但是,虚拟化并不是仿真,并不需要在一个x86的平台上虚拟出一个mips或者power的系统。虚拟化的目的是最大化资源利用率和便于管理,需要的是在x86平台之上虚拟出多个x86平台。
在硬件没有对虚拟化做出支持之前,虚拟化软件(如vmware)采用了动态二进制翻译技术,客户机需要执行的一般指令直接在硬件平台上运行,而一些特权指令(ring0-only指令)则会被动态的替换为可以在物理平台上直接运行的安全指令。此种方式下,大部分的指令都是直接在硬件上运行,只有部分指令做了替换,因此性能还说的过去。
不过随着虚拟化的巨大需求和广阔应用前景,intel、amd都提出了自己的硬件虚拟化方案。硬件虚拟化,简尔言之,就是物理平台本身提供了对特殊指令的截获和重定向的机制,甚至新的硬件会提供额外的指令来帮助软件实现对关键资源的虚拟化。例如,支持硬件虚拟化的x86 cpu提供了专门的指令来控制虚拟过程,通过这些指令,很容易会将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回VMM处理,VMM还可以将客户机对一定特定资源的访问重定向到VMM制定的虚拟资源,整个过程不需要暂停客户机的运行。由于硬件的支持,硬件虚拟化的性能就高出很多。
kvm是基于硬件虚拟化的,在KVM架构下,客户机实现为常规的Linux进程,客户机的每个CPU显示为一个常规的Linux进程。KVM是一个全虚拟化的解决方案,不需要客户机的操作系统做任何的修改。他有两部分构成:一个是KVM Driver ,是Linux 内核的一个模块,负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以及虚拟CPU的运行等;另一个部分是稍微修改过的Qemu,用于模拟PC硬件的用户空间组件,模拟I/O设备模型以及提供访问外设的途径。
KVM目前已经加入到标准的Linux内核中,被组织成Linux中标准的字符设备(/dev/kvm)。Qemu利用KVM提供的LibKvm应用程序接口,通过ioctl系统调用创建和运行虚拟机。KVM Driver使得整个Linux内核成为一个虚拟机监控器(VMM)。并且在原有的Linux两种执行模式(内核模式和用户模式)的基础上,新增加了客户模式,客户模式拥有自己的内核模式和用户模式。
在虚拟机运行下,三种模式的分工如下:
客户模式:执行非I/O的客户代码,虚拟机运行在客户模式下。
内核模式:实现到客户模式的切换,处理因为I/O或者其它指令引起的从客户模式的退出,KVM Driver工作在这种模式下。
用户模式:代表客户执行I/O指令Qemu运行在这种模式下。
在可预见的未来,Qemu团队专注于硬件模拟和可移植性,同时KVM团队专注于内核模块(如果某些部分确实有性能提升的话,KVM会将一小部分模拟代码移进来)和与剩下的用户空间代码的交互。
kvm-qemu可执行程序像普通Qemu一样:分配RAM,加载代码,不同于重新编译或者调用calling KQemu,它创建了一个线程(这个很重要);这个线程调用KVM内核模块去切换到用户模式,并且去执行VM代码。当遇到一个特权指令,它从新切换会KVM内核模块,该内核模块在需要的时候,像Qemu线程发信号去处理大部分的硬件仿真。
这个体系结构一个比较巧妙的一个地方就是客户代码被模拟在一个posix线程,这允许你使用通常Linux工具管理。如果你需要一个有2或者4核的虚拟机,kvm-qemu创建2或者4个线程,每个线程调用KVM内核模块并开始执行。并发性(若果你有足够多的真实核)或者调度(如果你不管)是被通用的Linux调度器,这个使得KVM代码量十分的小
当一起工作的时候,KVM管理CPU和MEM的访问,QEMU仿真硬件资源(硬盘,声卡,USB,等等)当QEMU单独运行时,QEMU同时模拟CPU和硬件。