读书笔记----xen虚拟化 2

来源:互联网 发布:璟璞网络瑾萱 编辑:程序博客网 时间:2024/06/05 16:38

cup切换进程的时候,cpu是运行在特权级别,这允许它有一些特殊的操作,譬如用物理地址直接访问内存,而这在通常是不被允许的。为了让cpu达到真正的全部虚拟化,有一个人提出了一个概念,他开始把指令分为三种类型。

1,特权指令。

2,控制指令,用于改变系统种的资源配置,譬如转换虚拟地址到物理地址,与设备通信,操作全局控制寄存器。

3,表现指令,随着资源配置的不同而表现出不同的效果,如在虚拟地址上进行存储和加载指令。


首先,计算机硬件为直接运行在起上的软件(操作系统)提供的接口是一组指令集合ISA,不同的处理器硬件提供的接口不经相同。例如Iterl奔腾的接口就是著名的x86指令集合,它基于CISC,而IBM公司生产的power系列就是基于RISC。理论上,如果操作系统希望在一个特定的硬件上运行,就必须遵守和使用该硬件提供的指令集合。


再次,为了方便上层程序的开发,一个完善的操作系统往往会提供一组程序开发库(lib),这些库为应用程序的编写提供了大量的应用变成接口(API)。如c库。


而程序库在和操作系统交互时候,是用的系统调用。





虚拟化技术采用的抽象层次可以在图1-1所示的几个层中自由选取。而实际上,选择的多样性,就决定了虚拟化技术的多样性。然而,虚拟化技术的实质是一样的:将底层的资源进行分区,并向上层提供特定的和多样化的执行环境。


虚拟机VM是指在一个硬件平台上模拟多个独立的、ISA结构和实际硬件相同的虚拟硬件系统,在每个虚拟硬件系统上都可已运行不同的OS,这些OS通过虚拟机监视器VMM访问实际的物理资源。





混合模式集合在结构上与独立监控模式类似,VMM直接运行在裸机上,具有最高的特权及,起上运行VM,区别在于:混合模式中的MM相对小很多,它只是负责向GuestOS提供一部分基本的寻及服务,例如CPU和内存等,而把I/O设备的虚拟交给了一个特权VM来执行。由于充分利用了原来操作系统的设备驱动,VMM本身并不含有设备的驱动。xen所采用的就是混合模式。





VMM对机器硬件资源的虚拟化过程中,CPU虚拟被认为是最为重要的一个环节。只有在保证各个虚拟机的指令能够被正确执行,各个虚拟机之间不相互影响,及指令的执行结果补钙变其他虚拟机状态的情况下,才能保证整个虚拟机环境的正确和有效。

cpu虚拟化是为每个虚拟机提供一个或多个虚拟cpuvcpu。多个vcpu分时复用物理cpu,任意时刻一个物理cpu只能被vcpu使用。


虚拟化场景下,要求将GuestOS内核的特权解除,从原来的0降低到1或者3。这部分特权指令在GusetOS中发生的时候,就会产生Trap,被VMM捕获,从而由VMM完成。这就是虚拟的本质方法,特权解除和陷入模拟。

不会触发异常的特权指令也是敏感指令,也即,敏感指令范围更大,有些敏感指令不能触发异常,这是x86设计的原因。


在引入虚拟化后,位于虚拟机内的GuestOS就不再处于CPU最高级别状态下。因此,原本需要在最高级别状态下执行的指令就不能够直接执行,而是需要交给由VMM处理后在执行。这部分指令称为敏感指令,及当执行这些指令时候,都会产生Trap,并被VMM捕获,交由VMM模拟执行。这些敏感指令主要包括如下指令:

1,企图访问或修改虚拟机模拟或机器状态的指令

2,其他访问或修改敏感寄存器或存储单元,如时钟寄存器,终端。

3,所有的IO指令。

在一般情况下,如果不处于特权级别,执行特权指令会trap,这时候就可以被VMM捕获。

VMM要捕获所有的敏感指令。如果指令集合支持虚拟化就必须满足所有的敏感指令都是特权指令这一要求,即当GuestOS运行在非特权级别时候,GuestOS执行任意敏感指令都trap,这会被VMM捕获而将控制权转给VMM上,从而保证了虚拟机环境的等价性和资源的可控性。


遗憾的是x86架构并不满足这个田间,某些敏感指令不属于特权指令,因此在执行这些敏感指令时候,并不会自动的产生Trap而被VMM所捕获。这种敏感而非特权指令的指令称为临界指令,这类临界指令在x86种有17个之多,主要包括敏感寄存器指令和保护系统指令。

1,敏感寄存器指令,SGDTSIDTSLDT

分别存储全局描述符寄存器的值到一个6B的存储单元,中断描述副寄存器值到6B的存储单元,本地描述副寄存器的值到一个16位或32的寄存器种或存储单元中。


尽管SGDTSIDTSLDT指令只能被操作系统使用,但是并没由设为特权指令。印尼次处于级别较低的GuestOS执行这些指令能够成功,并获得相应的寄存器的值,且不会trapvmm捕获。但是,由于硬件平台种相应的真实的GDTRIDTRLDTR都只有一个,因为位于不同的虚拟机种的GurestOS所获得的值只能是同一个,这显然是不正确的。因此VMM应该为每个GuestOS配备一套虚拟的GDTRIDTR,和LDTR,以便GuestOS访问这些寄存器的操作能够被VMM捕获,并重新访问相应的虚拟寄存器。



