导读:指令集的执行控制
虚拟化技术简介——XEN
虚拟化技术从概念上非常类似于仿真,一个系统假扮成两个或多个相同的系统。大多数现代操作系统都包含一个简单的虚拟化系统,每一个正在运行的进程都认为自己是系统唯一运行的进程,这是因为CPU和内存被虚拟化了。大家每天都在使用着某种形式的虚拟化。
CPU的虚拟化
CPU虚拟化从某种程度看来是非常简单的,当进程A正在占用CPU计算,另一个进程B需要使用CPU的时候,B就对CPU发出中断申请,CPU保存进程A的运行状态数据,中断CPU运行,进程B开始使用CPU计算。 过了一段时间进程B保存运行状态数据,中断,进程A继续占用CPU计算。
虚拟CPU和物理CPU是不一样的,当操作系统正在运行、交换的时候,CPU处在特权级模式(privileged mode).此时系统允许某些特定的执行。如直接通过物理地址访问内存(这个操作系统通常是不允许的)
CPU的指令划分为3类:
1.特权级指令:指的是那些可能运行在特权级模式,但是一旦退出特权级模式之后将发生陷入指令。
2.控制敏感指令:指的是那些尝试着改变系统资源配置的指令。
3.行为敏感指令:指的是那些根据资源配置不同有不同的表现行的指令,包括所有对虚拟地址的load和store操作的指令。
为什么要虚拟化?
虚拟化技术的根本目的和多任务操作系统的目的是一样的,即计算机拥有不止能满足一个任务需要的处理能力。
虚拟化的优点:
1.虚拟机可以以非常低的开销进行克隆
2.虚拟化技术的另一个巨大优势就是可移植性。
3.能源开销非常低也是虚拟化技术的一个吸引人之处。
4.一台虚拟机要比一台物理机器更容易携带。
5.相对于一个操作系统上运行的进程来说,一台虚拟机提供了更深层次的隔离。
历史上第一台完全支持虚拟化的机器是IBM的VM,它作为IBM360项目的一部分而诞生。
X86架构虚拟化解决方案:
一、二进制翻译
是一个解决X86架构虚拟化问题的方法,它通过VMWare而普及。该方法有一个显著的优点:他允许绝大多数的虚拟化环境运行在 用户空间,但也因此造成了性能的损失。二进制翻译需要虚拟化环境扫描指令流并将特权级指令标识出来, 然后这些指令所进行的操作由他们的仿真指令来完成。这个方法在性能表现欠佳,特别是做任何同I/O操作的先关的频繁操作时, 对不安全指令的位置的快速缓存能够带来一些性能加速,但是也会带来内存的一些开销。
以一个操作系统的视角来看,两者最大的不同是:在Xen系统中,操作系统运行在Ring 1级上,而真实的X86系统中,操作系统是直接运行在Ring 0上,详细介绍请见我关于CPU特权环的介绍在Xen系统中,guest OS 不能执行任何特权级指令,为了提供相似的功能,hypervisor提供了一整套hypercall(高级调用)来完成相关的功能。
Xen和Linux一样使用的是MS-DOS的系统调用机制,而并没有采用想FreeBSD使用的UNIX调用机制。这就表示hypercall的参数都保存在寄存器中,而不是保存在堆栈中。
硬件辅助虚拟化
AMD虚拟化技术称之为AMD-V
AMD-V技术为hypervisor提供两种方法解决内存分割问题。第一种模式是 “影子页表”guest OS 无论什么时间尝试修改自身的页表,该模式都会允许hypervisor发生陷入;
第二种模式是“嵌套页表” 嵌套页表所做的工作就像它的名字那样,他在虚拟内存中又增加了一个间接层。MMU像操作系统定义的那样解决了虚拟地址到物理地址的转换,现在通过hypervisor定义的另一套页表,这些物理地址讲过被
转换成为真实的物理地址。应为这个转换过程是在硬件条件下的完成的,所以他和通常的虚拟地址查询一样快。
Intel虚拟化技术称之为IVT(Intel Virtualization Technology)
IVT给处理器添加了一个新的模式,叫做VMX。hypervisor能够运行正在VMX模式下,并对运行在Ring 0上层的操作系统透明。当CPU运行在VMX模式下,以一个为修改的操作系统视角来看没有任何区别,
以guest OS 的视角来看,所有的指令照旧做他们应该做的事情,并且只要hypervisor正确无误的执行仿真操作,那么系统就不会出现错误。在某些情况下,硬件虚拟化要比软件虚拟化快的多。
Xen的理念
方案和机制分离-一个好的系统设计的关键性思想是方案和机制的分离。
Xen自身不支持任何外部设备。Xen仅仅是提供了一个让guest OS 直接访问物理设备的机制。这样guest OS可以使用一个已经存在的设备驱动程序。。当然为了
是多个guest OS 都可以访问设备,Xen在这里设置了一个机制。授权表接口允许开发者将内容页的访问授权给其他的guest OS。
做的越少越好
Xen每一个新的发布版本都尝试着比前一个版本的Xen做的更少,这样做的原因是Xen运行在一个非常高的特殊级别上-甚至比操作系统的运行级别还要高;一旦出现一个bug
就会是毁灭性的。就像前段时间发现Xen的bug,影响的非常广泛的云服务厂商,造成部分云服务主机必须要冷重启才能完成bug的修复,应为Xen是非常底层的,对业务造成了一定的影响。
Xen的系统结构
Hypervisor,内核,应用进程之间的关系
对于在Xen上运行的内核来说,最大的变化是离开的Ring 0的运行级。具体转移到哪个Ring级,根据平台的不同而不同,在IA32系统中,内核转移到了Ring1 。如图
当AMD将IA32架构同X86-64位架构结合在一起时,它所做的事就是减少Ring级别,在没有Ring1 和Ring2的系统中,不得不通过修改Xen使得操系统运行在Ring3级上。如图
Domain 0的角色
Hypervisor的职责就是允许guest OS的运行。Xen在一个称为Domain的环境下运行 guest OS ,它包含了一个完整的虚拟运行环境。当Xen启动时他做的第一件事就是装载Domain 的guest OS内核。
该内核作为一个模块在启动装载单元中被代表性的指定,因此它可以在没有任何文件系统驱动程序的情况下被加载。
Domain 0是第一个运行的guest OS,并且具有更高的特权级。相应地,其他Domain被称之为 domain U(dom U)-U 代表的意思是非特权级(unprivileged)然而,当前已经可以将dom 0的一些职责叫给dom U guest OS,这样做将使得两者之间的界限变的模糊。Xen本身不包含任何的设备驱动和用户接口。这些工作都是操作系统及运行在Dom0 之上的用户空间的工具来提供的。
Dom0 guest OS 最重要的一个任务就是处理外设。因此它比其他的guest OS具有更高的特权级,所以可以访问硬件。
任何驱动都有3个主键:
分块设备驱动;多路复用器;真实的驱动
非特权Domain对于domain U 有着更多的限制,它通常不被允许执行任何能够直接访问硬件的hypercall,虽然某些情况下他被允许访问一个或更多的设备。
应为不能直接访问硬件,所以dom U 实现了一些设备驱动的前端,在最低限度下,需要Xenstore来控制好设备驱动,
出处:http://blog.csdn.net/afxcontrolbars/article/details/46274597