1.CPU的工作机制
随着云计算的兴起,虚拟化作为云计算的组成部分也火了一把,但虚拟化并不是什么新技术,早在上世纪60年代虚拟化技术就已经出现。X86的CPU架构有4个保护环,分为:环0--环3,环0只与内核通信,执行特权指令,而环3工作在用户空间,环1、环2预留,每当用户空间发起特权请求时,会立即激活内核空间,此时用户与内核空间的切换称为软中断,用户空间的所有特权指令都必须通过系统调用的方式来完成,CPU虚拟化按照工作机制的不同分为全虚拟化,半虚拟化和硬件辅助虚拟化3种。
2. 全虚拟化
在传统架构下,应用程序会直接向环0上的内核发起系统调用,此时系统由用户空间转为内核空间的过程称为软中断,当硬件执行完指令时会通知内核的过程称为硬中断。在全虚拟化架构下,Hypervisor运行在环0,Guest系统运行在环1,但它以为自己运行在环0,当Guest系统的应用向内核发起系统调用时会发生异常(特权指令无法在环1运行),Hypervisor会捕获到这些异常,在异常里面做翻译,模拟,而后的特权指令会在环1和环0之间转换,最后返回到客户操作系统内,客户操作系统认为自己的特权指令工作正常,继续运行。硬中断结果返回时先经过Hypervisor,再由Hypervisor通知Guest内核。
3. 半虚拟化
与全虚拟化Guest内核以为自己运行在环0不同,半虚拟化通过修改Guest的内核,让它明确知道自己运行在环1,所以当它要运行特权指令时,会将调用内核的请求改为调用环0的Hypervisor,这样节省了Hypervisor捕获和翻译的过程,但由于要修改内核,所以对Windows系统的支持不好。
4. CPU辅助虚拟化
针对X86系列的CPU虚拟化,Intel从2006年,AMD从2007年开始,对CPU从硬件层面进行了扩展,创造了环-1,Hypervisor运行在环-1,Guest运行在环0,这样当Guest系统中的应用发起系统调用时,还是直接向Guest内核发起请求,除了部分敏感指令(特权指令的子集)外,其余指令不在需要Hypervisor进行辅助,由于他不需要Guest修改内核,又比全虚拟化省去了捕获翻译的过程,所以成为现阶段CPU虚拟化的主流技术。
5.类型1和类型2的虚拟化技术
类型1的虚拟化技术,又称为裸金属虚拟化,该技术的特点是Hypervisor直接运行在物理主机上,并且管理虚拟机的操作系统,代表产品为Xen。
类型2的虚拟化技术,又称为可托管的虚拟化,他的特点是允许虚拟化技术运行在普通操作系统上,和普通的进程类似,代表产品为QEMU。KVM是一个比较特殊的实现方式,他通过启用内核中的虚拟化库将传统操作系统转化为类型1的虚拟化,但是它让然用的是通用操作系统,该内核与其他虚拟操作系统一同争用物理主机资源,所以KVM更像是类型2的虚拟化技术架构。
所有操作系统的内存都是以虚拟内存的方式提供,内存虚拟化很象现在的操作系统支持的虚拟内存方式,所以先来介绍下虚拟内存的实现方式:每个应用程序在运行时需要一段连续的地址空间,如果如实按照应用程序要求的地址空间提供的话,内存中会出现很多碎片,所以内核采取虚拟内存的方式,将物理内存以4K为一个单位进行分页,应用程序以为自己获得的是一片连续的地址空间,实际上是若干个内存页组成,每个内存页上都以双向链表的方式标明自己上一个和下一个内存页的位置,而内存虚拟化则是再这个基础上再做一次分页,所以Guest系统的内存到物理内存就要经过2次映射,GVA(Guest virtual Address)——GPA(Guest Physical Address)——HPA(Host Physical Address)。
于是AMD就通过RVI技术,Intel通过EPT技术将Guest内存直接映射到物理内存以减小损耗,GVA——HPA。
现在的 x86 CPU 都包括了一个称为内存管理的模块MMU(Memory Management Unit)和 TLB(Translation Lookaside Buffer),通过MMU和TLB来优化虚拟内存的性能,但再虚拟化场景下每台物理主机上运行着多台虚拟机,TLB会被反复清零,所以TLB也要进行虚拟化。
1.I/O虚拟化说明
无论是Xen还是KVM都只是实现了CPU和内存的虚拟化,传统或默认I/O虚拟化是通过宿主机系统用户空间中的Qemu程序完成,所以一个完整的虚拟化是由Xen或KVM加上Qemu组成。按照类型可以分为全虚拟化、半虚拟化和直通3种。
2. 全虚拟化
应用程序在往Guest系统内的I/O设备上写数据时,由于I/O设备并不知道自己运行在虚拟化环境中,从而会去调用物理设备驱动,这个过程会触发异常,该异常在被KVM捕获后交给Qemu进行模拟处理后最终将数据写到物理设备上。
3. 半虚拟化
不同于全虚拟化场景,半虚拟化下I/O设备明确知道自己运行在虚拟化环境下,通过在Guest系统上安装驱动,当他在写数据时直接通过Qemu将数据写到物理设备上,省去了KVM捕获和Qemu模拟的过程,提高了I/O性能。
不像要修改内核才能让它明确知道自己运行在虚拟化环境下那么复杂,I/O设备只需要安装驱动,就可以让它知道自己运行在虚拟化环境下,驱动分为前后两部分,前半部分安装在Guest系统内,后半部分安装在Hypervisor内核中。
4.直通
无论全虚拟化还是半虚拟化,在I/O虚拟化过程中都需要经过Qemu,原因就是虚拟机共享物理主机上的硬件,其实Guest系统中也可以安装物理I/O设备的驱动,让写数据时Guest系统直接访问物理设备,不再经过KVM和Qemu,此时硬件I/O设备的性能是最好的,但这样这个物理I/O设备就只能被这一台虚拟机所使用,这种方式称为直通。
1.Xen介绍
Xen是KVM出现前的一种类型1的虚拟化技术,不要求CPU必须具备扩展功能,支持全虚拟化和半虚拟化,Xen的Hypervisor必须要配合一个独一无二的Domain0才能进行工作,所有的Xen虚拟环境都需要先运行Domain0,然后才能运行其他的虚拟客户机。Domain0中不仅包含所有硬件设备的驱动,还可以通过它对其他虚拟机进行全生命周期的管理,整个Xen架构中,只有Domain0有权限访问硬件I/O,其他的虚拟机DomainU(unprivilege)访问硬件必须通过Domain0完。
2.KVM介绍
KVM的前提是要求CPU必须具备扩展功能,在2.6.2之后的内核版本中,KVM就以一个模块的形式集成在里面,当内核装载了该模块之后就变成了支持hypervisor的内核。但是KVM本身只能够实现CPU和内存的虚拟化,KVM在I/O虚拟化方面,传统或者默认的方式是使用用户空间的QEMU纯软件的方式来模拟I/O设备,包括键盘、鼠标、显示器,硬盘和网卡等,从这个角度看,原有的操作系统也有点Domain0的特征。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。