从系统结构来研究虚拟机的设计理念和原理

来源:互联网 发布:加内特生涯数据排行 编辑:程序博客网 时间:2024/06/15 16:17

    

    虚拟机(WMM)的设计和构造最初的研究是离不开计算机的基本的体系结构的,因为想达到和真实物理机一样的仿真运行效果,并能够在一台物理机上实现多个系统运行,那么就得思考真实机器是如何工作的,实际上,虚拟机是作为真实机器和软件的结合来实现的,因为对于不同的平台和操作系统,我们对物理资源的处理方式就不同。

1.计算机系统主要接口

为了明白虚拟机在硬件系统中的定位,首先我们得了解一些基本的接口,最关心的是硬件,软件边界和附近的接口,这些接口所要完成的工作也就是将要在虚拟机中努力实现参考。

 关于体系中的硬件接口:

  ISA(Instruction Set Architecture)是指令集体系结构,像我们常知道的Windows IA-32指令集,AMD指令集,Intel 64指令集,它是软硬件的分界点,它包含的接口有6个:库函数与执行硬件接口,应用程序与执行硬件接口,驱动器与执行硬件接口,存储管理器与执行硬件之间的接口,调度器与执行硬件之间的接口。我们把能在应用程序中可见的部分称为用户指令集user ISA,而常说的操作系统调用指令集,能够以超级用户身份负责管理资源的指令称做系统指令集。如下图为它在整个系统中的位置:

 

   ABI(Application Binary Interface )是应用二进制接口,它包括应用程序与操作系统之间的接口,库函数与操作系统之间的接口。很重的一个相关接口就是应用程序接口,即API(Application Program Interface) 在整个计算机系统结构中,它包含的是:应用程序与库之间接口,库与执行硬件的接口应用程序与执行硬件之间的接口。如下图为ABI的定位:


         应用二进制接口ABI

 

   了解了基本的接口,那么就会明白虚拟软件的定位就是接口指令及仿真并充分利用硬件资源了,那么虚拟化的过程包括两个部分:(1)把虚拟资源和状态,如寄存器,存储器,文件,映射为底层机器中的真实资源;(2)使用真实机器上的指令和/或系统调用来执行虚拟机的指令和/或系统调用规定的活动如对虚拟机ABI或者ISA的仿真。

   可见二进制接口的仿真是如此重要,虚拟软件要完成的就是要翻译不同用户指令集为底层平台能够执行的指令。

2.虚拟机的认识

2.1从进程和系统的角度理解

    从进程和系统的角度理解,虚拟机可以划分为进程虚拟机和系统虚拟机:

    2.1.1进程虚拟机:

    虚拟软件将组成一个平台的操作系统和用户指令集翻译到另一个平台,形成的进程虚拟机能够执行为不同的操作系统和不同指令集开发的程序,虚拟软件放在ABI接口处,即就是操作系统和硬件结合的部分,仿真用户级指令和系统调用。也就是说,一台进程虚拟机只能够支持一个独立的进程。例如,进程虚拟机JVM虚拟机.关于JVM虚拟化的运行后面再细细研究,其实它达到了传统进程虚拟机更好的移植性的目的,因为是设计的客户ISA反映出特定一类高级语言(HLL)或者一类高级语言的特征,所以也是高级语言虚拟机。

2.1.2 系统虚拟机

   虚拟软件把一个硬件平台上的ISA翻译为另一个平台的ISA,已构成的系统虚拟机,能够执行为不同硬件集开发(比如ISA_32)的系统软件环境。简单的说,系统虚拟机能够提供完整的系统环境,这个环境可以支持操作系统和潜在的多个进程,操作系统可以访问底层硬件,一旦环境部存在了,就不能为整个系统提供支持。VirtualBoxs,VMWare可以归类为系统虚拟机,开源云平台CloudStack中系统虚拟机也是重要的角色。

 

