3.1 CPU虚拟化

我们都知道,Intel的CPU设计有4个指令级别,分别是Ring0、Ring1、Ring2、Ring3,级别依次降低。级别越高,可执行特权命令自然越多。通常的操作系统(如Linux)使用两个级别:Ring0和Ring3。Ring0用于内核态,Ring3用于用户态,可以通过系统调用,从Ring3进入Ring0。例如,当用户态的程序执行I/O操作,这是内核才能操作的特权指令,程序会从用户态进入内核态。当读取完数据后,又会从内核态切回用户态运行。

在虚拟化环境中,需要为每个虚拟机操作系统提供单独的、隔离的CPU环境,通常有三种方案,分别是全虚拟化、半虚拟化和硬件辅助虚拟化。

全虚拟化就是全部由软件模拟的,通过二进制代码直接翻译,当执行敏感指令的时候,Hypervisor直接截获,模拟指令的执行,生成相应的结果,并返回。客户机操作系统不需要任何修改,它感知不到自己处于一个被模拟的环境中。这种纯软件模拟的方式,其效率并不高。如VMware Workstation、Oracle VirtualBox和QUME等,我们可以通过标准的ISO镜像安装操作系统,不需要定制操作系统。

半虚拟化和全虚拟化最大的区别在于要修改操作系统,让客户机操作系统知道自己运行在虚拟化环境,部分指令可以直接穿透操作系统,效率更高。最著名的半虚拟化就是Xen。

通过软件模拟的虚拟化需要将Hypervisor运行在CPU的Ring0,将客户机的操作系统(内核)运行在Ring1,客户机的程序还是运行在Ring3上。当客户机的程序执行系统调用或获取来自硬件中断的时候,首先会被Hypervisor截获,并发送到虚拟机操作系统执行。如果是虚拟机操作系统执行特权指令,将会通过Hypervisor提供的模拟器,模拟指令执行并返回。CPU虚拟化流程如图3-2所示。

图3-2 CPU虚拟化流程

通过软件模拟的虚拟化的优点是可以基于现有的硬件节省成本的,但软件模拟的方式存在很多问题,尤其是效率问题,所有指令都需要转化,使系统响应变慢。所以,当前数据中心最常用的是硬件辅助虚拟化,顾名思义,它是需要硬件支持的,Intel的VTX核、AMD的AMD-V都支持。它有两种模式,分别是根模式和非根模式。相应的Hypervisor运行在根模式下,而客户机操作系统运行在非根模式下。应用程序执行系统调用的时候,将进入非根模式Ring0,当虚拟机执行特权指令的时候会进入根模式,如图3-3所示。

图3-3 根模式和非根模式示意图

当前常见的硬件辅助虚拟化主要包括VMware的ESXi、KVM,以及微软的Hyper-V。其中,ESXi和Hyper-V都是商业软件,热门的开源软件当属KVM。