虚拟化的发展历程和实现原理——图文详解

前言

现在市场上最常见的虚拟化软件有VMWare workstation(VMWare)、VirtualBox(Oracle)、Hyper-V(Microsoft)、KVM(Redhat)、Xen等,这些软件统称之为VMM(Virtual Machine Monitor),使用不同的虚拟化实现。而这些虚拟化实现的方式可以分为全虚拟化、半虚拟化、硬件虚拟化等,本篇主要是理解这些虚拟化实现的原理。

虚拟化

虚拟化的诞生与实现: 
1961年 IBM709机实现了分时系统,将CPU占用切分为多个极短(1/100sec)时间片,每一个时间片都执行着不同的任务。通过对这些时间片的轮询,这样就可以将一个CPU虚拟化或者伪装成为多个CPU,并且让每一颗虚拟CPU看起来都是在同时运行,这就是虚拟机的雏形。后来的system360机都支持分时系统。 
1972年 IBM正式将system370机的分时系统命名为虚拟机。 
1990年 IBM推出的system390机支持逻辑分区,即将一个cpu分为若干份(最多10份),而且每份cpu都是独立的,也就是一个物理cpu可以逻辑的分为10个cpu。

直到IBM将分时系统开源后,个人PC终于临来了虚拟化的开端,后来才有了上述的虚拟机软件的发展。所以至今为止仍然有一部分虚拟机软件应用来了分时系统作为虚拟化的基础实现。

虚拟化的目的:使用逻辑来表示资源,从而摆脱物理限制的约束。提高物理资源的利用率。 
虚拟化的原理:在OS中加入一个虚拟化层(VMM),虚拟化层可以对下层(HostOS)硬件资源(物理CPU、内存、磁盘、网卡、显卡等)进行封装、隔离,抽象为另一种形式的逻辑资源,再提供给上层(GuestOS)使用。所以你可以理解VMM其实就是联系HostOS和GuestOS的一个中间件,当然虚拟化可以将一份资源抽象为多份,也可以将多份资源抽象为一份。

通过虚拟化技术实现的虚拟机一般被称之为GuestOS(客户),而作为GuestOS载体的物理主机称之为HostOS(宿主)。

虚拟机Virtual Machine

  • 由VMM提供的高效(>80%)、独立的计算机系统
  • 拥有自己的虚拟硬件(CPU、内存、网络设备、存储设备)
  • 对于上层软件,虚拟机就是真实的机器
  • Virtual Machine Monitor

满足上面几个条件的OS就是虚拟机。 

VM的特性 
同质:VM的本质与物理机的本质相同,e.g. CPU的ISA(指令集架构 Instruction Set Architecture)相同 
高效:性能与物理机接近,在VM上执行的大多数指令应该有权限和能力直接在硬件上执行,只有少数的敏感指令由VMM来处理。对于VM的性能效率在上一篇 
资源可控:VMM对物理机和虚拟机的资源都是绝对可控的 
Redhat曾经测试过一些应用服务在虚拟机上运行的效率。一部分的报告如下:

IBM DB2 SAP ORACLE JAVA LAMP
VM=HOST * 90% VM=HOST * 90% VM=HOST * 90% VM=HOST * 94% VM=HOST * 138%

NOTE:LAMP在VM上运行的效率之所以能够提高是因为将Apache、PHP/PythonMySQL 3个应用服务拆分到3个不同的VM中运行。 

虚拟化的分类

在虚拟化发展的早期主要以全虚拟化半虚拟化两大流派为主,两者各有优缺点。如果能适当的将其应用不同的环境中,就能充分的发挥两者的特性以获得更高的收益。随着这两大流派的分歧和竞争愈演愈烈,由Intel领衔的硬件厂商也纷纷加入到虚拟化的浪潮中,开启了(大航海时代)硬件虚拟化的时代,从此全虚拟化和半虚拟化前进的道路逐渐有了靠拢的趋势。再到后来的 第二代的内存虚拟化第三代的总线虚拟化 的出现和兴起,当下虚拟化市场已经不再以单纯卖卖虚拟化软件为主要盈利手段,而是将虚拟化技术整合在更大、更完善的虚拟化平台解决方案中。其中包括Redhat的RHEV、VMWare的vSphere等。

x86 CPU架构与虚拟化的关系

在理解各种虚拟化的实现之前,先看看一般x86 CPU的架构

