cpu运行级别:
ring0是指CPU的最高运行级别,ring1次之,ring2其次…… 拿Linux+x86来讲, 操做系统(内核)的代码运行在最高运行级别ring0上,可使用特权指令,控制中断、修改页表、访问设备等等。应用程序的代码运行在最低运行级别上ring3上,不能作受控操做。若是要作,好比要访问磁盘,写文件,那就要经过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成以后再从 ring0返回ring3。这个过程也称做用户态和内核态的切换。
那么,虚拟化在这里就遇到了一个难题,由于宿主操做系统是工做在ring0的,客户操做系统就不能也在ring0了,可是它不知道这一点,之前执行什么指令,如今仍是执行什么指令,那确定不行啊,没权限啊。因此这时候虚拟机管理程序(VMM)就要避免这件事情发生。 (VMM在ring0上,通常以驱动程序的形式体现,驱动程序都是工做在ring0上,不然驱动不了设备) 通常是这样作,客户操做系统执行特权指令时,会触发异常(CPU机制,没权限的指令,触发异常),而后VMM捕获这个异常,在异常里面作翻译,模拟,最后返 回到客户操做系统内,客户操做系统认为本身的特权指令工做正常,继续运行。可是这个性能损耗,就很是的大,你想一想原来,简单的一条指令,执行完便可,如今却要经过复杂的异常处理过程。
这时候半虚拟化就来了,半虚拟化的思想就是,让客户操做系统知道本身是在虚拟机上跑的,工做在非ring0状态,那么它原先在物理机上执行的一些特权指令,就会修改为其余方式,这种方式是能够和VMM约定好的,这就至关于,我经过修改代码把操做系统移植到一种新的架构上来,就是定制化。因此像XEN 这种半虚拟化技术,客户机操做系统都是有一个专门的定制内核版本,和x8六、mips、arm这些内核版本等价。这样以来,就不会有捕获异常、翻译、模拟 的过程了,性能损耗很是低。这就是XEN这种半虚拟化架构的优点。这也是为何XEN只支持虚拟化Linux,没法虚拟化windows缘由,微软是闭源的,不能够代码。
后来,CPU厂商,开始支持虚拟化了,状况又发生变化,拿X86 CPU来讲,引入了Intel-VT 技术,支持Intel-VT的CPU,有VMX root operation 和 VMX non-root operation两种模式,两种模式都支持Ring0~Ring3 这4个运行级别。这下好了,VMM能够运行在VMX root operation模式下,客户OS运行在VMX non-root operation模式下。也就说,硬件这层作了些区分,这样全虚拟化下,有些靠“捕获异常-翻译-模拟”的实现就不须要了。并且CPU厂商,支持虚拟化 的力度愈来愈大,靠硬件辅助的全虚拟化技术的性能逐渐逼近半虚拟化,再加上全虚拟化不须要修改客户操做系统这一优点,全虚拟化技术应该是将来的发展趋势。
XEN是最典型的半虚拟化,不过如今XEN也支持硬件辅助的全虚拟化,毕竟全虚拟化是大趋势。 KVM、VMware一直都是全虚拟化。windows