下面介绍了xen解决x86cpu虚拟和内存虚拟的方案。

1cpu虚拟:超级调用

将问题的重心由VMM移动到产生问题的GuestOS自身,通过主动方式由GuestOS来处理这些指令,而不是被动地交由VMM来处理,在这种设计理念下,修改GuestOS内核成了必然选择。

首先是要处理临界指令的问题,然后是处理特权指令的问题。

在运行在特权级别1GuestOS的一部分,将起没有权限执行的指令交由运行在特权级别0VMM代理执行,这在很大程度上与传统操作系统种的系统调用是类似:系统调用的作用就是将应用程序无权执行的程序交由操作系统代理执行。因此xenGuestOS提供的一系列“系统调用”,以方便GuestOS调用。这部分“系统调用”就是超级调用。


超级调用不仅在设计理念上与系统调用类似,在实现上两者也是及其相似的。。例如,系统调用使用INT80作为系统调用指令,而超级调用使用INT82.在发送系统调用是,通过寄存器EAX传递系统调用号以区分不同的系统调用。而超级调用同样采用EAX来传递第一关类别参数,以区分不同类别的超级调用。


如果说能够修改guestOS的内核是半虚拟化的核心,那么超级调用和事件通道则构成了半虚拟化的基础。

2,内存虚拟之:分段保护。

GuestOSxen申请超级调用时候,处理使用EAX传递超级调用号外,还会用到EBXECX等寄存器传递参数。通常情况下,寄存器种保存的都是一个参数结构提的指针,因此xen在处理超级调用参数时候需要访问GuestOS所在地址空间的内存页面。一般的解决办法是完成上下文切换后将需要的内存页因设到xen所在的内存空间。但是频繁地在xenGuestos见进行切换和内存映射会使系统性能收到很大的印象。


因此,将xenGuestos地地址合并就成为十分有效的解决方式。由于在同一个地址空间,xen执行超级调用时候不必进行上下文的切换,而且也充分发挥了xen的最高特权的优势,使得xen不需要巾帼内存映射就能直接访问GuestOS的内存页面。


3,机制和策略的分离

xen系统的VMM采用的是混合模式,存在一个经过授权的特权VM系住VMM参与管理,因此,由xen来完成机制的指定,而将策略的具体实现留到特权VM去负责的设计模式就成为了最可行的方案。



4,精简的VMM

尽可能专注基本机制的制定,而将具体的食物交由Dom0去管理。例如,网络分发是Xen1.0的一个部分,但大多数GuestOS都提供了更具灵活性的网络桥接技术,因此,后来,xen就将网络功能屈辱到了Dom0,利用操作系统原有的技术,减少了VMM的代码。



2.1.2虚拟域

相对于Dom0来说,DomU受到了许多限制,首当其冲的就是对硬件设备的访问。无论是HVM还是一般的Dom0都不能直接访问物理设备,必须借助Dom0IDD才能完成。下面以网络发包为例来说明DomU通过Dom0访问设备的一般步骤。

GuestAPP要发送的数据包,经过TCP/IP栈后,并不是送到一般的网络接口驱动程序(NetworkInterfaceDriver)中,而是送到DomU内网卡类(即相似)的前端设备驱动种,然后送入xen提供的共享内存种,同时向Dom0内的后端设备驱动发出处理请求后,经数据包从共享内存种取出,位于Dom0内的TCP/IP栈进行检查和处理,最后将通过检查的数据包经由原生网卡驱动送到真实的网卡中发送。



2.2 CPU虚拟化

通过分段保护机制,位于特权及别1GuestOS可以访问那些位于特权及别3的应用程序的内存,但应用程序不能访问GuestOS的内存。











2.2 内存虚拟化

在物理内存的管理中,Xen引入了气球驱动来调节分配给各个Domain的物理内存。气球驱动程序运行在GuestOS中,GuestOS通过气球驱动可以和Xen通信。当Domain需要更多的内存时候,它就通过气球驱动与xen直接通信。





2.4 I/O虚拟化

在半虚拟化下,Xen采用了分离设备驱动模型来实现I/O虚拟化。设备驱动划分三个部分:前端驱动,后端驱动,原生驱动。其中,前端驱动在DomU,后端驱动和原生驱动在Dom0IDD)中。






影子页表

GuestOS感觉自己的物理地址是从0开始的连续的。然而xen将这层中间地址真正的映射到机器地址上是不练须的。这样保证所有的物理内存可以被任意分配给不同的GuestOS


为了实现伪物理地址到机器地址的转换,xen使用了两种页页表,P2MM2P.

P2M实现从伪物理地址到机器地址的映射,由于每个GuestOS的物理地址到机器地址的映射不一样,因此每个GuestOS都有一个P2M表。M2P表是机器地址到物理地址的映射,它只有一个,有xen来维护。


PGD 页目录表,PT页表。


传统的linux中,对于32位线性地址,操作系统通过CR3找到PGD在的机器页,然后加上线性地址高10,就可以找到PT的机器页,再加中间10位,就可要找到机器页,在加后面12位偏移,就找到了机器地址。


当操作系统被虚拟后,采用影子页表机制后,GuestOS仍通过上述机制寻址。

虚拟机实际伤是通过影子页表在访问真实的机器物理地址,影子页表以虚拟页表为蓝本建立起来,并且通过虚拟页表的更新而更新,就项虚拟页表的影子,故称影子页表。

影子页表使用几个基本的数据结构,P2MtableM2Ptable



















0 0