注意:CPU为了保证代码执行的安全性、多用户的独立性、保护OS的正常运行,实现了CPU执行状态的概念。这样能够限制不同程序之间的访问能力,避免一个程序获取另一个程序的内存数据,同时也避免了程序错误操作物理硬件。一般CPU都会划分为用户态内核态,x86更是细分为了Ring3~0四种状态。

Ring3 用户态(User Mode):运行在用户态的代码需要受到CPU的检查,这些代码只能访问内存页表项中规定能被用户态访问的页面的虚拟地址(受限的访问内存),而且只能访问TSS中的I/O Permission Bitmap中规定能被用户态访问的端口。甚至不能访问外围设备、不能抢占CPU。所有的用户程序(Application)都运行在用户态。——当运行在用户态的应用程序需要调用硬件设备时,CPU会通过特别的接口去调用核心态的代码,之后用户态的应用程序才能对硬件设备进行操作。 如果用户态的应用程序直接调用硬件设备时,就会被Host OS捕捉到并触发异常。

Ring0 核心态(Kernel Mode):是Host OS Kernel运行的模式,运行在核心态的代码可以无限制的对系统内存、设备驱动程序、网卡接口、显卡接口等外围设备进行访问。只有Host OS能够无限制的访问硬盘、键盘等外围硬件设备的数据(需要驱动程序)。

虚拟化实现图

粗略而言,GuestOS和VMM都属于运行在Ring3上的应用程序,GuestOS操作硬件设备时会先将操作指令传递给VMM,VMM对该指令进行监控和检测后将指令传递给HostOS,HostOS会将GuestOS发出的运行于用户态的指令模拟为核心态指令,最后交由CPU处理。 
注意:当上述的流程是非常简略的,在与全虚拟化和半虚拟化的实现过程集合时,就会变得非常复杂。

全虚拟化 Full virtualization

GuestOS可以直接在全虚拟化VMM上运行而不需要对其本身做任何修改,全虚拟化的GuestOS具有完全的物理机特性。既VMM会为GuestOS模拟出它所需要的包括CPU、磁盘、内存、网卡、显卡等所有的抽象资源。e.g. GuestOS在使用网卡时,会调用VMM模拟的虚拟网卡驱动来操作物理网卡。

结合上述的虚拟化实现图来看:GuestOS是一个虚拟机,在我们使用GuestOS的时候,不可避免的会使用到GuestOS中的虚拟设备驱动程序和核心调度程序来操作硬件设备。与HostOS的不同在于,HostOS是运行在CPU的核心态中,这就表示了HostOS是可以直接操作硬件设备的。但GuestOS是运行在CPU用户态中,所以其不能直接操作硬件设备。为了解决这个问题,VMM引用了两个机制——特权解除和陷入模拟。 
特权解除:即翻译,当GuestOS需要使用运行在核心态的指令时,VMM就会动态的将该指令捕获并调用若干的运行在非核心态的指令来模拟该核心态指令的效果,从而将核心态的特权解除。解除了核心态的特权后,GuestOS中的大部分指令都可以正常的执行。但是,这仍然不能完美的解决问题。因为在一个OS的指令集中还存在着一种敏感指令(可能是内核态,也可能是用户态)。此时就需要陷入模拟的实现。 
陷入模拟:HostOS和GuestOS都含有敏感指令(reboot、shutdown等),试想如果在GuestOS中执行了reboot指令,却将HostOS重启了,这将会非常糟糕。VMM的陷入模拟机制就是为了解决这个问题。e.g. 在GuestOS中执行了需要运行在内核态中的reboot指令,VMM首先会将reboot指令获取、检测并判定为敏感指令。此时VMM就会陷入模拟,将敏感指令reboot模拟成一个只对GuestOS进行操作的、非敏感的、并且运行在非核心态的”reboot”指令,并将其交给CPU处理。最后由CPU准确的执行GuestOS重启的动作。

由于全虚拟化会将非内核态指令模拟成内核态指令再交由CPU处理,经过了两重转换,所以其效率会比半虚拟化更低,但全虚拟化的好处在于其不会对GuestOS做修改,所以全虚拟化的VMM可以安装绝大部分的OS(暂时来说只有已Linux、open soralis、BSD等几种OS开源了内核代码)。典型的全虚拟化软件有 —— VMWare、Hyper-V、KVM-x86(复杂指令集)。

全虚拟化的两种实现方式: 
1). 基于二进制翻译的全虚拟化 
2). 基于扫描和修补的全虚拟化

半虚拟化 Paravirtualization

