目录
第一部分:虚拟化的定义及阅读本文所需要了解的某些概念
第二部分:虚拟化的分类
第三部分:虚拟化的期望及面临的挑战
第四部分:虚拟化的实现
第五部分:Intel Vt硬件辅助虚拟化
第六部分:XEN介绍
第七部分:KVM介绍
第一部分:虚拟化的定义及阅读本文章的知识储备
一.虚拟化的定义
虚拟化是一种资源管理技术,是将计算机的各种资源(CPU,内存,磁盘空间,网络适配器)予以抽象,转换后呈现出来并可供分隔,组合为一个或多个新的环境。由此打破实体结构间不可切割的障碍,使用户可以比原来更加高效的利用计算机硬件资源
二.知识储备
1.中断与异常
程序的执行往往不只是按顺序执行那么简单,一些异常和中断则会打断顺序执行的程序流,转而进入一条完全不同的执行路径
(1)中断**(中断由外部设备产生)**
从某种意义上讲,现代计算机架构是由大量的中断事件驱动的,中断机制使外部硬件设备可以打断CPU当前的执行任务,使CPU为自己提供服务
(2)异常**(异常由CPU内部产生,与指令有关)**
中断由外部设备产生,和CPU当前执行的指令无关。异常由CPU内部产生,其原因使CPU当前执行的指令出现了问题
异常根据产生的原因和严重性可以分为如下三类
·错误(Fault):由某种错误情况引起,一般可以被错误处理程序纠正
·陷阱(Trap):指在执行了一条特殊指令后引起的异常。陷阱是有意的异常,陷阱最重要的用途是在用户和内核之间提供一个像过程一样的接口(即系统调用)
·终止(Abort):指严重的不可恢复的错误,将导致程序终止
2.I/O
计算机所处理的任务其实只有两种:CPU计算和I/O操作
I/O是CPU访问外部设备的方法,设备通常通过寄存器和设备RAM将自身功能展现给CPU,CPU通过读/写这些寄存器和RAM完成对设备的访问及其他操作
3.DMA(直接内存访问)
DMA允许设备绕开CPU直接向内存中复制或读取数据。如果设备向内存复制数据都经过CPU,则CPU会有大量中断负载,中断过程中,CPU对其他任务来讲无法使用,不利于系统性能的提高
4.上下文
上下文是从CPU的角度引出的,简单来说,上下文就是程序(主要是进程或中断)运行时所需要的最小寄存器集合(以允许任务被中断,并且稍后可以从同一点继续)。这些寄存器一般代表着程序运行的一类资源
上下文切换指的是程序从一种状态切换到另一种状态(例如用户态切换到内核态),或从一个程序切换到另一个程序(进程的切换),导致上下文相关寄存器值的变化行为,简单讲,上下文切换就是讲旧程序上下文相关寄存器的值保存到内存,同时将新程序上下文相关寄存器的值加载到寄存器中
在操作系统中会发生上下文切换的场合列举如下
·用户态与内核态的切换:进程的用户态和内核态运行在不同的Ring级别,对资源的访问权限不同,因而在用户态和内核态相互转换的时候需要切换部分上下文
·进程切换:一个CPU在一个时刻只能处理一个进程,进程切换的实质就是将被终止运行的进程的上下文相关寄存器的值存储在该进程的私有栈中。进程切换通常是全上下文的切换
·切换到中断上下文:中断的处理函数运行在中断上下文的环境下。CPU在处理一个中断时,需要由当前环境切换到该中断的上下文环境下
5.特权指令和敏感指令
·特权指令:系统中操作和管理关键系统资源的指令。现代计算机体系结构一般都有两个或者两个以上的特权级,进而使系统软件和应用软件能够彼此分离,特权指令只能在最高特权级上正确运行,如果在非最高特权级上运行,则会引发异常使处理器陷入到最高特权级,进而将特权指令交由系统软件处理
·敏感指令**:敏感指令是虚拟化技术中的概念,它指的是操作特权资源的指令**。敏感指令包括修改虚拟机的运行模式或下面物理机的状态,读/写敏感的寄存器或内存;访问系统或是地址重定位系统以及所有的I/O指令
所有的特权指令都是敏感指令,但并不是所有的敏感指令都是特权指令
在物理机中,特权指令只能在CPU运行级别最高的情况下去执行
在虚拟机中,敏感指令只能由VMM去执行
6.VMM(虚拟机监控器)
VMM是一个可以直接运行在硬件或现有操作系统之上的一个软件
作用:
·可以维护多个高效且隔离的程序环境
·管理计算机系统的真实资源,为虚拟机提供接口
·截获虚拟机对硬件的访问,由VMM去实现访问
·对下管理真实的物理硬件,对上层软件程序出虚拟的硬件平台
7.进程的运行级别
运行级别可以看作,一个进程访问底层硬件时,所携带的标记,只有级别到了一定的程度,才可以执行某些指令,默认普通应用程序工作在Ring 3级别,而操作系统工作在Ring 0 ,所以当上层的应用程序要访问底层硬件时,CPU会发现它级别不够,操作系统感知到之后,触发异常。整个进程由用户态转为内核态,由内核态去完成刚才想做的事
8.用户态和内核态
用户态和内核态的解释
第二部分:虚拟化的分类(服务器虚拟化)
一.服务器虚拟化
将服务器的物理资源抽象成逻辑资源,让一台服务器变成几台,甚至上百台相互隔离的虚拟服务器,从而不在受于物理上的界限,而是让CPU,内存磁盘和I/O等硬件变成可以动态管理的资源池,随时将物理机上的资源分配到需要这些资源的虚拟机或者应用程序中
二.从虚拟化程度上来份(指令的执行方式)
从虚拟化程度来分可以分为三类
·硬件仿真的虚拟化(Qemu)
·完全虚拟化(kvm,Vmware WorkStation)
·半虚拟化(Xen)
1.硬件仿真
实例:QEMU
特征:软件模拟硬件,Guest OS不需要做任何修改
实现方法:在物理机的操作系统上创建一个模拟硬件的程序,来仿真所想要的硬件,并在虚拟出来的这些硬件上运行虚拟机,而且虚拟机内部的客户操作系统无需进行修改
优点:Guest OS无需修改,实现起来比较简单
缺点:速度非常慢,因为模拟硬件这一行为,就会消耗大量的资源,造成运行在模拟硬件之上的操作系统的性能就非常的有限
2.完全虚拟化
实例:kvm,Vmware Workstation
特征:客户机操作系统不需要做任何修改,客户机操作系统察觉不到自己运行在一个虚拟平台上,他会像操作正常的处理器,内存,I/O设备一样来操作虚拟处理器,虚拟内存,和虚拟I/O设备。对资源的访问大都是通过VMM(虚拟机监控器)来实现的,即操作系统和硬件之间通过VMM来进行交互,相比较于硬件仿真,他不是模拟出一整套硬件,而是对虚拟机做出的指令通过VMM进行操作或修改
虚拟机的下层不是模拟出来的硬件,而是所有的虚拟机共同使用的一个虚拟化平台-----VMM,通过VMM来实现对底层资源的访问,但此时的问题是Guest OS操作系统内核不再直接控制硬件,要使得VMM对底层资源进行访问,就需要对Guest OS内核的权限进行操作,使其不再拥有那么多的权限
实现方法:VMM捕捉和处理对虚拟化敏感的特权指令,主要是实现不修改用户的操作系统就实现虚拟化
完全虚拟化又可以分为以下两种类型(后面进行详细的讲解)
(1)硬件辅助的虚拟化
(2)软件辅助的虚拟化
3.半虚拟化
实例:XEN
特征:对Guest OS的内核进行一定程度的操作,使操作系统内核完全避免难以虚拟化的指令
实现方法:修改操作系统的处理器相关的代码,让操作系统主动让出特权级别,而运行在次一级的特权上,这样当操作系统试图去执行特权指令时,保护异常被触发,进而提供截获点供VMM来模拟
三.从VMM技术架构来分
主流的VMM技术框架可以分为三类:Hypervisor模型,宿主(Hosted)模型,和混合模型
1.Hypervisor模型(裸金属模型)
实例:Vmware的ESXI
VMM的职责:同时具备物理资源的管理功能和虚拟化功能,因而物理资源虚拟化的效率比较高。在安全方面,虚拟机的安全只依赖于VMM的安全
在Hypervisor模型中,我们可以将VMM看作是一个完备的操作系统,但相比于传统的操作系统,VMM还具备虚拟化功能,VMM承担着管理物理资源的责任,所有的物理资源都归VMM所有,VMM还负责虚拟环境的创建和管理,向上提供虚拟机用于客户机操作系统
优点:安全性高,效率也高,因为不需要经过宿主操作系统的二次调用
不足:VMM的实现比较复杂
Hypervisor模型中VMM完全拥有物理资源VMM需要负责对物理资源的管理,包括进行设备驱动。而设备驱动的工作量相当大,这对Hypervisor模型的VMM是一个巨大的挑战
2.Host模型(宿主机)
实例:Vmware Workstation
VMM的职责:提供传统操作系统不具备的虚拟化功能,调用宿主机操作系统的服务来获得资源,实现处理器,内存和I/O设备的虚拟化
VMM通常是宿主操作系统独立的内核模块,有些还包括用户态进程(如负责I/O虚拟化,用户态设备模型)。VMM通过调用宿主机操作系统的服务来获得资源,实现处理器,内存和I/O设备的虚拟化,VMM将其创建的虚拟机作为宿主机操作系统的一个进程参与调度
优点:可以充分利用现有操作系统的设备驱动程序,VMM无须为I/O设备实现驱动程序,只需专注于物理资源的虚拟化
缺点:因为要使用宿主操作系统的驱动去调用资源,性能上会比较差一点,安全性也会受宿主操作系统的影响
3.混合模型
实例:XEN,KVM
VMM职责:虚拟化的一部分由特权操作系统(运行在特权虚拟机中)分担,VMM负责上层操作系统一部分对硬件的访问(CPU,内存,中断),I/O部分则交由特权主机,即是特权主机和VMM共同实现虚拟化
混合模型,集合Hypervisor模型的高性能和Host模型的简洁性,将上层的操作系统对硬件的基本服务,如内存和CPU的访问直接交给VMM处理,而将比较复杂的I/O访问转发给Host Os,这样就兼顾了VMM对硬件访问的性能,也降低了VMM开发的复杂度
优点:VMM可以利用现有操作系统的I/O设备驱动程序,也可以直接处理控制器(CPU),内存等物理资源,这样VMM的开发工作量就小了,虚拟化的效率也能保证在较高的水平,安全方面,可以通过对操作系统的限制,使虚拟机的安全性只依赖于VMM
缺点:由于特权操作系统运行在虚拟机上,而需要特权操作系统提供服务时,VMM需要切换到特权操作系统,进而产生上下文切换的开销,当上下文切换频繁时,上下文切换的开销会造成虚拟化性能的明显下降
第三部分:虚拟化的期望及面临的挑战
一.虚拟机应具有的三大特征
·一致性:一个运行在虚拟机上的程序,其行为应与直接运行于物理机上的行为基本一致,只允许有细微的差异,比如在系统时间方面
·可控性:VMM对系统资源有完全的控制能力和管理权限,包括资源的分配,监控和回收
·高效性:绝大多数的客户机指令应该由硬件直接执行,无须VMM的参与
二.与上述要求对应的四个条件
为了满足上述条件,因为系统的指令集结构(ISA)需要相应地满足以下四个条件
·CPU能支持多个特权级,并且VM上面运行的指令能在低特权级下正确执行
·非特权指令(允许用户直接使用的指令)的执行效果不依赖于CPU的特权级
·敏感指令(对系统资源配置有影响的指令)都是特权指令(不允许用户直接使用的命令)
·必须支持一种内存保护机制来保证多个虚拟机之间存在内存方面的隔离
三.解决方法
经典的CPU虚拟化模型中,CPU虚拟化采用的**“特权解除”和“陷入模拟”**技术
“特权解除”:通过降低客户机操作系统的级别,并将VMM运行在最高特权级别上,而实现VMM对虚拟机的控制。在解除了虚拟机的特权之后,客户机操作系统的大部分指令仍可以在硬件上直接执行,只有当客户机操作系统执行某些特权指令时,才会“陷入”到最高特权级别的VMM模拟其执行,实现“陷入-模拟”
依据上述条件,可以让客户机操作系统工作在非特权模式下, 当客户机操作系统执行特权指令时,也会出现一般性错误,只要出现此类错误时,VMM便可以捕获到该指令,从而模拟客户机操作系统的相应操作
但是Intel的X86架构设计之初,没有考虑到虚拟化的问题,导致没有满足条件的第三条(敏感指令(对系统资源配置有影响的指令)都是特权指令(不允许用户直接使用的命令)),X86的ISA,有17条敏感指令不属于特权指令,由于X86架构的CPU中并非所有的敏感指令都是特权指令,当这些指令在较低特权级别上运行时,VMM不能捕获到这些指令,而或成为漏网之鱼
综上所述,特权解除和陷入模拟技术不能解决X86架构CPU中的虚拟化要求,所以X86架构下CPU虚拟化的重点是解决敏感指令的处理问题
敏感指令的处理方法
软件处理:BT(二进制代码转换)。对虚拟机的指令进行拦截并进行二进制的转换,使其变成不是敏感指令而在CPU上执行,这样做会消耗大量的性能
硬件处理:后续进行介绍
第四部分:虚拟化的实现
一.虚拟化实现的几个部分
·CPU虚拟化:一个CPU模拟成多个CPU并行,允许一台物理机同时运行多个操作系统
·内存虚拟化
·I/O虚拟化
二.实现服务器虚拟化所使用的技术
·硬件仿真
·完全虚拟化(软件辅助的完全虚拟化,硬件辅助的完全虚拟化)
·半虚拟化
三.完全虚拟化的实现方式
1.实现思路
VMM捕捉和处理对虚拟化敏感的特权指令,主要是实现不修改用户的操作系统就实现虚拟化
2.软件辅助虚拟化的实现
X86体系最初是存在虚拟化漏洞的,完全虚拟化只能通过软件来实现,这时一般采用的方法是**优先级压缩(Ring Compression)和二进制代码翻译(Binary Translation)**相结合的方式来实现完全虚拟化
优先级压缩:VMM和客户机运行在不同的特权级上,对应到X86架构上往往是VMM运行在RING0上,客户机操作系统运行在RING1上,客户机操作系统应用程序运行在RING3上,当客户机操作系统内核执行相关特权指令时,由于其处在非特权的RING1上,通常会引发异常,VMM截获该特权指令并进行虚拟化
优先级压缩能正常处理大部分特权指令,但是X86体系存在虚拟化漏洞,有些敏感指令不能通过优先级压缩正常处理,即该指令不是特权指令,但是敏感指令,这种指令就不能触发异常被VMM截获并处理,于是引入二进制代码翻译的方式来处理这些虚拟化漏洞
二进制翻译:即通过扫描并修改客户的二进制代码,将难以虚拟化的指令转换为支持虚拟化的指令,VMM对操作系统的二进制代码进行扫描,一旦发现需要处理的指令,就将其翻译成支持虚拟化的指令块。这些指令块可以与VMM合作访问受限的虚拟资源,或显式地触发异常,让VMM进一步处理
优先级压缩和二进制代码翻译相结合的方式实现了完全虚拟化,但是这种打补丁的方式很难在架构上保证其完整性
3.硬件辅助虚拟化的实现
随着虚拟化技术的日益发展壮大,X86厂商在硬件上加入了对虚拟化的支持,从而在硬件架构上实现了虚拟化
硬件辅助完全虚拟化的思想是对硬件本身加入足够的虚拟化功能,进而截获操作系统对敏感指令的执行及对敏感资源的访问,再通过异常的方式报告给VMM
intel的VT-X技术是硬件辅助完全虚拟化的代表,VT-X技术在处理器上引入了一个新的执行模式用于运行运行虚拟机(root模式和non-root模式)当虚拟机运行在这个特殊执行模式(non-root)中时,它面对的仍是一套完整的处理器寄存器集合和执行环境,只是所有的特权指令都会被处理器截获报告给VMM。VMM模式本身运行在正常模式下(root模式)在收到处理器的报告后,通过对目标指令解码,找到对应的虚拟化模块进行模拟,并把最终的结果反映到特殊模式下(non-root)的环境中
硬件辅助虚拟化是一种完备的虚拟化方案,由于内存和外设的访问本身也是由指令来承载的,对处理器指令级别的截获就意味着VMM可以模拟一个与真实主机完全一样的环境
优点:完全虚拟化比硬件仿真的速度要快,完全隔离每台虚拟机和VMM,操作简单
缺点:实现复杂,有些特权指令无法被捕捉到,性能也不是特别好,尤其是在I/O方面
CPU两种运行模式,一种root模式,另一种non-root模式,non-root模式无法访问到底层的硬件资源,还是要借助root模式来进行访问
四.半虚拟化实现的方法
实现方法:修改操作系统的处理器相关的代码,让操作系统主动让出特权级别,而运行在次一级的特权上,这样,当操作系统试图去执行特权指令时,保护异常被触发,进而提供截获点供VMM来模拟
第五部分:Intel VT虚拟化技术
一.Intel VT架构
Intel VT是Intel平台上硬件虚拟化技术的总称,包含对CPU,内存和I/O设备等各个方面的虚拟化的支持
使用Intel VT实现的VMM典型结构分为两层
上层是通用功能:如资源管理系统调度等
下层是平台相关部分:使用Interl VT技术实现的处理器虚拟化,内存虚拟化,和I/O虚拟化
处理器:VT-x(Intel Virtualization Technology for x86)
内存:EPT(Extended Page Table)
I/O设备虚拟化方面:VT-d(Intel Virtualizaiton Technology for Directory I/O)
二.处理器虚拟化(CPU虚拟化)
处理器虚拟化是VMM中最核心的部分,由于访问内存或I/O的指令不慎就是敏感指令,内存虚拟化与I/O虚拟化都依赖于处理器虚拟化的实现
处理器虚拟化要实现的是让虚拟机里执行的敏感指令能够陷入异常,并被VMM模拟,而不要直接作用于真实的硬件上
(1)陷入
陷入:客户机操作系统执行时如何通知VMM,VMM的陷入是通过处理器的保护机制,利用中断来完成的
陷入的方式
<1>基于处理器保护机制触发的异常。处理器会在执行敏感指令之前,检查其执行条件是否满足(执行条件主要包括当前特权级别,运行模式,内存映射关系等),一旦任一条件不满足,就会陷入VMM进行处理
<2>虚拟机主动触发异常,也就是通常所说的陷阱。虚拟机可以通过陷阱指令主动请求陷入到VMM
<3>异步中断,包括处理器内部的中断源和外部的设备中断源
(2)CPU的硬件辅助虚拟化 VT-x
在硬件设计没有对虚拟化漏洞做出改进之前,一般是通过软件模拟实现CPU完全虚拟化。模拟的强大之处在于VMM可以控制虚拟机的整个执行过程,因而不会漏过需要模拟的敏感指令
硬件辅助虚拟化,intel VT为CPU虚拟化提供了VT-x技术
<1>根操作模式(VMX Root Operation):VMM运行时所处的模式,以下简称为根模式,在根模式下,所有指令的行为和传统的IA32一样,因此原来的软件都可以正常运行
<2>非根操作模式(VMX Non-Root Operation):客户机运行时所处的模式,非根模式下,所有的敏感指令的行为都被重新定义,使得他们能不经过虚拟化就直接运行或者通过“陷入再模拟”的方式来处理
根模式和非根模式都有相应的特权级0~3.所有在使用VT-x时,描述程序运行在某个特权级别时,必须指明当前是处于何种模式(根模式还是非根模式)
VT-x中,在非根模式下,敏感指令引起的“陷入”称为VM-Exit,VM-Exit发生时,CPU自动从非根模式切换到根模式,与VM-Exit相对应的是VM-Entry,该操作由VMM发起,通常是VMM调度某个客户机时CPU由根模式切换成非根模式
VMCS,虚拟机控制结构,可以更好地支持CPU虚拟化,VMCS保存虚拟CPU需要的相关状态,(如CPU在根模式和非根模式下的特权寄存器的值)。VMCS主要供CPU使用,CPU在发生VM-Exit和VM-Entry时会自动查询和更新VMCS。VMM可以通过指令配置VMCS,进而影响CPU的行为
vCPU
硬件虚拟化使用vCPU(Virtual CPU)描述符来描述CPU。vCPU描述符类似于操作系统中的进程描述符(或进程控制块),其本质是一个结构体
第六部分:XEN虚拟化的介绍
一.XEN的体系结构
整个的XEN由XEN Hypervisor和虚拟域组成,虚拟域(Domain)又称XEN虚拟机,由特权虚拟域(Domain 0,IDD)和非特权虚拟域(Domain U和HVM组成)
二.XEN Hypervisor也称为VMM,是位于虚拟域和底层硬件之间的虚拟话软件模块,管理多个虚拟域的资源并监控虚拟域中操作系统的运行
功能:
·加载所有域的操作系统
·为操作系统提供虚拟化的硬件资源(只提供CPU,内存和中断的虚拟化,网络,存储I/O由Domain0控制)
·保证各虚拟机之前的相互隔离
三.特权虚拟域
特权虚拟域又称为Domain 0,是运行在Xen Hypervisor之上的,可以直接访问底层的物理资源,并可以与其他虚拟域Domain U进行交互,Domain 0需要先于Domain U启动,其他虚拟域访问I/O设备都需要经过Domain 0
Domain0上的一系列域管理工具和控制工具(Linux守护进程)这些工具运行在Domian0上,支持对虚拟域的管理和控制
四.非特权域U (Domain U)
Domain U是除Domain 0以外的虚拟域,由于Domain U不能像Domain 0一样直接访问物理设备,因此称为非特权区域。
Domain U是除Domain 0以外的虚拟域,由于Domain U不能像Domain 0一样直接访问物理设备,因此称为非特权区域。
通常情况下,Domain U中的操作系统通过分离驱动模型的前端驱动来访问硬件设备。客户机操作系统通过前端设备驱动向位于Domain 0或IDD中的后端驱动发送I/O请求,再由后端设备驱动将请求转交给原设备驱动里,并将处理结果返回给Domain U
六.硬件虚拟域(HVM)
Xen在设计之初为了追求高性能,采用了半虚拟化技术,需要少量修改客户机操作系统的内核与Xen Hypervisor进行协同工作。后再在得到Intel和AMD的硬件支持后,XEN能够实现全虚拟化
七.XEN CPU虚拟化的工作原理
XEN分别通过半虚拟化技术和硬件虚拟化技术HVM来实现CPU的虚拟化
1.半虚拟化技术
Xen虚拟化系统按照CPU的4个特权结构对软件模块进行了部署,将Xen Hypervisor安排在最高特权级Ring 0 上,将客户机操作系统安排在RING 1 上,将应用程序放在Ring 3上
为了解决敏感指令的捕捉问题,半虚拟化技术需要对客户机操作系统的代码进行修改,对有缺陷的指令(不能捕获的敏感指令)进行替换,并将与特权指令相关的操作都转换成Xen Hypervisor 的Hypercall(超级调用),交给XEN Hypervisor软件模块进行处理
所以半虚拟化的性能要好于完全虚拟化
由于Hypercall支持Batch(批处理)和异步这两种优化方式,使得通过Hypercall能得到近似与物理机的速度。但是由于半虚拟化需要修改客户机操作系统的代码,使得虚拟域上使用的操作系统类似受到了限制
2.硬件虚拟化技术支持的全虚拟化
半虚拟化采用软件的方式来解决X86架构下CPU虚拟化的问题,但需要修改少量操作系统的代码,使得Xen运行Windows等流行却非开源的操作系统变得不可行,在市场的驱动下,Intel和AMD在其CPU中增加了辅助虚拟化技术,使得Xen可以实现全虚拟化,即不用修改客户机操作系统也可以实现虚拟化
VT-x还是要陷入,VM entry 和VM exit,只是 BT 翻译消耗比较大
第七部分:KVM
一.KVM介绍
KVM全称是(Kernel-based Virtual Machine),他是一个Linux的一个内核模块,该内核模块使得Linux变成了一个Hypervisor
二.KVM架构
KVM是基于虚拟化扩展(Inter VT或者AMD-V)的X86硬件开源的Linux原生的全虚拟化解决方案。KVM中,虚拟机被实现为常规的Linux进程,由标准Linux调度程序进行调度,虚拟机的每个虚拟CPU被实现为一个常规的Linux进程,这使得KVM能够使用Linux内核的已有功能
KVM架构中有三种状态模式
Guest :客户机系统,包括CPU(vCPU),内存,驱动(Console,网卡,I/O设备驱动等)
被KVM置于一种受限制的CPU模式下运行
KVM:运行在内核空间,提供CPU和内存的虚拟化,以及客户机的I/O拦截。Guest 的I/O被KVM拦截以后,交给QEMU处理
QEMU:修改过的KVM虚机使用的QEMU代码,运行在用户空间,提供硬件I/O虚拟化,通过IOCTL /dev/kvm设备和KVM交互
三.KVM实现拦截虚机I/O请求的原理
支持虚拟化技术的CPU带有特别优化过的指令集来控制虚拟化过程。通过这些指令集,VMM很容易将客户机置与一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回给VMM处理。
四.QEMU-KVM
其实,QEMU原本不是KVM的一部分,他自己就是一个纯软件实现的虚拟化系统,所以其性能低下。但是,QEMU代码中包含整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及KVM使用到的虚拟设备模拟(网卡,显卡,存储控制器和硬盘等)
为了简化代码,KVM在QEMU的基础上做了修改,VM运行期间,QEMU会通过KVM模块提供的系统调用来进入内核,由KVM负责将虚拟机置于处理的特殊模式进行。遇到虚机进行I/O操作,KVM会从上次的系统调用出口处返回QEMU,由QEMU来负责解析和模拟这些设备
五.KVM虚机的创建过程
(1)qemu-kvm 通过对 /dev/kvm 的 一系列 ICOTL 命令控制虚机
(2)一个 KVM 虚机即一个 Linux qemu-kvm 进程,与其他 Linux 进程一样被Linux 进程调度器调度。
(3)KVM 虚机包括虚拟内存、虚拟CPU和虚机 I/O设备,其中,内存和 CPU 的虚拟化由 KVM 内核模块负责实现,I/O 设备的虚拟化由 QEMU 负责实现。
(3)KVM虚机系统的内存是 qumu-kvm 进程的地址空间的一部分。
(4)KVM 虚机的 vCPU 作为 线程运行在 qemu-kvm 进程的上下文中。