研究生入学的时候,看了一篇论文——《Xen and the art of virtualization》。现在时隔一年,准备对此进行一番整理。下文是我Xen为例的半虚拟化技术的理解:
虚拟机概况
首先从虚拟机说起,虚拟机技术最早由IBM于上世纪六七十年代提出,被定义为硬件设备的软件模拟实现。在那个年代,计算机的硬件成本相当大,为了能够提高计算机的利用率,于是提出了这样一种技术:将一台机器通过软件虚拟成多台机器从而为不同的应用提供服务。如今虚拟机技术应用广泛,可租用的服务器都是使用了不同方案的虚拟化技术。
我们通常提到的虚拟机都是系统虚拟机,如IBM VM/370、VMware ESX Server、Xen。系统虚拟机在二进制指令集系统结构(ISA)的层次上提供一个完整的系统级环境。因此,用户会觉得自己在使用整个计算机。一台运行多个虚拟机的计算机可以支持多个不同的操作系统。在一个传统的平台上,一个单独的操作系统拥有所有的硬件资源,但是通过使用虚拟机,多个操作系统共享硬件资源。
虚拟机简介
下图是典型的虚拟机层次结构。它比传统的平台多了一个虚拟机监视器(Virtual Machine Monitor),虚拟机监视器VMM处于硬件和虚拟机层之间。虚拟机监视器VMM负责Host和Guest之间的通信。在虚拟机系统中,对于上层应用,虚拟机就是真实的计算机。
虚拟化分类
虚拟化技术可以分为完全虚拟化、半虚拟化。
- 完全虚拟化
- 半虚拟化
起初是为了解决x86体系结构上完全虚拟化的困难,它需要修改OS,工作效率相对完全虚拟化要高很多。典型的有Xen、KVM-PowerPC。
半虚拟化技术产生的原因
x86体系是导致半虚拟化技术产生的重要原因。因为x86指令系统中存在部分敏感指令不是特权指令。什么意思呢?下面来从特权指令和敏感指令的角度进行解释:
- 特权指令
特权指令是一些操作和管理关键系统资源的指令,这些指令只有在最高特权级上才能够运行。如果在非最高特权级上运行,特权指令会引发一个异常,处理器会陷入到最高特权级,然后由系统软件处理。但是并不是所有的特权指令都会引发异常(x86指令系统中的特权指令会有这种问题),最关键的是这些特权指令在不同的特权级上运行的结果会不一样,甚至可能会被直接忽略。
- 敏感指令
传统的机器只有特权指令和普通指令两种概念,而在有虚拟化的机器上则还有一个独特的概念:敏感指令。敏感指令是指在虚拟化时必须要在最高特权级运行的指令。在RISC体系中,所有的特权指令都是敏感指令,因此可以支持完全虚拟化。但是在x86体系的虚拟化中,部分敏感指令并不是特权指令,那么这些非特权指令的敏感指令在系统运行过程中就不会引发异常,也就无法被捕获并在最高特权级执行。而这些敏感指令在非最高特权级下运行和在最高特权级下运行会有不同的结果,这对于一个要求性能可靠的计算机不能绝对容忍的。因此,半虚拟化技术,以Xen为先例,主要解决的就是这个问题——如何捕获非特权指令的敏感指令。