2.2从VWM所提供的虚拟平台类型

    从VWM所提供的虚拟平台类型,可以将虚拟化技术分为两大类:完全虚拟化和类虚拟化。

    一个很好的VMM它到底提供了什么?为了能够虚拟化运行客户操作系统(运行在虚拟机上的OS),它应该有类似于物理机器的资源,应该由虚拟处理器,虚拟内存,虚拟I/O设备等组成。

2.2.1完全虚拟化

   完全虚拟化的虚拟机和真实的平台一样,客户操作系统不需要任何修改就可以运行在它上面,就像真实操作系统要操作处理器,内存,i/o设备一样来处理虚拟的处理器,内存,I/O设备。从现实的角度,完全虚拟化要能够正确处理客户机所有的指令,也就是虚拟处理器的规范定义的所有指令,底层的硬件资源是归由Hypervisor拥有,而不是归操作系统,所以,特定的受保护的指令必须被捕获到hyervisor中来处理,且操作系统通过Hypervisorg共享这些资源。

   对于完全虚拟化带来的问题是:必须要求操作系统支持底层硬件,如不支持,那么需要vmm处理的一些敏感指令就不会被捕获(对于如何实现对敏感指令的捕获有待细细研究)。

   完全虚拟化又可分为软件辅助的完全虚拟化和硬件辅助的完全虚拟化:

   软件辅助的完全虚拟化是要通过软件实现的优先级压缩和二进制代码翻译的方法实现指令的翻译,基于动态指令转换的完全虚拟化技术通过在运行时动态执行指令扫描以发现特权指令,然后依据VMM状态执行指令转换,使得特权指令的执行跳转到等价模拟代码段处,从而实现与自陷相同的目标,实现对特权指令的处理。硬件辅助的完全虚拟化,是针对硬件本身增加了虚拟化功能,它能够获取操作系统对敏感指令的执行以及敏感资源的访问,再通过异常的方式报告给VMM。目前比较流行的硬件辅助产品有Intel VT,AMD SVM。

2.2.2   类虚拟化(半虚拟化)

   类虚拟化平台提供了现实没有的平台,VMM使得客户操作系统进行了或多或少的修改来让客户操作系统适应虚拟化平台,既然完全虚拟化能够做到指令的虚拟化,那么为什么还要通过修改内核来改变,之所以这样就是为了让操作系统内核完全避免虚拟化的指令,利用内核原有功能如,特权级别、地址空间和控制寄存器等。修改了内核代码,就得到了操作系统应有特权级别,使操作系统运行在次级操作系统上。,这样的操作系统会试图执行特权指令,从而保护异常被触发,从而提供截获点供VMM来模拟。(如何截获代码的呢?以xen 为例)

2.2.3   内核虚拟机

    内核虚拟机 Linux KVM是一种完全虚拟化的解决方案,完全依赖于cpu硬件的虚拟化方案,可以说它就是一个对cpu硬件虚拟化单元的操作,它独特的一面是将linux内核转换为一个使用内核模块的hypervisor,它允许使用其他客户操作系统,然后在宿主Linux内核的用户空间中运行。在linux中我们可以在virt/kvm下找到KVM源码所在,还有它提供了KVM API,可以通过/dev/kvm设备进行访问。/dev/kvm 是一个字符型的设备。

2.3从vmm技术架构角度

   VMM技术架构分类:Hypervisior模型,宿主模型(Hosted Model),混合模型。

   一个成功的VMM主要职责是构建符合“同质“,”同效“,”资源受控“的三个特点,主要基于原有物理资源来创建相应的虚拟资源,组成虚拟机。遵循这一原则从不同的架构组成了虚拟机。

2.3.1Hypervisor 模型

   Hypervisor模型中,VMM相比传统的操作系统,它具有比主机操作系统更高的级别,它承担着所有物理资源的责任,包括vmm创建虚拟环境,管理虚拟机,以及完成客户操作系统的任务。它还有虚拟化的功能。

 

        

   如上图所示,我们看到VMM完全拥有了物理资源,其中P(Processor,处理器的管理代码)负责物理处理器的管理和虚拟化。DR(Device Driver,设备驱动)负责I/O设备的驱动,即就是物理设备的管理。M(Memory,内存管理代码)负责物理内存的管理和虚拟化,这些都是VMM的重要组成部分。我们常见的Hypervisor的虚拟机有:IBMVM/370,VMware ESXServer,Xen,Denali.

