接前一篇文章:
本文内容参考:
《 QEMU /KVM》源码解析与应用 —— 李强,机械工业出版社
《深度探索 Linux 系统虚拟化原理与实现》—— 王柏生 谢广军, 机械工业出版社
特此致谢!
二、x86架构CPU虚拟化
本系列前边几篇文章介绍了CPU虚拟化,包括VMX架构以及VMCS相关内容的讲解。本回来看一下x86架构CPU的虚拟化。
Gerald J.Popek和Robert P.Goldberg在1974年发表的论文《Formal Requirements for Virtualizable Third Generation Architectures》中提出了虚拟化的三个条件:
(1)等价性
即VMM需要在宿主机上位 虚拟机 模拟出一个本质上与物理机一致的环境。虚拟机在此环境下运行与其在物理机上运行别无二致,除了可能因为资源竞争或者VMM的干预导致在虚拟环境中表现略有差异。比如虚拟机的IO、网络等因宿主机的限速或者多个虚拟机共享资源,导致速度可能要比独占物理机时慢一些。
(2)高效性
即虚拟机指令执行的性能与其在 物理机 上运行时的性能相比并无明显损耗。该标准要求虚拟机中的绝大部分指令无须VMM干预而直接运行在物理CPU上。比如,在x86架构上通过 Qemu 运行的ARM并不是虚拟化、而是模拟。
(3)资源控制
即VMM可以完全控制系统资源。由VMM控制协调宿主机资源给各个虚拟机,而不能由虚拟机控制宿主机的资源。
1. 陷入和模拟模型
为了满足Gerald J.Popek和Robert P.Goldberg提出的虚拟化三条件,一个典型的解决方案是陷入和模拟(Trap and Emulate)模型。
一般来说,处理器分为两种运行模式:系统模式和用户模式。相应地,CPU指令也分为特权指令和非特权指令。特权指令只能在系统模式运行,如果在用户模式运行就会触发处理器异常。操作系统允许内核运行在系统模式,因为内核需要管理系统资源,需要运行特权指令;而普通的用户程序则运行在用户模式。
在陷入和模拟模型下,虚拟机的用户程序仍然运行在用户模式,但是虚拟机的内核也将运行在用户模式,这种方式成为特权级压缩(Ring Compression )。实际上,之前文章已经提到了这个问题,如下所示:
在特权级压缩方式下,虚拟机中的非特权指令直接运行在处理器上,满足了虚拟化标准中高效的要求,即大部分指令无须VMM干预、直接在处理器上运行。然而,当虚拟机执行特权指令时,因为是在用户模式下运行,将触发处理器异常,从而陷入到VMM中,由VMM代理虚拟机完成系统资源的访问,即所谓的模拟(emulate)。如此(此种机制下),又满足了虚拟机标准中VMM控制系统资源的要求,虚拟机将不会因为可以直接运行特权指令而修改宿主机的资源,从而破坏宿主机的环境。
更多内容请看下回。