首页 > 代码库 > CPU虚拟化

CPU虚拟化

1. 为什么需要 CPU 虚拟化

X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机硬件。x86 架构提供四个特权级别给操作系统和应用程序来访问硬件。  Ring 是指 CPU 的运行级别,Ring 0是最高级别,Ring1次之,Ring2更次之…… 就 Linux+x86 来说, 

  • 操作系统(内核)需要直接访问硬件和内存,因此它的代码需要运行在最高运行级别  Ring0上,这样它可以使用特权指令,控制中断、修改页表、访问设备等等。 
  • 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作。如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作用户态和内核态的切换。

 技术分享

那么, 虚拟化在这里就遇到了一个难题 ,因为宿主操作系统是工作在 ring0 的,客户操作系统就不能也在 ring0 了,但是它不知道这一点,以前执行什么指令,现在还是执行什么指令,但是没有执行权限是会出错的。所以这时候虚拟机管理程序(VMM)需要避免这件事情发生。 虚机怎么通过 VMM 实现 Guest CPU 对硬件的访问,根据其原理不同有三种实现技术:

1. 全虚拟化

2. 半虚拟化

3. 硬件辅助的虚拟化

 

1.1 基于二进制翻译的全虚拟化(Full Virtualization with Binary Translation)

技术分享

客户操作系统运行在 Ring 1,它在执行特权指令时,会触发异常(CPU的机制,没权限的指令会触发异常),然后 VMM 捕获这个异常,在异常里面做翻译,模拟,最后返回到客户操作系统内,客户操作系统认为自己的特权指令工作正常,继续运行。但是这个性能损耗,就非常的大,简单的一条指令,执行完,了事,现在却要通过复杂的异常处理过程。

 

异常 “捕获(trap)-翻译(handle)-模拟(emulate)” 过程:

技术分享

 

1.2. 超虚拟化(或者半虚拟化/操作系统辅助虚拟化 Paravirtualization)

半虚拟化的思想就是, 修改操作系统内核,替换掉不能虚拟化的指令, 通过超级调用(hypercall )直接和底层的虚拟化层hypervisor 来通讯 ,hypervisor  同时也提供了超级调用接口来满足其他关键内核操作,比如内存管理、中断和时间保持。

  这种做法省去了全虚拟化中的捕获和模拟,大大提高了效率。所以像XEN这种半虚拟化技术,客户机操作系统都是有一个专门的定制内核版本,和x86、mips、arm这些内核版本等价。这样以来,就不会有捕获异常、翻译、模拟的过程了,性能损耗非常低。这就是XEN这种半虚拟化架构的优势。这也是为什么XEN只支持虚拟化Linux,无法虚拟化windows原因,微软不改代码啊。

技术分享

 

1.3. 硬件辅助的全虚拟化

2005年后,CPU厂商Intel 和 AMD 开始支持虚拟化了。 Intel 引入了 Intel-VT (Virtualization Technology)技术。 这种 CPU,有 VMX root operation 和 VMX non-root operation两种模式,两种模式都支持Ring 0 ~ Ring 3 共 4 个运行级别。这样,VMM 可以运行在 VMX root operation模式下,客户OS运行在VMX non-root operation模式下。

技术分享

 

而且两种操作模式可以互相转换。运行在 VMX root operation 模式下的 VMM 通过显式调用 VMLAUNCH 或 VMRESUME 指令切换到 VMX non-root operation 模式,硬件自动加载 Guest OS 的上下文,于是 Guest OS 获得运行,这种转换称为 VM entry。Guest OS 运行过程中遇到需要 VMM 处理的事件,例如外部中断或缺页异常,或者主动调用 VMCALL 指令调用 VMM 的服务的时候(与系统调用类似),硬件自动挂起 Guest OS,切换到 VMX root operation 模式,恢复 VMM 的运行,这种转换称为 VM exit。VMX root operation 模式下软件的行为与在没有 VT-x 技术的处理器上的行为基本一致;而VMX non-root operation 模式则有很大不同,最主要的区别是此时运行某些指令或遇到某些事件时,发生 VM exit。

也就说,硬件这层就做了些区分,这样全虚拟化下,那些靠“捕获异常-翻译-模拟”的实现就不需要了。而且CPU厂商,支持虚拟化的力度越来越大,靠硬件辅助的全虚拟化技术的性能逐渐逼近半虚拟化,再加上全虚拟化不需要修改客户操作系统这一优势,全虚拟化技术应该是未来的发展趋势。

       

利用二进制翻译 的全虚拟化

硬件辅助虚拟化       

操作系统协助 / 半虚拟化

实现技术       
BT         和直接执行      

遇到特权指令转到root 模式执行

Hypercall       

客户操作系统修改 / 兼容性

无需修改客户操作系统,最佳兼容性

无需修改客户操作系统,最佳兼容性

客户操作系统需要修改来支持hypercall ,因此它不能运行在物理硬件本身或其他的hypervisor上 ,兼容性差,不支持Windows

性能       
差      

全虚拟化下,CPU需要在两种模式之间切换,带来性能开销;但是,其性能在逐渐逼近半虚拟化。

好。半虚拟化下CPU性能开销几乎为0,虚机的性能接近于物理机。

应用厂商       

VMware Workstation/QEMU/Virtual PC

VMware ESXi/Microsoft Hyper-V/Xen 3.0/KVM

        Xen

CPU虚拟化