Xen 的整体架构和整体设计

来源:互联网 发布:c语言打开应用程序 编辑:程序博客网 时间:2024/04/23 18:46

一、 Xen 的整体架构和整体设计

      1.Xen的整体架构如图:

        

                                                        图1  Xen 架构

       从图中可以看到,VMM介于硬件和虚拟机之间,截获虚拟机的特权指令并代替它们执行。VMM同时提供Domain间的共享内存和事件通道。 有一个特殊的虚拟机VM0(又称Domain0)运行着Linux,其主要作用是完成VM的创建、管理、配置等工作,并完成设备驱动。其他VM访问设备时,Xen获得该请求,然后将其转交给Domain0;当Domain0 完成请求的操作后,Xen再将结果返回给VM。这种做法的好处是Xen可以利用Linux中已有的驱动,不用在重新开发驱动了。

2. Xen的泛虚拟化设计:

     Xen采用的泛虚拟化技术需要对Guest OS进行相应修改。 IA-32平台上Xen的泛虚拟化技术如下:

   1)Guest OS使用特权指令的地方要修改为调用Xen提供的API:hypercalls。

    2)硬件中断被轻量级的事件机制取代;对于异常,Guest OS要调用hypercalls来注册自己的异常处理函数。

        陷阱的处理程序是注册到VMM上的,而不是直接注册到虚拟CPU上的,这样就节省了一步操作,否则要先引起虚拟硬件的陷阱,再由VMM处理。

       系统调用注册到处理器。大多数操作系统中,系统调用是通过一个查找表和一个特殊的陷阱队列来处理的。虚拟化后,陷阱队列引起VMM的处理。而Xen跨过这个效率不高的一步,允许虚拟机上的操作系统直接将它们系统调用的处理绑定到处理器上,避免了VMM处理陷阱队列而进行上下文切换的开销。

       3)修改内存管理机制:在每个Guest OS的虚拟内存空间保留64M给Xen,物理内存的申请和释放都要经过Xen。每个虚拟机可以对硬件页表进行只读访问,而更新页表的工作则由VMM完成。

       4)修改I/O使用方法:Xen只提供给VM一些通用快速的设备,VM只能根据Xen定义的API来访问设备。

     Xen的I/O模型如下图所示:


图2 Xen的I/O模型

      Xen采用的是泛虚拟化技术,VM(也称为DomainU)的I/O操作不能直接通过自身的驱动程序访问硬件,而是要借助Domain0的驱动来访问。DomainU的I/O操作由两个主要的驱动模块来完成,即FrontenDriver和BackendDriver。FrontendDriver 位于Domain U中,负责接收Domainu的I/O请求,并把请求交给位于Domain 0的Backend Driver,随后由Backend Driver 调用Domain0中的相关驱动来处理,并把处理结果返回给Frontend,从而完成DomainU的一次I/O操作。

    由于Frontend和Backend位于不同的OS中,它们之间的通信要依赖共享内存环和事件通道(EventChannel)来进行。通过共享内存环,Frontend和Backend可以把I/O请求放入环中和从环中读取,而I/O请求的处理结果也可以通过环进行传递。而Event Channel则允许Frontend 和Backend给对方发送一个确认信息。

 

 

 

二、Xen虚拟机架构及关键技术2(控制面板实现模块)

  控制面板:

控制面板(ControlPanel)是Xen中的控制模块,是虚拟机运行的总控制台。所有Domain的创建、销毁、配置、迁移等工作都是在这里下达命令,然后在调用底层的具体函数具体实施。它是虚拟机的用户接口,用户通过向控制面板输入指令来同Hypervisor(VMM)以及设备模型(Device Model)打交道。控制面板在Xen中的架构图如下:


图1 控制面板的架构

    由图可只,控制面板位于Domain0 中,Domain管理、设备管理、Guest管理、调度管理等都通过控制面板中的Xend实现。Xend是ControlPanel中的核心部件,是Xen中的核心进程。其中Domain管理是Xend管理的中心。

       Xend运行在具有特殊优先级的Domain0中,通过Domain0的内核调用底层API来与Hypervisor通信。Xend用HTTP协议来包装它的控制接口。由于大多数编程语言都具有HTTP函数库,所以该接口可被绝大多数流行语言所使用,如Python,C,Java等。Xend采用的是Python语言,这是一种解释型的面向对象语言,易开发,易调试,易扩展,易嵌入到C或C++语言程序项目中。Xend以及Xen中很多工具就是因为Python的这些优点而采用它作为上层实现语言。

      Xend的用户接口就是Domain创建与管理的接口。它支持Domain的创建,关闭,重启,销毁,保存,恢复与迁移。

