Xen 的设备

来源:互联网 发布:lr监控windows资源 编辑:程序博客网 时间:2024/05/21 12:45
  1. 核心设备
    xen有两种设备科称之为核心设备–块设备和网络设备。块设备允许guest domain具有持久性存储,防止应重启照成数据的丢失;而网络设备允许个guest domain与世界网络进行通信。这两种设备都允许xen guest domain为系统用户提供服务。
    所有客户机都需要支持块设备。这一驱动用来呈现一个抽象的设备接口,通常是一个虚拟的硬盘,他可以由多种实体来支持,独立分区甚至是宿主文件系统中的文件。xen虚拟块设备是通用块设备的简单抽象他进而大部分其他设备一样,他使用共享存储器页面上的I/O环机制。虚拟块设备支持3种操作。而前两种是显而易见的:读出和写入一个数据块(或者一些数据块)。第三中是barrier,但是并不是所有设备都支持这种操作。 在对指令重安排(command-reording)的支持上,虚拟设备与很多设备尤其是SCSI和SATA非常相似,这意味着已经提交的命令可能并不以他的提交顺序完成,尽管在真实的机器上这是有没有用的,它是在虚拟环环境下获取好的设备吞吐率的核心。多个guest domain可能同一时间访问一个设备,对他们的指令进行重新排序,将会给出一个有效的提升。当大量guest domain只读的访问统一后端存储设备时,这种表现尤其显著。块设备使用了大量使用Grant Table,每一次传输都是块大小的整数倍,传输这么多数据的情况下,使用DMA传输通常比基于宿主机控制发复制更加有效。为了促进以这一应用,domainU使用目的的页面能够被后端驱动直接访问,从文可以在DMA传输中直接使用它。
    这里写图片描述
  2. 设置块设备
    和其他块设备驱动一样,前端驱动应当初始化共享页面,并提供Grant Reference给后端驱动,它同样分配一个事件通道,并将其传递给后端驱动。Xenbus机制被用于确定后端驱动和前端驱动之间的连接状态。XenStore用于在驱动两端传输设置信息。当虚拟块设备分配给给定的Domain时,XenStore会弹出一些相关于它的信息。前端驱动的第一步是读取XenStore并找到任何他需要知道的设备相关的信息。XenStore中的Domain的device/vbd/0/backend键给出XenStore中第一个虚拟块设备的后端驱动的位置。其中包块一些结束连接前的前端驱动需要读取的一些键值:
    1、Sector-size 包括数据块的大小
    2、 Size包括设备中扇区的数量
    3、 Info提供一些设备额外信息。这将是由ORing一些标志位一起生成的数字。
    XenStore的前端和后端驱动入口点都包括一个state入口。前端驱动设置它的XenBus状态,并且读取后端驱动的状态,而后端驱动则以相反的顺序进行工作,当附加设备时咪表是设置两个状态值为XenbusStateConnected,标志设备两端间都已经连接了。
    前端设备不应该做任何操作,知道后端驱动是XenbusStateInitialised,此时,后端驱动任然打开必须设备,并设置好后端驱动,特定详尽的驱动实现也许壶在他等待的时候将后端驱动驱动的状态输出到控制台,但好似这通常不应该持续很长时间。为了使设备就绪,前端驱动需要做两件事情:分配共享存储段和事件通道。这些步骤的第一步可以被分解为如下阶段:
    1、分配一个空闲页面
    2、在该页面上初始化环形缓冲区
    3、初始化其他位置的私有数据
    4、使用 Grant Table共享页面
    5、将Grant Reference加入XenStore。
  3. 数据传输
    源块设备的每一个传输都是由guest domain插入一个请求到I/O环形缓冲区而被初始化,环形缓冲区自身不包括被装入或者被存储的数据,而包含指令队列。seg成员的每一元素指定了一个Grant Table Reference。这需大概等同于DMA操作,用户指定一组内存,告诉设备从其他读取或者写入其中,并且在操作结束时高数用户。完全相同的事情发生在块设备上。主要的区别是存储器必须明确通过Grant Table机制是这块内存可用。磁盘上的位置通过一对扇区号对应,标示连续的开头进而结尾。实际上磁盘扇区可能不是连续的,而是分散的。当块设备交互时一个常见的术语是维护块缓冲。被加载的数据块被保存在缓冲中,如果他们被修改,那么他们将会保存到磁盘中,一个用户进程可能通过使用mmap()或者等效的调用来直访问这些缓冲的一部分的物理页面。
    这里写图片描述
  4. 使用Xen网络
    大部分xen guest domain 需要一些网络功能,这是由虚拟接口驱动实现的,他符合块设备驱动和其他驱动设备使用的标准环形缓冲区模型。不像块设备驱动,在启动的时候网络可能不太需要,因此它通常能够在很多其他操作系统在xen之上工作以后进行实现。网络结构的基本结构非常简单,他使用两个I/O环环形缓冲区,一个用于输出报文,另一个用于输入报文,环形缓冲区用于发送指令而不是数据,数据通过共享内存页面发送,页面通过Grant机制实现共享,每一次传输都需要包括 Grant Reference和一个被Grant的页面中的偏移量,他允许重用传输和接收缓冲区,从而避免TLB经常更新的需要。

  5. 设置虚拟接口
    映射网络接口和映射块接口几乎以相同的方式执行,最显而易见不同是虚拟网络接口使用两个环形缓冲区域,一个用来发送,一个用来接收。这是由于网络传输通常是在未被请求下达到的。另一个不同之处是与前端和后端设备相关的XenStore子树的内容。与设置通信通道先关的键值几乎一样,只有一个事件通道被使用,但需要两个环形缓冲区,两个环形缓冲区的Grant Reference都必须使用rx-ring-ref和tx-ring-ref键被导出。后端设备包括一个mac键,其中包含有虚拟接口的MAC地址,这取代了块设备后端驱动中扇区大小和设备大小的键,他们在网络环境中没有任何意义。在前端和后端驱动间通信的协议允许一些处理过程被卸载。XenStore中写入的一些键值用来标示哪些特性被支持,这里的键值都已feature-开头。最重要的特性是检验功能卸载,默认情况下,通过向feature-no-csum-offlad键写入1来禁用。

  6. 发送和接收
    与块设备用于通信的一样的宏被用于和虚拟网络接口交互,当发送一个报文的时候第一件需要做的事情是将其创建在存储器的某一位置。一个以太网帧有五个字段:源和目的的MAC地址,帧类型、有效载荷以及校验值。除非客户机明确要求不适用校验值,校验值将被保留。这主要是用于Domain间通信的优化,他假设数据在内存中不会被破坏,至少不会向通道导线传递那么频繁出现,因此计算机并不检查校验值是多余的,这能够在通过虚拟网络接口通信的一堆Domain中节省相当数量的CPU时间。
    这里写图片描述
0 0
原创粉丝点击