下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

虚拟化的发展历程

作者:课课家教育     来源: http://www.kokojia.com点击数:2023发布时间: 2017-07-09 14:00:50

标签: 虚拟化虚拟机虚拟技术

  现在市场上最常见的虚拟化软件有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(宿主)。
  不需要对GuestOS操作系统软件的源代码做任何的修改,就可以运行在这样的VMM中
  在全虚拟化的虚拟平台中,GuestOS并不知道自己是一台虚拟机,它会认为自己就是运行在计算机物理硬件设备上的HostOS。因为全虚拟化的VMM会将一个OS所能够操作的CPU、内存、外设等物理设备逻辑抽象成为虚拟CPU、虚拟内存、虚拟外设等虚拟设备后,再交由GuestOS来操作使用。这样的GuestOS会将底层硬件平台视为自己所有的,但是实际上,这些都是VMM为GuestOS制造了这种假象。
  全虚拟化的两种实现方式:
  1). 基于二进制翻译的全虚拟化
  2). 基于扫描和修补的全虚拟化
  全虚拟化又分为:软件辅助的全虚拟化 & 硬件辅助的全虚拟化。
  软件辅助的全虚拟化
  软件辅助全虚拟化架构图:

虚拟化的发展历程_虚拟化_虚拟机_虚拟技术_课课家
  在Intel等CPU厂商还没有发布x86 CPU虚拟化技术之前,完全虚拟化都是通过软件辅助的方式来实现的。而软件辅助的全虚拟化主要是应用了两种机制:
  1. 特权解除(优先级压缩):从上述的软件辅助全虚拟化架构图中可以看出,VMM、GuestOS、GuestApplications都是运行在Ring 1-3用户态中的应用程序代码。当在GuestOS中执行系统内核的特权指令时,一般都会触发异常。这是因为用户态代码不能直接运行在核心态中,而且系统内核的特权指令大多都只能运行在Ring 0核心态中。在触发了异常之后,这些异常就会被VMM捕获,再由VMM将这些特权指令进行虚拟化成为只针对虚拟CPU起作用的虚拟特权指令。其本质就是使用若干能运行在用户态中的非特权指令来模拟出只针对GuestOS有效的虚拟特权指令,从而将特权指令的特权解除掉。
  缺点:但是特权解除的问题在于当初设计标准x86架构CPU时,并没有考虑到要支持虚拟化技术,所以会存在一部分特权指令运行在Ring 1用户态上,而这些运行在Ring 1上的特权指令并不会触发异常然后再被VMM捕获。从而导致在GuestOS中执行的特权指令直接对HostOS造成了影响(GuestOS和HostOS没能做到完全隔离)。
  针对这个问题,再引入了陷入模拟的机制。
  陷入模拟(二进制翻译):就是VMM会对GuestOS中的二进制代码(运行在CPU中的代码)进行扫描,一旦发现GuestOS执行的二进制代码中包含有运行在用户态上的特权指令二进制代码时,就会将这些二进制代码翻译成虚拟特权指令二进制代码或者是翻译成运行在核心态中的特权指令二进制代码从而强制的触发异常。这样就能够很好的解决了运行在Ring 1用户态上的特权指令没有被VMM捕获的问题,更好的实现了GuestOS和HostOS的隔离。
  简而言之,软件辅助虚拟化能够成功的将所有在GuestOS中执行的系统内核特权指令进行捕获、翻译,使之成为只能对GuestOS生效的虚拟特权指令。但是退一步来说,之所以需要这么做的前提是因为CPU并不能准确的去判断一个特权指令到底是由GuestOS发出的还是由HostOS发出的,这样也就无法针对一个正确的OS去将这一个特权指令执行。
  直到后来CPU厂商们发布了能够判断特权指令归属的标准x86 CPU之后,迎来了硬件辅助全虚拟化。
  硬件辅助的全虚拟化

全虚拟化又分为:软件辅助的全虚拟化 & 硬件辅助的全虚拟化。  软件辅助的全虚拟化  软件辅助全虚拟化架构图:
  硬件辅助全虚拟化主要使用了支持虚拟化功能的CPU进行支撑,CPU可以明确的分辨出来自GuestOS的特权指令,并针对GuestOS进行特权操作,而不会影响到HostOS。
  从更深入的层次来说,虚拟化CPU形成了新的CPU执行状态 —— * Non-Root Mode& Root Mode* 。从上图中可以看见,GuestOS运行在Non-Root Mode 的Ring 0核心态中,这表明GuestOS能够直接执行特却指令而不再需要 特权解除 和 陷入模拟 机制。并且在硬件层上面紧接的就是虚拟化层的VMM,而不需要HostOS。这是因为在硬件辅助全虚拟化的VMM会以一种更具协作性的方式来实现虚拟化 —— 将虚拟化模块加载到HostOS的内核中,例如:KVM,KVM通过在HostOS内核中加载KVM Kernel Module来将HostOS转换成为一个VMM。所以此时VMM可以看作是HostOS,反之亦然。这种虚拟化方式创建的GuestOS知道自己是正在虚拟化模式中运行的GuestOS,KVM就是这样的一种虚拟化实现解决方案。
  半虚拟化
  需要对GuestOS的内核代码做一定的修改,才能够将GuestOS运行在半虚拟化的VMM中。
  半虚拟化通过在GuestOS的源代码级别上修改特权指令来回避上述的虚拟化漏洞。
  修改内核后的GuestOS也知道自己就是一台虚拟机。所以能够很好的对核心态指令和敏感指令进行识别和处理,但缺点在于GuestOS的镜像文件并不通用。
  虚拟机Virtual Machine
  由VMM提供的高效(>80%)、独立的计算机系统
  拥有自己的虚拟硬件(CPU、内存、网络设备、存储设备)
  对于上层软件,虚拟机就是真实的机器
  Virtual Machine Monitor
  满足上面几个条件的OS就是虚拟机。

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

     以上就是本章内容的知识点了,如果对你有用,可以分享给你的朋友,也可以点赞噢~更多咨询,就在课课家!

赞(29)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程