创建Domain时,Xend首先创建Domain的内存映象,与Device Model通信为该Domain配置虚拟设备,并在Domain0中为该Domain新建一个Device Model实例。当Domain关闭时,除非它在Domain0中的Device Model实例被释放,否则其内存映象不会被完全释放。为了防止在Xend重启时丢失配置信息,Xend为每个Domain维护了一个数据库,使得Xend在停止或重启的时候不用担心遗失配置信息,例如,当升级Xend的时候仍然可以保持其维护的Domain信息与未升级前一致。图3-4是Control Panel具体的实现模块。


三、Xen虚拟机架构及关键技术2(xend 的功能)

 

下面我们分析下Xend的四项功能,Domain管理,Guest OS管理,设备管理和调度管理,其中最主要的是Domain管理。

1)Domain 管理

Domain 管理实际上就是对Domain生命周期的控制,包括Domain的创建,销毁和重启。

l       Domain创建

用户通过HTTP中的POST方法想Xend发送消息,通知它创建一个Domain。该消息包含了以SXP格式描述的所有Domain参数:Domain的名字,内存大小,内核映像和参数,以及所有的Domain设备。这些信息以文件的形式保存在系统中,以便需要的时候重复使用。Xend使用Xen的API来为Domain分配内存,然后使用内核映象来为其创建相应的内存映象。此时,Domain就已经创建好了,但它没有设备还不能运行。Xend然后通知Domain0为该Domain配置所需的设备模块。一旦设备配置好之后,它就在Domain0和新Domain之间建立事件通道,通知新Domain它的设备已经就绪。到这时新Domain就可以开始运行了。图3-5是Domain创建的流程图。


图1 Domain 创建流程

Xend也管理Domain的终端。当Domain被创建时,Xend为Domain设置一个终端事件通道,并创建相应的TCP监听端口。当外部对该端口的连接请求被接受时,Xend就把该端口的输入输出连接到Domain的终端通道上。

l       Domain销毁

当一个Domain由于崩溃或被关闭而中止运行时,该Domain所占用的资源必须要被释放以便从Xen中移除其内存映象。Xend监视着Domain的运行,与此同时当Domain退出时Xen也会通过虚拟中断请求来通知Xend。Xend会检查Domain的状态并通知Domain0释放该Domain的设备模块实例。Xend同时还关闭该Domain的终端连接,移除其监听端口。一旦所有的设备都被释放,它就指示Xen销毁Domain的内存映象。

l       Domain重启

在Xen中,Domain的重启类似于一般的机器重启。当Domain由于重启(reboot)的原因而被关闭退出时,其退出码就是reboot。这样,在Xend检查退出的Domain时,若发现其退出码是reboot,它就仅断开该Domain的所有设备和终端,而并不将其完全销毁。Xend过段时间再根据配置重建该Domain,其过程与创建一个新Domain相同,唯一的不同就是终端的监听器是被重复利用的,当新Domain建立时监听器被重新连接到这个Domain上。被重启的Domain与原Domain具有相同的标识。

1)Guest OS管理

对Guest OS 的管理包括两个方面,一个是Guest OS的创建,一个是Guest OS的保存和恢复。

创建和运行一个GuestOS需要两步操作:创建Domain、加载并运行Guest OS。其中创建Domain在上一节已有详细论述,这里主要解释一下如何加载并运行GuestOS。

首先需要把GuestOS的映象文件加载到新创建的Domain内存中,查询并初始化设备,设置好寄存器,页表等运行参数,然后在VM环境中执行Guest OS的指令。

对于Domain的保存和恢复,则是把当前正在运行的Domain及其运行状态保存到一个文件中,然后关闭退出。以后想恢复到此运行状态时,可以通过Domain的恢复操作从该文件中读出Domain状态进行恢复。Domain的保存和恢复功能由源代码中的pyxc_linux_save()和pyxc_linux_restore()两个函数完成。

2)设备管理

设备管理主要有两部分工作,一是初始化Device Model:Domain中的每个虚拟设备都有其相应的初始化函数,创建Domain的时候系统会调用这些函数进行初始化。二是初始化事件通道:事件通道是Domain中I/O操作的事件通知机制,每个Domain建立的时候,都需要在Domain0和新的Domain之间建立事件通道。

3)调度管理

对于每个运行的VM,都必须分配CPU时间,这种时间分配就必须有一个CPU调度机制。CPU调度算法可被分为两类:WC-mode(work-conserving)和NWC-mode(nowork-conserving)。

 

原创粉丝点击