1. 可虚拟化架构和不可虚拟化架构

虚拟环境的组成

一般, 虚拟化环境三个部分构成: 硬件VMM虚拟机.

虚拟环境的组成:

1. 可虚拟化架构和不可虚拟化架构

如图. 在没有虚拟化时, 操作系统直接运行在硬件上, 管理着底层物理硬件, 构成一个完整的计算机系统, 即"物理机".

虚拟环境中,** 虚拟机监控器VMM抢占了操作系统的位置**, 变成真实物理硬件的管理者, 同时向上层软件呈现出虚拟的硬件平台, 欺骗上层操作系统. 而操作系统运行在虚拟平台上, 仍管理着它认为是"物理硬件"的虚拟硬件, 这就是图中的"虚拟机".

上面蕴含了三层含义(同质高效资源受控).

特权指令和敏感指令

先从指令开始着手介绍.

多数现代计算机体系结构都有两个或以上的特权级, 用来分隔系统软件和应用软件.

系统中一些操作和管理关键系统资源的指令会被定为特权指令, 这些指令只有在最高特权级上正确执行(!!!不是说只能在最高级别运行!!!). 在非最高特权级上, 特权指令会引发一个异常, 处理器会陷入最高特权级, 交给系统软件来处理.

不同的运行级上, 不仅指令的执行效果是不同的, 而且不是!!!所有特权指令都会发生异常(!!!). 例如一个x86平台的用户违反规范, 在用户态修改EFLAGS寄存器中断位, 这一修改不会产生任何效果, 也不会引起异常陷入, 而是会被硬件直接忽略.

在虚拟化里, 还有一类指令被称为敏感指令, 即操作特权资源的指令, 包括修改虚拟机的运行模式或下面物理机的状态; 读写敏感的寄存器或内存, 例如时钟或中断寄存器; 访问存储保护系统、内存系统或地址重定位系统以及所有的I/O指令.

显然, 所有特权指令!!!都是敏感指令!!!, 然而并不是所有敏感指令!!!都是特权指令!!!.

虚拟环境的简单实现

为VMM可以完全控制系统资源, 不允许直接执行客户机操作系统的敏感指令(!!!包括了特权指令和敏感指令!!!). 即, 敏感指令!!!必须在VMM的监控审查下进行!!!, 或经由VMM来完成.

如果一个系统上所有敏感指令都是特权指令!!!, 则能用一个很简单的方法实现一个虚拟环境: 将VMM运行在最高特权级, 客户机OS运行在非最高特权级上, 当客户机OS因执行敏感指令(此时, 也是特权指令)而陷入到VMM时, VMM模拟执行引起异常的敏感指令!!!, 这种方法叫"陷入再模拟".

虚拟化漏洞的产生

总之, 判断一个结构是否可以虚拟化, 其核心在于该结构对敏感指令的支持上. 如果在某些结构所有敏感指令都是特权指令!!!, 则它是可虚拟化的结构; 否则, 如果它无法支持在所有敏感指令!!!上触发异常, 则不是一个可虚拟化的结构, 我们称存在"虚拟化漏洞".

通过陷入再模拟敏感指令的方法是有前提条件的: 所有敏感指令必须都是特权指令. 否则, 要么系统的控制信息被虚拟机修改或访问, 要么VMM泄露需要模拟的操作, 影响虚拟化的正确性.

虚拟化漏洞的解决办法

所有指令解释执行. 最简单最直接的方法是, 如果所有虚拟化都采用模拟来实现(!!!), 例如解释执行, 就是取一条指令, 模拟出这条指令执行的效果, 再继续取下一条指令(!!!所有指令, 无论是否敏感指令!!!), 那么就不存在所谓陷入不陷入的问题, 从而避免了虚拟化漏洞. 这种方法不但能适用于模拟与物理机相同体系结构的虚拟机, 而且也能模拟不同体系结构的虚拟机. 这种方法保证了所有指令执行收到VMM的监管, 但它对每条指令不区别对待, 最大缺点是性能太差, 不符合虚拟机"高效"特点.

既要填补虚拟化漏洞, 又要保证虚拟化性能, 只能采取一些辅助手段.

硬件辅助手段. 直接在硬件层面填补虚拟化漏洞!!!,

软件辅助. 通过软件的方法避免虚拟机中使用无法陷入的敏感指令!!!.