半虚拟化是需要GuestOS协助的虚拟化。因为在半虚拟化中运行的GuestOS内核都进过了特别的修改。半虚拟化VMM在处理敏感指令和内核态指令的流程上相对更简单一些。在半虚拟化VMM上运行的GuestOS都需要修改内核,主要是修改GuestOS内核指令集中包括敏感指令在内的内核态指令。让HostOS在接收到没有经过半虚拟化VMM模拟和翻译处理的GuestOS内核态指令或敏感指令时,HostOS也能够准确的判断出该指令是否属于GuestOS。这样就可以高校的避免了上述问题。典型的半虚拟化软件有——Xen、KVM-PowerPC(简易指令集)

半虚拟化除了修改内核外还有另外一种实现方法——在每一个GuestOS中安装半虚拟化软件,e.g. VMTools、RHEVTools。

注意:若使用KVM运行Windows时,一定要安装半虚拟化驱动tools,否则无法工作。现在主流的半虚拟化驱动是由IBM和redhat联合开发一个通用半虚拟机驱动virtio 。

硬件辅助虚拟化 HVM

 
2005年 Intel提出并开发了由CPU直接支持的虚拟化技术。这种虚拟化技术引入新的CPU运行模式和新的指令集,使得VMM和GuestOS运行于不同的模式下(VMM=Root Mode;GuestOS=Non-Root Mode),GuestOS运行于受控模式,原来的一些敏感指令在受控模式下会全部陷入VMM,由VMM来实现模拟,这样就解决了部分非内核态敏感指令的陷入——模拟难题,而且模式切换时上下文的保存恢复由硬件来完成,这样就大大提高了陷入——模拟时上下文切换的效率 。该技术的引入使x86 CPU可以很容易地实现完全虚拟化。故皆被几乎所有之前分歧的各大流派所采用,包括KVM-x86,VMWare ESX Server 3,Xen 3.0 。

HVM的分类: 
1). Intel –> VT-X 
2). AMD –> AMD-V

内存虚拟化

原来的GuestOS使用的是虚拟内存,不可以缺少虚拟内存到物理内存的翻译,影响了虚拟机的效率。后来Intel EPT AMD RVI表示支持内存虚拟化。

内存虚拟化的映射实现*

A –> 虚拟地址(VA),指GuestOS提供给其应用程序使用的线性地址空间。 
B –> 物理地址(PA),经VMM抽象的,虚拟机看到的伪物理地址 
C –> 机器地址(MA),真是的机器物理地址,即地址总线上出现的地址信号 
内存地址的映射关系:: 
GuestOS:PA = f(VA) #GuestOS维护着一套页表,负责VA到PA的映射 
VMM:MA = g(PA) #VMM维护着一套页表,负责PA到MA的映射 
通过转换方法实现了从虚拟地址到机器地址的映射。实际运行时,用户程序访问VA1,经过GuestOS的页表转换得到PA1,再由VMM介入并使用VMM的页表将PA1转换为MA1 。

总线虚拟化

分类: 
1). Intel –> VT/d

2). AMD –> iommu 
总线虚拟化可以实现将一块网卡分给若干个GuestOS使用,每个虚拟机1/N,性能高,接近真机。 
从软件的角度出发,IO设备就是一堆状态寄存器,控制寄存器,中断并与其交互 
主要的虚拟化方式:设备接口完全模拟、前端-后端模拟(Xen)  
直接划分:直接把物理设备划分给Guest OS,无须经过VMM。Intel VT-d

内存虚拟化和总线虚拟化进一步的拉近了GuestOS和HostOS的运行性能。

转载:http://blog.csdn.net/jmilk/article/details/51031118

时间: 2024-11-03 18:50:41

虚拟化的发展历程和实现原理——图文详解的相关文章

LVS-DR工作原理图文详解

原文地址: http://www.cnblogs.com/czh-liyu/archive/2011/11/29/2267963.html 为了阐述方便,我根据官方原理图另外制作了一幅图,如下图所示:VS/DR的体系结构: 我将结合这幅原理图及具体的实例来讲解一下LVS-DR的原理,包括数据包.数据帧的走向和转换过程. 官方的原理说明:Director接收用户的请求,然后根据负载均衡算法选取一台realserver,将包转发过去,最后由realserver直接回复给用户. 实例场景设备清单: 说

高效运维之Docker持续部署图文详解

前言 关于Docker的文章铺天盖地,但精品文章往往翻译居多.都说Docker天生适合持续集成/持续部署,但同样,可落地.实际可操作性的文章也很少见. 基于这些情况,虽然我们专栏定位为运维管理性文字,但本篇是个特例,实操性的案例讲解--JAVA项目如何通过Docker实现持续部署(只需简单四步),即: 开发同学通过git push上传代码,经Git和Jenkins配合,自动完成程序部署.发布,全程无需运维人员参与. 这是一种真正的容器级的实现,这个带来的好处,不仅仅是效率的提升,更是一种变革:

图文详解Android属性动画_Android

 Android中的动画分为视图动画(View Animation).属性动画(Property Animation)以及Drawable动画.从Android 3.0(API Level 11)开始,Android开始支持属性动画,本文主要讲解如何使用属性动画.关于视图动画可以参见博文<Android四大视图动画图文详解>. 一.概述 视图动画局限比较大,如下所述: 1.视图动画只能使用在View上面. 2.视图动画并没有真正改变View相应的属性值,这导致了UI效果与实际View状态存在差

VMware使用方法(图文详解)_VMware

VMware 8虚拟机+汉化包+注册机下载地址:http://www.jb51.net/softs/377756.html 可用序列号: MV4YN-0L38Q-2ZK60-XUA7K-AAZ18(用下载的注册机生成序列号也可) 安装视频教程,个人不建议进行汉化,当然汉化后正常操作问题也不会太大 安装好之后就可以看到软件的主界面了(我没有汉化,所以界面是全英文,已汉化过的友友照着图的对应位置点击即可) 首先讲的当然是如何创建虚拟机 先在Home界面单击"Create a New Virtual

Cocos2d-x win7 + vs2010 配置图文详解

Cocos2d-x win7 + vs2010 配置图文详解(亲测)   下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d-1.01-x-0.9.1,具体下载位置如下图: 下载完之后,解压到当前文件夹.我把下载的程序放在F盘根目录,解压完毕之后,双击打开文件夹,看看里面有什么东西,红圈部分就是我们要安装使用的文件: 接下来,我们正式安装cocos2d-x到win7中去. 首先,双击上图中的cocos2d-w

为excel vba中添加、删除模块并插入全过程图文详解

  为excel vba中添加.删除模块并插入全过程图文详解         方法/步骤 1.点按快速启动栏excel 程序图标 进入excel 界面 点击选中任意单元格 然后按alt+f11 进入vbe界面 2.点击菜单栏 插入命令 在弹出的活动菜单中点按模块命令 3.另一种方式插入模块的方法可以在工程资管管理器中鼠标点击空白处 右键单击鼠标 在弹出的快捷菜单中选择插入命令 二级菜单中选择模块命令 4.如图所示模块1.模块2分别是通过菜单栏插入命令 和工程资源管理器点击右键创建的模块 5.如果

图文详解Win8.1 Update启动失败问题

  图文详解Win8.1 Update启动失败问题: 要解决windows8.1 update无法启动问题,其实只要使用Win8.1安装镜像+应急命令来修复,例如最经典的sfc /scannow命令.该修复命令可以扫描所有保护的系统文件的完整性,同时使用正确的微软版本替换受损或者异常的版本文件. 具体操作步骤: 1.下载Win8.1系统镜像,刻录DVD安装光盘或者制作U盘启动工具; 下载ISO后,可以用魔方电脑大师中的魔方文件校验来获取SHA1.MD5.CRC等校验值,确保下载的是官方纯净版,不

Win7设置5.1声道图文详解

  很多朋友不知道win7的5.1声道怎么设置,今天为大家介绍一下Win7设置5.1声道图文详解,还不知道的朋友们赶紧来看看吧,简单易懂哦 1.在桌面右下方(任务栏右边)找到一个喇叭图标,右击它,在弹出的右键菜单中找到并打开[播放设备]菜单; 此时就弹出一个"声音"窗口,在选择设备框里面找到并右击[扬声器],选择并打开第一项[配置扬声器]菜单; 在新窗口左侧"音频声道"框中选中[5.1环绕],点击下一步; 在新界面左面"可选扬声器"菜单中取消勾选

x264代码剖析(一):图文详解x264在Windows平台上的搭建

x264代码剖析(一):图文详解x264在Windows平台上的搭建           X264源码下载地址:http://ftp.videolan.org/pub/videolan/x264/           平台:win7 PC.VS2010   1.MinGW的下载.安装与配置   MinGW的下载地址:http://sourceforge.net/projects/mingw/files/ 如下图,点击下载即可. 全部采用默认安装(安装过程中会自动下载所需要的插件等等,故耗时略长)