虚拟化技术概述

虚拟化技术经过几代的发展已经有了极大的价值体现。这篇文章主要是关于主流虚拟化技术的介绍。旨在了解一些虚拟化技术的底层实现方式。

一.虚拟化应该满足的标准: 

等价执行:虚拟与真实环境的是相同的。

性能: 性能损坏要极低,不然虚拟将没有意义。
安全: 各虚拟机安全隔离。VVM就是虚拟化监控器。就是要保证各个guest的权限是被控制的,不能让他们影响到其他的guest.
二.早期虚拟化技术的的实现的方式:
第一种方式,trap(捕获的):任何一个虚拟机在执行指令时,让vmm劫获到,然后由自己VMM给装模作样的把指令执行一遍,然后把执行的结果返回给虚拟机,让虚拟机以为自己的程序确实运行而且有效果了。
第二种方式,就是emulate:也就是模拟的方式,我们我告诉guest有这个软件可以使用,除了特权指令之外,其他的指令都允许直接运行在CPU上。当进程需要发送特权指令的时候,虚拟机的进程就会向虚拟主机发起系统调用。然后是虚拟机的虚拟CPU将调用再发给hypervisor,由hypervisor,代为运行之后把结果返回给虚拟主机。
对于上面的第二种方式:很明显在不调用特权指令的时候,直接虚拟主机的进程直接跑在CPU上是很节省资源的,因此这种虚拟化技术满足虚拟化技术的性能损失很低的特点。我们比较模拟的方式:模拟是当虚拟主机的的一个进程,发起进程时,如果是一个普通的进程,那么就是不需要想自己的CPU发起系统调用,但是需要向还要向hypervisor发起调用,因为他需要软件的模拟。这样还是很消耗资源的。因此这种方式不是虚拟化技术的要求。
基于trap的虚拟化技术图1.基于trap的虚拟化技术
基于emulation的虚拟化技术图2基于emulation的虚拟化技术
模拟的非虚拟化技术图3模拟技术
三.X_86虚拟技术面临问题和挑战:
X_86系统的权限级别被分布在四个环上,分别是环0,1,2,3其中内核空间是工作在环0的,用户空间是工作在三的,环1,2是闲置的或者是用于跑驱动的。当运行hypervisor时,它必须要有特权指令的权限,因此它必须工作在环0上。而虚拟机的内核就工作在环1和环2上了,那么本来运行在环1和环2的驱动程序就被挤到环三上,也就是出现了特权指令的压缩。每个虚拟主机的都要分担物理主机的内存,那么地址空间也是被压缩了的。非特权敏感指令(也就是有些类似是特权指令的指令)的被放在了环三上。还有就是有些的系统调用,即使是失败是不反悔结果的。因此就是默认的指令的不反回值。
总结如下:
特权指令压缩:
地址空间也压缩:
非特权敏感指令:
静默指令不返回值:
四.虚拟化技术的具体实现模型:
1,对于X86平台的的的CPU的实现方式:
BT(binary tranlation),HVM,PV
BT:这是基于二进制翻译的模型:这种类型的特点就是,如果是非特权指令。直接跑在CPU上,如果是特权指令会被hypervisor捕获代为执行。然后将执行的结果返回给虚拟主机。
HVM: 这是基于硬件辅助的完全虚拟化模型:这种虚拟化技术是依靠特殊的硬件设备,让hypervisor工作在环-1上,然后是虚拟机的内核是直接工作环0上,这样CPU就是以为自己的在环零,只不过这里面没有特权指令,最终的执行还是交给环-1的。
PV:半虚拟化,这种虚拟化技术是类似于BT的一种虚拟化技术,只不过半虚拟化技术,不需要给予虚拟出来一个CPU,虚拟主机知道自己的是工作在hypervisor之上的,因此他是通过直接发送hypervisor call的方式实现的。
2,内存的虚拟化:
首先内存本身就是虚拟化的。
当前的操作系统的,虚拟化的内存空间是被虚拟化成线性的地址空间。这个线性的地址空间和物理内存的真实的离散的存储是存在一定的映射关系关系的。OS为每一进程都虚拟出来了一个虚拟地址空间,并且通过页表(page table)来存储这样的映射关系。进程对虚拟的地址空间的访问都要经过虚拟到物理的转换。现在的X86的平台都提供了mmu(内存管理单元)实现虚拟内存到物理内存的快速转换,并且通过TLB来缓存下来这个转换的结果。
如下图所示:当虚拟机启动一个进程,虚拟机会为这个进程虚拟虚拟出来一段线性的地址空间,同样的这个虚拟主机在真正的物理主机上也是被虚拟出来的线性地址空间。因此这个过程需要面临两个过程的转换,这样就比较的消耗资源。X86系列的平台在面临内存的转化时确实出现了这样的问题:
虚拟化技术中内存的虚拟化讲解
于是面对以上的问题两家公司采取了各自的措施来解决这个问题:
解决方法一:inter公司的:EPT(扩展页表技术)技术:
解决方法二:AMD的公司:NPT(嵌入套页表),标记tagger TLB 技术。也就是通过对分配的地址空间打标签的方式,区别各地址空间。并且实现了地址空间的一次转换。
这样就实现了地址的一次性转换。这样就解决了转换两次的难题。
3,IO的虚拟化:VMM的类型:
Hosted-vmm:寄宿式的虚拟化,依靠原来的操作系统来IO来实现虚拟化。
Stand-alone 的vmm的虚拟化:这种是由hypervisor自己跑在硬件上,那么想要虚拟化就要自己开发,但是这样可以支持的IO是极少的。
混合模式的类型的vmm:这种的是类似于XEN的借助于一个特权虚拟机DOM0的方式来驱动IO。
vmware的IO就是stand-alone的vmm。
IO的基于上面的类型还有三种虚拟化技术:
模拟:这种方式和CPU的方式是一样的,只不过是应用在IO上的。
PV:半虚拟化技术
透传(需要专用设备):透传的是直接驱动硬件:由于难于迁移,因此是用的也少。
I/O模拟的工作方式: 如图所示:假设此处的处理的是网卡IO,那么在一台物理机上虚拟了两台虚拟主机,工作方式如下:
每台虚拟主机,首先是驱动自己的虚拟IO。这个虚拟的IO的,还要自己去请求物理机的软件设备。当一台物理设备上,同时驱动的是一台物理主机。当驱动是很多的时候,没法都发出去,就要在网卡之前有一个缓冲区。这个缓冲区是一个环形的结构,假设是由是10个卡槽,那么当几台虚拟主机的驱动的信号占满10个之后,就不接受了。之后由软件设备驱动的物理IO,最后发出去。所以模拟的过程是两次的IO的转换,效率比较低。
虚拟化技术中的I/O虚拟化技术
IO的半虚拟化的工作方式:
这种的工作方式,直接将原本的虚拟的机的驱动和物理机的模拟驱动的软件整合成一个设备,一半放在虚拟机作为前端,一半放在物理机作为后端。这样当虚拟机再次要驱动IO的时候,就不需要经过驱动自己的IO在转换过程。而是直接将信息直接通过前端直接传递给后端,由后端请求物理机的IO。这样就省去了一个转换IO的过程。
虚拟化技术中的网络虚拟化技术
透传的工作方式:
这是一种更为简洁的工作模式:及虚拟机自己将要传递的信息。自己打包之后,直接驱动硬件设备,也就是不在依赖虚拟设备的范式,但是这种设备是导致迁移的困难很大。虽然性能很好但是很难实施。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: