全虚拟化和半虚拟化的区别cpu的ring0ring1⼜是什么概念?-转ring0是指CPU的运⾏级别,ring0是最⾼级别,ring1次之,ring2更次之……
拿Linux+x86来说,
操作系统(内核)的代码运⾏在最⾼运⾏级别ring0上,可以使⽤特权指令,控制中断、修改页表、访问设备等等。
应⽤程序的代码运⾏在最低运⾏级别上ring3上,不能做受控操作。如果要做,⽐如要访问磁盘,写⽂件,那就要通过执⾏系统调⽤(函数),执⾏系统调⽤的时候,CPU的运⾏级别会发⽣从ring3到ring0的切换,并跳转到系统调⽤对应的内核代码位置执⾏,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作⽤户态和内核态的切换。
那么,虚拟化在这⾥就遇到了⼀个难题,因为宿主操作系统是⼯作在ring0的,客户操作系统就不能也在ring0了,但是它不知道这⼀点,以前执⾏什么指令,现在还是执⾏什么指令,那肯定不⾏啊,没权限啊,玩不转啊。所以这时候虚拟机管理程序(VMM)就要避免这件事情发⽣。
(VMM在ring0上,⼀般以驱动程序的形式体现,驱动程序都是⼯作在ring0上,否则驱动不了设备)
⼀般是这样做,客户操作系统执⾏特权指令时,会触发异常(CPU机制,没权限的指令,触发异常),
然后VMM捕获这个异常,在异常⾥⾯做翻译,模拟,最后返回到客户操作系统内,客户操作系统认为⾃⼰的特权指令⼯作正常,继续运⾏。但是这个性能损耗,就⾮常的⼤,你想想原来,简单的⼀条指令,执⾏完,了事,现在却要通过复杂的异常处理过程。
这时候半虚拟化就来了,半虚拟化的思想就是,让客户操作系统知道⾃⼰是在虚拟机上跑的,⼯作在⾮ring0状态,那么它原先在物理机上执⾏的⼀些特权指令,就会修改成其他⽅式,这种⽅式是可以和VMM约定好的,这就相当于,我通过修改代码把操作系统移植到⼀种新的架构上来,就是定制化。所以像XEN这种半虚拟化技术,客户机操作系统都是有⼀个专门的定制内核版本,和x86、mips、arm这些内核版本等价。这样以来,就不会有捕获异常、翻译、模拟的过程了,性能损耗⾮常低。这就是XEN这种半虚拟化架构的优势。这也是为什么XEN只⽀持虚拟化Linux,⽆法虚拟化windows原因,微软不改代码啊。
可以后来,CPU⼚商,开始⽀持虚拟化了,情况有发⽣变化,拿X86 CPU来说,引⼊了Intel-VT 技术,⽀持Intel-VT 的CPU,有VMX root operation 和 VMX non-root operation两种模式,两种模式都⽀持Ring 0 ~ Ring 3 这 4 个运⾏级别。这下好了,VMM可以运⾏在VMX root operation模式下,客户OS运⾏在VMX non-root operation模式下。也就说,硬件这层做了些区分,这样全虚拟化下,有些靠“捕获异常-翻译-模拟”的实现就不需要了。⽽且CPU⼚商,⽀持虚拟化的⼒度越来越⼤,靠硬件辅助的全虚拟化技术的性能逐渐逼近半虚拟化,再加上全虚拟化不需要修改客户操作系统这⼀优势,全虚
拟化技术应该是未来的发展趋势。
XEN是最典型的半虚拟化,不过现在XEN也⽀持硬件辅助的全虚拟化,⼤趋势,拗不过啊。。。
x86架构和arm架构区别KVM、VMARE这些⼀直都是全虚拟化。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论