硬件辅助虚拟化属于系统虚拟化类别,其终的呈现方式是虚拟机,因此要了解硬件辅助虚拟化,我们首先需要做好前期的知识储备:什么是系统虚拟化,什么是虚拟机?
在x86运行模式中有一种可能一些老玩家还会有印象:虚拟8086模式(Virtual 8086 Mode),它是为了让一些老程序能够在保护模式下运行而提供的。大家在获得便利的同时可能忽略了一点,这其实就是x86给大家带来的虚拟化技术。其实系统虚拟化就是对计算机这个“抽象对象”的虚拟化,我们可以认为它的实现形式是在系统中加入一个虚拟化层,虚拟化层将下层的资源抽象成另一形式的资源,提供给上层系统使用。
虚拟化层直接加到了传统的计算机体系层次结构中,难道不会破坏原有的体系结构吗?其实虚拟化层从某种意义上说就像一个替代品,谁的替代品呢?硬件抽象层和API抽象层的替代品,它们只不过是在一定程度上取代了系统中原有硬件抽象层和API抽象层的部分功能,使得工作在这个代工的虚拟化层上面的客户机操作系统能够正常工作而已。
前面给大家讲解了虚拟化及计算机体系中抽象层的概念,当我们把虚拟化概念应用到计算机(具体的机器)上时,虚拟机的概念就出现了。虚拟机是指在一个硬件平台上模拟多个独立的、ISA结构和实际硬件相同的虚拟硬件系统,在每个虚拟硬件系统上都可以运行不同的操作系统(Guest OS),这些客户操作系统通过虚拟机监视器(VMM,后面会讲到其类型)访问实际的物理资源。1974年Popek和Goldberg在《Formal Requirements for Virtualizable Third Generation Architectures》一文是这样描述虚拟机的:“它可以看作是物理机的一种高效隔离的复制”。
虚拟机通过增加了一个新的软件层——虚拟机监控器(VMM)而使得其上运行的多个操作系统可以共享硬件资源
从图中我们可以看到计算机体系结构存在两个抽象层:硬件抽象层(HAL)和API抽象层。在计算机中,硬件抽象层(Hardware Abstraction Layer,HAL)是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,允许计算机操作系统在逻辑层而不是硬件层与硬件设备交互。调用程序不用了解硬件的具体设计细节,只需要给出抽象层所需的参数即可。这个抽象接口通常包括CPU的各种寄存器、内存管理模块和I/O端口等信息(需要注意的是,CPU、内存和I/O正是英特尔和AMD硬件辅助虚拟化技术中主要的三个方向)。
API抽象层抽象的是一个进程所能控制的系统功能的集合,包括创建新进程、内存申请和归还、进程间同步与共享、文件系统和网络操作等。虚拟化和计算机体系中的抽象层有着非常密切的关系,通常虚拟化技术就是对体系中的相关抽象层的模拟替代,让虚拟软件层上面的客户机操作系统产生一定的“错觉”,而平台虚拟化和应用程序虚拟化在一定程度上就是取代计算机体系中的硬件抽象层和API抽象层的工作。诸如硬件辅助虚拟化、ISA虚拟化其实都是属于硬件抽象层虚拟化范畴之内,而JVM之类的高级语言虚拟化则是API抽象层虚拟化的典范。