全虚拟化和半虚拟化的区别 cpu的ring0 ring1又是什么概念?

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也支持硬件辅助的全虚拟化,大趋势,拗不过啊。。。 
KVM、VMARE这些一直都是全虚拟化。

转载自网络

原文地址:https://www.cnblogs.com/pipci/p/12241698.html

时间: 2024-10-27 19:13:44

全虚拟化和半虚拟化的区别 cpu的ring0 ring1又是什么概念?的相关文章

全虚拟化和半虚拟化的区别 cpu的ring0~ring3又是什么概念?

ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之-- 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断.修改页表.访问设备等等. 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作.如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问

全虚拟化和半虚拟化的区别

cpu运行级别:ring0是指CPU的最高运行级别,ring1次之,ring2其次-- 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断.修改页表.访问设备等等.应用程序的代码运行在最低运行级别上ring3上,不能做受控操作.如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成

全虚拟化和半虚拟化(转)

CPU通过Ring级别进行访问控制的.Ring0是最高级别,Ring1.Ring2.Ring依次降低. 以Linux X86为例,操作系统(内核)的代码运行在Ring0上,可以使用特权指令,控制中断.修改页表.访问控制等. 应用程序的代码运行在最低级别Ring3上,不能做受控操作.如果需要访问磁盘.写文件,需要通过执行系统调用(函数),执行系统调用时,CPU的运行级别从Ring3到Ring0依次切换,并跳转到系统调用对应的内核代码位置执行,由内核完成设备访问,之后再从Ring0返回Ring3,实

全虚拟化与半虚拟化

原文:http://blog.csdn.net/jmilk/article/details/51824935 全虚拟化 不需要对GuestOS操作系统软件的源代码做任何的修改,就可以运行在这样的VMM中 在全虚拟化的虚拟平台中,GuestOS并不知道自己是一台虚拟机,它会认为自己就是运行在计算机物理硬件设备上的HostOS.因为全虚拟化的VMM会将一个OS所能够操作的CPU.内存.外设等物理设备逻辑抽象成为虚拟CPU.虚拟内存.虚拟外设等虚拟设备后,再交由GuestOS来操作使用.这样的Gues

半虚拟化和全虚拟化的区别

全虚拟化(Full virtualization), 也称为原始虚拟化技术, 是另一种虚拟化方法. 该模型使用虚拟机协调客户操作系统和原始硬件(见图2). 这里"协调"是一个关键词, 因为VMM在客户操作系统和裸硬件之间用于工作协调. 一些受保护的指令必须由Hypervisor(虚拟机管理程序)来捕获和处理. 因为操作系统是通过Hypervisor来分享底层硬件. 图2. 全虚拟化: 使用Hypervisor分享底层硬件 全虚拟化的运行速度要快于硬件模拟, 但是性能方面不如裸机, 因为

纯软件半虚拟化

虚拟化是一块"肥肉",思杰公司也想分一杯羹,于2003年推出了XEN虚拟化解决方案,它采用的解决方案与vmware公司的虚拟化有些不同,但是vmware公司已经占据了市场的制高点,成了虚拟化市场的霸主.我们下面来看一下,思杰公司是如何解决X86架构CPU的缺陷的,这里的缺陷就是指的是敏感指令并不全是特权指令.hypercall超级调用思杰公司采用hypercall的技术解决部门敏感指令不能被捕捉的问题.他们的思路有点像<×××帝国>的"莫费斯",他告诉了

制作Xen虚拟机半虚拟化和全虚拟化镜像

安装时候已经包含虚拟化,所以启动系统后已经是带xen的内核,已经安装好xen相关软件. xen虚拟机的存储有多种方式,根据官方手册上说的有files,lvm,nfs等.我选择了files作为xen虚拟机的存储,因为这样比较简单,当然会有弱点,后面会说到. 先说如何实现半虚拟化: 检查cpu的指令集是否包含pae,这个应该不成问题,我小黑的cpu是T2370都支持. 1.先dd出一个img文件作为虚拟机的安装空间 dd if=/dev/zero of=/xen/image/xen1.img bs=

CPU纯软件半虚拟化技术

在2003年出现的Xen,使用了另外的一种半虚拟化的方案来解决x86架构下CPU的敏感指令问题.主要采用Hypercall技术.Guest OS的部分代码被改变,从而使Guest OS会将和特权指令相关的操作都转换为发给VMM的Hypercall(超级调用),由VMM继续进行处理.而Hypercall支持的批处理和异步这两种优化方式,使得通过Hypercall能得到近似于物理机的速度. 1.Hypercall技术 对于x86体系结构CPU,Xen使用超级调用来替换被监控的操作,其中包括x86架构

Qemu模拟IO和半虚拟化Virtio的区别以及I/O半虚拟化驱动介绍

QEMU的基本原理和优缺点 基本原理: 使用QEMU模拟I/O的情况下,当客户机中的设备驱动程序(device driver)发起I/O操作请求之时,KVM模块中的I/O操作捕获代码会拦截这次I/O请求,然后经过处理后将本次I/O请求的信息存放到I/O共享页,并通知用户控件的QEMU程序.QEMU模拟程序获得I/O操作的具体信息之后,交由硬件模拟代码来模拟出本次的I/O操作,完成之后,将结果放回到I/O共享页,并通知KVM模块中的I/O操作捕获代码.最后,由KVM模块中的捕获代码读取I/O共享页