发明名称 一种对操作系统透明的处理器资源整合利用方法
摘要 本发明提供了一种对操作系统透明的处理器资源整合利用的方法,它可以将多台分散的、造价较低的物理服务器虚拟成一台具有大量处理器资源的高性能服务器,从而可以在不需要对上层软件系统作出任何修改,具有简单易用的编程模型的前提下,在多台造价低廉的中低端服务器上实现加速比,获得高性能。它实现了跨物理服务器的处理器虚拟化系统。通过在多个物理服务器之上部署基于这种处理器资源整合利用方法的虚拟机监控器,使得上层客户操作系统可以在物理服务器集群上运行,透明地使用分散在多个物理机器中的处理器资源。因此,本发明具有良好的应用前景。
申请公布号 CN101398769A 申请公布日期 2009.04.01
申请号 CN200810225090.9 申请日期 2008.10.28
申请人 北京航空航天大学 发明人 刘忠麟;肖利民;王箫;祝明发;李响山;张萧;彭近兵
分类号 G06F9/455(2006.01)I;G06F9/50(2006.01)I 主分类号 G06F9/455(2006.01)I
代理机构 北京慧泉知识产权代理有限公司 代理人 王顺荣;唐爱华
主权项 1. 一种对操作系统透明的处理器资源整合利用的方法,其特征在于:该方法步骤如下:步骤1:在各个物理服务器上生成虚拟处理器;在每个结点上,我们采用硬件虚拟化技术来实现处理器的虚拟化,根据硬件虚拟化的规范,通过在虚拟机监控器(VMM)和客户操作系统之间快速切换的机制,在每个结点上对虚拟处理器的控制结构进行初始化,同时建立虚拟处理器和物理处理器的初始对应关系,然后,对每个虚拟处理器,设置hypervisor对客户操作系统监管的程度,划分敏感指令集,这样,虚拟处理器初始化完毕后,当客户操作系统执行到这些指令的时候,就会发生VM退出,控制权转移到底层的虚拟机监控器;步骤2:对各个结点的虚拟处理器信息进行采集;每个结点上生成的虚拟处理器都要提供给上层的客户操作系统,因此系统中每一个物理服务器都必须了解全局的虚拟处理器分布情况,这里通过将各个物理服务器所提供的虚拟处理器数量写成配置文件,在各个结点的hypervisor中读取该文件,这样各个结点一开始就知道整个系统的虚拟处理器的分布情况,同时,有时候可能由于特殊原因,某个结点实际提供的虚拟处理器数目可能不同于并没有按照配置文件记录的数目(这种情况极少发生),各个物理服务器在创建完虚拟处理器后,必须告诉其他物理服务器其是否成功创建了指定数目的vcpu,如果没有,那么各个物理服务器需要修正vcpu分布信息;步骤3:对虚拟处理器资源信息进行整合与管理;通过前面对虚拟处理器信息的采集,hypervisor已经知道了虚拟处理器在各个几点的分布情况,这样,每个结点都保存一份全局的虚拟处理器分布表,接下来需要对全局的虚拟处理器进行管理,对于跨物理服务器条件下虚拟处理器的组织,采用的原则是对于那些guest引发的相关操作进行全局范围统一管理,对于hypervisor直接掌控的相关操作则分服务器单独管理,对于虚拟处理器标识的管理,采用的方法如下:虚拟处理器资源整合系统中基于以下四个比较重要的标识,(1)vcpu_id,用于在hypervisor中管理虚拟处理器;(2)vlapic_id,用于向guest提供虚拟的apicid;(3)vpu_id_global标识,代表当前虚拟处理器在全局环境下的逻辑id,从guest的角度看来,vcpu_id_global就是其所拥有的处理器在全局层面的逻辑id;(4)node_id,代表该物理服务器在全局范围内的逻辑标识;首先要为每个结点指定一个结点号node_id,其中结点号为0的结点为主结点,然后为每个虚拟处理器分配一个逻辑的vcpu_id,从0开始计数,并且服务器内的vcpu id是连续分配的,对于虚拟处理器的vpu_id_global标识,通过计算该虚拟处理器在全局的序号来指定,我们将虚拟处理器所在的物理服务器信息反映到vlapic_id中,以便可以迅速的定位该虚拟处理器,同时,为了使得虚拟处理器可以在物理处理器上迁移,我们的虚拟处理器不进行多核结构的设置,所以将8bit的虚拟处理器的vlapic_id域分为两个部分,低三个bit用来标识该vcpu在本服务器内的序号,这个序号在数值上等于其vcpu_id,高五个bit用来标识该虚拟处理器所在的服务器号;步骤4:确定对虚拟处理器信息的获取方式;根据vcpu的管理方法,其node_id,vcpu_id,vlapic_id是可以通过计算得到的,例如计算vlapic_id采用如下方法:vlapic_id=node_id<<3+vcpu_id (1)对于所在的物理服务器号为t的vcpu来说,其vcpu_id_global的计算方式如下,其中vcpu_nr(i)是服务器i上的vcpu数量:获取某个虚拟处理器所在的物理服务器号采用下面的方法:node_id=vlapic_id>>3 (3)另外,我们还在每个服务器上维护了一个全局的虚拟处理器资源信息表,某些不能通过计算得到的信息,例如虚拟处理器的dfr信息等,需要通过查表得到;步骤5:将虚拟处理器信息向guest进行呈现;全局的虚拟处理器资源就是guest能够使用的处理器资源,我们需要guest能够正确的识别到这些虚拟处理器,并能够正常初始化它们,在这里为guest提供整合后的虚拟处理器资源信息,主要是根据虚拟处理器的分布情况,制作基于多处理器规范的MP表以及基于ACPI规范的acpi表,并将其放到guest的内存区域的适当位置,目的是在guest启动的时候通过读取这些表项感知其所拥有的处理器资源信息,对于MP表,主要是修改Processor Entries,为每个虚拟处理器生成一个ProcessorEntry,对于ACPI表,主要是修改Multiple APIC Description Table(MADT)的Processor Local APIC Structure,还要根据虚拟处理器信息制作processor_objects表项,将这些表项写入guest的内存,并索引到MP规范和ACPI规范的头部区域后,guest启动时便可以读到这些虚拟的处理器信息,从而对占有的处理器资源有一个概况;至此,hypervisor层对于虚拟处理器资源信息的准备工作已经完毕,接下来就是启动客户操作系统,并在其执行过程中对其行为进行模拟;步骤6:对guest多处理器启动过程进行模拟;为了让客户操作系统能够真正感知并使用底层分散在各个物理服务器中的虚拟处理器资源,还要对guest的多处理器启动过程进行跟踪和模拟,Guest首先读取MP和ACPI相关表项,确定处理器资源信息,然后通过发送SIPI中断来启动和初始化虚拟处理器,虚拟处理器发送SIPI中断的时候是通过向ICR寄存器写入数据实现的,向虚拟ICR写入地址时会被捕获到,此时在主物理服务器BSP退出的路径中,根据ICR的内容判断是否是发送SIPI,然后判断要启动的虚拟AP是否在本服务器内部,如果是的话,则直接将虚拟的跳板程序从虚拟ICR中解析出来,然后对目标AP做最后的初始化,主要是设置其虚拟控制结构体中的一些重要寄存器信息,其中重点是将跳板程序的地址写入,作为虚拟处理器进入时程序的执行起点,然后将被启动的虚拟处理器唤醒,使其为可执行状态并加入调度器队列,等到被调度到的时候进入非根模式,开始执行客户操作系统的代码;如果目标AP不在主物理服务器上,则需要将SIPI信息打包成网络信息包,发送给目标AP所在的物理服务器,当目标服务器接收到信息包之后,判断如果是SIPI信息包,那么首先需要将SIPI的目标AP的vlapic_id解析出来进行判断,如果该AP确实在本物理服务器,那么紧接着从该信息包中解析出跳板程序的地址,然后对目标AP进行最后的初始化,将跳板程序地址写入虚拟控制结构体中,接下来的过程跟单机内一样,调用唤醒模块将目标虚拟处理器唤醒并加入调度队列,等下一次被调度的时候调用虚拟机进入模块,进入非根模式,执行客户操作系统的代码;步骤7:在客户操作系统执行过程中,对其指令集进行必要的模拟;在多服务器的条件下,需要模拟的指令大致分为三类,一些指令只需要在物理服务器内进行模拟,而有一些敏感指令或者行为(例如发送跨处理器中断)会引发跨物理服务器的处理器操作,这时需要物理服务器之间协调完成指令的模拟,还有一些指令会间接引发跨物理服务器操作,或者受到全局资源整合的影响,这时也需要在全局资源视图下,通过跨物理服务器的操作对指令模拟进行辅助,保证指令的正确模拟,敏感指令的模拟如图3所示;第一类,与全局vcpu资源整合无关的敏感指令模拟;某些指令只需要在物理服务器内进行模拟,其模拟过程中也只是涉及本地的一些寄存器操作,而不涉及跨物理服务器操作,例如对HLT,VMMCALL等指令的模拟,对这些指令的模拟只需根据其含义,在单机内进行模拟,并将模拟结果通过其虚拟寄存器等返回到客户操作系统;第二类,直接引发跨物理服务器操作的指令模拟;这些指令的模拟可能直接引发跨物理服务器操作,例如IO操作,无论是以IN/OUT/INS/OUTS指令为主的直接IO访问(PIO),还是以MOV/MOVS等内存操作指令为主的内存映射IO访问(MMIO),都有可能因为要访问的设备在远端物理服务器而不在本地,而产生跨物理服务器操作,对于直接IO访问操作,hypervisor通过捕获IN/OUT/INS/OUTS等指令来截获guest操作,对于内存映射IO访问,hypervisor通过设备映射内存区的缺页异常来捕获guest操作,IO操作被捕获后,hypervisor判断目标设备是否在本地,如果在本地,则直接进行指令模拟、IO操作等;如果目标设备不在本地,则需要hypervisor将IO操作信息进行分析,抽取出IO操作类型,目标端口地址、读写、数据或数据所在内存地址等信息,连同物理服务器id、处理器id等环境信息一起制作成网络信息包,发送给目标设备所在的物理服务器,在设备对guest可见的情况下,目标服务器解析传来的数据包,将IO操作在本地还原,完成IO操作,然后将操作是否成功的信息发回给请求端服务器,同时,如果IO操作时是读数据的操作,并且不是往guest的内存里读,则需要将读出的数据一并发回给请求端服务器,如果设备是由模拟器虚拟的,则目标服务器收到IO操作网络包后,将IO请求发给设备模拟器处理;第三类,间接受到跨物理服务器影响的指令模拟;这些指令的模拟会间接受到跨物理服务器条件的影响,这些影响主要包括在模拟过程中需要用到跨物理服务器的资源整合信息,或者会间接引发跨物理服务器操作;对于需要用到跨物理服务器的资源整合信息的指令模拟,例如CPUID指令获取apic_id的操作,当指令被捕获后,需要根据整合后的全局虚拟处理器资源信息,来模拟指令想要的结果,并将结果返回给客户操作系统;会间接引发跨物理服务器操作的指令,其典型代表是如mov_to_cr、movs等指令,在对这些指令的模拟过程中,指令操作数可能在guest内存中,当涉及到客户操作系统内存访问操作的时候,需要注意缺页问题,也就是所需页面不在本地的情况,此时需要调用DSM算法请求远程页面的拷贝,对于非敏感指令和行为中操作数造成的缺页,只需由hypervisor将页面拷贝过来,然后即可返回客户操作系统继续执行,对于需要访问客户操作系统页面,要由hypervisor主动的调用DSM模块,通过DSM算法将有效页面迁移过来,并进一步得到操作数本身,进而完成对指令的模拟。
地址 100083北京市海淀区学院路37号北京航空航天大学计算机科学与工程学院