虚拟化类型
  在虚拟化蓬勃发展的这些年里,虚拟化可以根据不同划分标准进行分类,包括全虚拟化,CPU 虚拟化,硬件虚拟化,服务器虚拟化,桌面虚拟化等等。我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用 Hypervisor,隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(即虚拟机)。
  这种分类并不是绝对的,一个优秀的虚拟化软件往往融合了多项技术。例如 VMware Workstation 是一个著名的全虚拟化的 VMM,但是它使用了一种被称为动态二进制翻译的技术把对特权状态的访问转换成对影子状态的操作,从而避免了低效的 Trap-And-Emulate (陷入-模拟)的处理方式,这与半虚拟化相似,只不过半虚拟化是静态地修改程序代码。对于半虚拟化而言,如果能利用硬件特性,那么虚拟机的管理将会大大简化,同时还能保持较高的性能。
  下面分别介绍四类主流的分类方法:
 1、从虚拟化的层次划分,主要分为软件辅助的虚拟化和硬件辅助的虚拟化。
1. 软件辅助虚拟化:通过软件的方法,让客户机的特权指令陷入异常,从而触发宿主机进行虚拟化。主要使用的技术就是优先级压缩和二进制代码翻译。
2. 硬件辅助虚拟化:是指在 CPU 中加入新的指令集和处理器运行模式,完成虚拟化操作系统对硬件资源的的直接调用。典型技术指的是 Intel VT,AMD-V。
 
2、从虚拟平台角度分为全虚拟化和半虚拟化
全虚拟化
  全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。全虚拟化 VMM 以完整模拟硬件的方式提供全部接口(同时还必须模拟特权指令的执行过程)。
  咱们举例说明一下,在 x86 体系结构中,对于操作系统切换进程页表的操作,真实硬件
通过提供一个特权 CR3 寄存器来实现该接口,操作系统只需执行 "mov pgtable,%%cr3" 汇编指令即可。
  全虚拟化 VMM 必须完整地模拟该接口执行的全过程。如果硬件不提供虚拟化的特殊支持,那么这个模拟过程将会十分复杂一般而言,VMM 必须运行在最高优先级来完全控制主机系统,而 Guest OS 需要降级运行,从而不能执行特权操作。当 Guest OS 执行前面的特权汇编指令时,主机系统产生异常(General Protection Exception),执行控制权重新从 Guest OS 转到 VMM 手中。VMM 事先分配一个变量作为影子 CR3 寄存器给 Guest OS,将 pgtable 代表的客户机物理地址(Guest Physical Address)填入影子 CR3 寄存器,然后 VMM 还需要 pgtable 翻译成主机物理地址(Host Physical Address)并填入物理 CR3 寄存器,最后返回到 Guest OS中。随后 VMM 还将处理复杂的 Guest OS 缺页异常(Page Fault)。
  全虚拟化不需要更改 Guest OS,兼容性好。典型的代表有 Vmware WorkStation,ESX Server 早期版本,Microsoft Virtrual Server。
 
半虚拟化
  半虚拟化通过修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 直接交互。在半虚拟化虚拟机中,部分硬件接口以软件的形式提供给客户机操作系统,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供,所以也被称为超虚拟化。汇编table指令什么意思
  例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。
  依靠这些指令可以直接通过 Hypervisor 层调用硬件资源,从而免除了 Hypervisor 层转换指令的开销,由于不需要产生额外的异常和模拟部分硬件执行流程,半虚拟化可以大幅度提高性能,半虚拟化的典型代表有 Microsoft Hyper-V,Vmware 的 vSphere。