为了发送一个数据包,guest OS简单地将缓冲区描述符排队进发送环中。Xen复制描述符,同时为了确保安全性,还要复制数据包头并执行匹配过滤规则。数据包的有效载荷不会被复制,因为我们使用的是分散—集中式(scatter-gather)的DMA;这里要注意的是,相应的页框必须被绑定,直到数据包传送完成。为了保证公平性,Xen在数据包调度器上实现了简单的循环轮转(round-robin)算法。
为了有效地实现数据包的接收,我们需要guest OS为每一个它接收到的数据包交换一个没有使用的页框(//这个招儿挺绝的,我就不将页内容复制到我自己的页框里了,直接把这个页框纳入自己的旗下,然后再换个我没用的空页框给你,反正只要修改地址转换数组就可以了);这就避免了需要在Xen和guest OS之间复制数据包内容的麻烦,但是这么做必须要求在网络接口中接收缓冲队列中的有页对齐的区域(//因为这么做是直接以页框为单位进行的,所以一次交换就是一页的内容,所以需要提供页对齐的缓冲区域才可以进行)。当一个数据包被接收,Xen立即检查接收规则组来确定目的VIF,然后将数据包缓冲区和相应的接收环(//接收环存在于各个domain中)交换一个页框。如果这时没有页框可用的话,数据包就被丢弃。
3.3.6 磁盘
只有Domain 0能够不经检查地直接访问物理(IDE和SCSI)磁盘。所有其它的domain访问永久性存储介质的时候,都要通过虚拟块设备(VBD)抽象。这个抽象是由运行在Domain 0中的管理软件来创建和配置的。由Domain 0管理VBD使得Xen中的机制比较简单,不避使用更复杂的解决方案(比如Exokernel中使用的UDF[23])。
一个VBD是由一些和所有权以及访问控制信息相关的扩展组成的,可以通过I/O环机制来访问。一个典型的guest OS磁盘调度算法将重新排定请求的优先级并把它们排进环中,这样做是为了尽量减少响应时间,并且可以有区别地进行服务(例如,由于进行投机的向前读请求的代价很高,调度器可能会选择主动先去调度后面的对同步数据的访问请求)。另外,因为Xen对真实的磁盘规划具有更完整的认识,所以我们也要在Xen中支持重新定序(//刚刚提到的是guest OS),并且可以乱序地返回响应。因此,对于guest OS来说,VBD有一点像SCSI磁盘。
在hypervisor内部还为每个VBD维护了一个转换表;整个表中的内容都由Domain 0通过特权控制接口进行安装和管理。在接收到一个磁盘请求后,Xen检查VBD标识符和偏移,并且产生相应的扇区地址和所属物理设备。许可检查也是在这个时候进行的(//检查到底能不能进行这个磁盘操作)。零复制数据传递将以DMA的方式在磁盘和绑定到该发出请求的domain上的内存页之间进行。
Xen会使用简单的循环轮转方式来成批处理各个存在竞争关系的domain发出的请求;然后,在到达磁盘硬件之前,这些请求传给标准的电梯调度器。domain可以显式地设置重定序障碍(//不许重定序)来防止在必须维持高层次语义的时候(例如,在使用了一个预写日志(write-ahead log)的时候)进行重定序。当成批的请求中能够显现出访问的公平性的时候,低层的调度能够给我们带来很好的吞吐量。下一步工作将研究使用现有的技术和调度器提供更可预测的隔离性和支持更有差别的设备。
3.4建立新的Domain
为一个新的domain建立初始的guest OS结构,这个任务很大程度上是委托给Domain 0完成的。Domain 0使用它的特权控制接口(2.3段)访问新的domain的存储空间并告知Xen该新domain的初始寄存器状态。这个方法相对于由Xen建立整个domain来说有一些优势,包括减少了hypervisor的复杂度,改进了鲁棒性(对特权接口的访问要经过完全地检查的,使得我们能够在初始阶段捕捉到大部分的bug.
最重要的是,整个建立过程易于被扩展,可以应付新的guest OS.例如,Linux内核引导时的地址空间是要比Windows XP简单得多的。我们可以为所有的guest OS指定一个固定的初始内存规划,但是这样的话就需要针对每个guest OS编写额外的引导陷阱代码用来安置操作系统所需的其它部分。不幸的是,这类代码是非常难以实现的;为了获得简单性和鲁棒性,更好的实现方法就是使用Domain 0,它能够提供比引导程序更充裕的诊断和调试支持。
Scatter-gather DMA方式是与block DMA方式相对应的一种DMA方式。
在DMA传输数据的过程中,要求源物理地址和目标物理地址必须是连续的。但是在某些计算机体系中,如IA架构,连续的存储器地址在物理上不一定是连续的,所以DMA传输要分成多次完成。
如果在传输完一块物理上连续的数据后引起一次中断,然后再由主机进行下一块物理上连续的数据传输,那么这种方式就为block DMA方式。Scatter-gather DMA方式则不同,它使用一个链表描述物理上不连续的存储空间,然后把链表首地址告诉DMA master.DMA master在传输完一块物理连续的数据后,不用发起中断,而是根据链表来传输下一块物理上连续的数据,直到传输完毕后再发起一次中断。
很显然,scatter-gather DMA方式比block DMA方式效率高。
4.相关工作
虚拟化技术被应用在商业化和研究型操作系统上已经有近30年了。IBM VM/370[19,38]最先使用了虚拟化技术以提供对先前存留的代码的支持。VMware[10]和Connectix[8]采用了将常用的PC硬件进行虚拟化的方法,允许多个操作系统在同一台主机上运行。所有这些例子都对底层硬件(至少是底层硬件的一个子集)进行了完全虚拟化的实现,而并非是准虚拟化的方法提供给guest OS一个修改后的接口。正如我们的评估结果中给出的:完全虚拟化虽然能够更容易地支持商业市售的操作系统,但是却大大降低了性能。
VMM方法还被Disco用于将常用的操作系统高效地运行在ccNUMA机器上[7,18].其间要对被操控的操作系统做少量的改动,以使其能够虚拟化地运行在MIPS体系结构上。另外,出于性能的考虑,还要做一些其它修改。
现在,我们知道有两个其它的系统也采用了准虚拟化的方法:IBM不久前提出的Linux的准虚拟化版本允许大量的Linux实例同时运行,将用于他们的zSeries大型机上。Denali[44]在之前已经讨论过,它是一个暂时隔离的内核,试图提供能够操控大量虚拟操作系统实例的系统能力。
除了Denali,我们还知道有两种其它的方法使用了低层虚拟化技术建立分布式系统的底层架构。vMatrix[1]是基于VMware的,它的目标是建立一个用于在不同机器间移动代码的平台。由于vMatrix是在VMware之上开发的,因此它更关注的是虚拟化技术在分布式环境中存在的高层问题。另外,在IBM提出的“托管管理(Managed Hosting)”服务中,虚拟Linux的实例可以在IBM大型机上被租用(//大型机上跑多个Linux实例,你可以租一个用,搭建你自己的系统,和其他租户共享大型机的资源)。
PlanetLab项目[33]构建了一个分布式的底层架构,它的设计目的是作为实验床用于研究和开发地理空间分布的网络服务。平台的对象是研究者,试图将单个的物理主机划分为条(sliver),提供同时的对用户的低层访问。项目当前使用的是VServers[17]和SILK[4]来管理操作系统内部的共享。
我们再和操作系统外延研究和主动网络通信研究中的一些思路作比较。当代码在Xen上面运行的时候没有必要检查其“安全性”,也没有必要去检查代码运行是否能够保证终止,因为在这些情况中唯一的受害人是那些可疑的客户。于是Xen提供了更通用的方案:这个方案不需要由一个可信的编译器为被操控的代码做数字签名(比如SPIN[5]),不需要这些代码被一个安全证明伴随(比如PCC[31]),不需要由一种特殊的语言写成(比如SafetyNet[22]或者其它基于Java的系统),也不需要依赖于特殊的中间件(比如移动代理(mobile-agent)系统)。当然,这些其它的技术能够继续在运行在Xen上的guest OS中使用,而且可能会对那些时限更短暂的任务负载有着特别的用途,因为这类任务没有机会被成批处理以减少启动一个新的domain的代价。(//这段的意思,我的感觉是在操作系统外延研究和主动网络通信研究为了保证代码安全,采用了多种多样的方法;但是在Xen中,这些方法都是不必要的,因为Xen的安全性确认策略比较简单,前文有提及;但是这些方法在Xen中也还是有它们的作用,比如对于时限短暂的任务,它等不及成批地被确认,那么它就需要用其它方法保证安全性。)
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页
共11页: 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 10 [11] 下一页