2.3.2宿主(Hosted)模型

   宿主模型中,物理资源由宿主操作系统来管理,VMM负责来完成传统系统不具备的虚拟化功能VMM通过调用宿主操作系统的服务来获得资源,实现处理器,I/O设备和内存的虚拟化,vmm还是负责创建和管理虚拟机,将虚拟机作为客户操作系统中的一个进程来调度。宿

主虚拟机最大的优势就是能够充分利用现有的操作系统的设备驱动,只需要专注于物理资源的虚拟化。由于是要通过调用宿主操作系统的服务来获取资源,但是宿主操作系统可能没有充分考虑到随虚拟化的支持,所以,在使用效率和功能上收到影响。我们常见的宿主虚拟机有:VMwareESX Server、VMware Workstation和Microsoft的Virtual Server系列产品。

 

 

2.3.3混合模型

     混合型的是上述两种的综合,Hypovisor既可以拥有底层物理资源,vmm也可以将大部分的I/O设备控制权交给一个运行在特权虚拟集中的特权操作系统来控制,也就是说,VMM的虚拟化职责被特权系统所分担。处理器和内存的虚拟化还是又VMM来完成。因为具有这样的优势,所以VMM开销变小,也就是处理指令代码开销变小,,通过对操作系统的权限控制,虚拟机的安全只需要依赖vmm。但是由于特权操作系统运行在虚拟机上,特权虚拟机要提供服务时,就必须从特权虚拟机级别切换到特权操作系统的级别,从而产生了上下文的开销,所以,当切换频繁时,这种开销使得虚拟化性能的降低。下图为简单的模型:

 

 


3.总结:

    通过理解计算机系统的接口,我们明白要完成和真实机器一样的操作系统的运行,我们需要借助计算本身的理念,去仿真和模拟一套适合底层平台的ISA,我们从不同的方式去获得对指令集的模拟和翻译,或是动态二进制的做法,或者借助原有操作系统,或者是产生一个特权操作系统,我们都得考虑如何去捕获一些指令,使得能够处理所有的客户指令并且提高虚拟机的运行效率。既然谈到了仿真ISA,那么我们就得考虑指令的解释,二进制的翻译,代码的发现和动态翻译将是研究虚拟机的重要一步。所以所理解基本的

 

附录:

基本概念汇总:

     内核:操作系统的核心程序,负责管理进程的调度、管理内存的分配和使用以及管理各种设备。它运行在cpu的最高特权上,可以访问系统的一些资源。

     内核态:操作系统运行的内核状态就是内核态。

     用户态:运行在cpu最低的特权级上,只能访问部分资源的这种状态是用户态。

     进程:程序是一个静态的指令序列,但是进程则是一个容器其中包含了当执行一个程序实例时所用到的各种资源。--摘自《深入解析Windows 操作系统》

     进程资源:私有的线性空间的

     上下文:从cpu角度引出,简单的说,上下文就是程序(主要是指进程或者中断)运行时所需要的最小寄存器集合。这些寄存器的后面一般代表运行的一类资源。比如说,CR3寄存器就代表着进程的私有线性地址空间(分页机制启动时)。我们可以查阅X86架构上下文所包含的的寄存器大概有十种,比如通用寄存器组,段寄存器组,标志寄存器组等。一个程序的上下文可能是所有寄存器的的一个子集(比如进程),也可能是全部(比如虚拟机)。

    上下文切换:程序从一种状态切换到另外一种状态(比如用户态切换到内核态),或者从一个程序切换到另一个程序,导致上下文相关寄存器的值发生变化。简单的理解是:上下文切换就是将切换前的程序上下文相关寄存器的值保存到内存,同时将新进程上下文相关寄存器的值加载到寄存器。






0 0
原创粉丝点击