X86体系结构内存管理单元虚拟化方法

文档序号:6482211阅读:230来源:国知局

专利名称::X86体系结构内存管理单元虚拟化方法
技术领域
:本发明涉及计算机体系结构及操作系统领域内存管理方法,尤其是X86体系结构的内存管理单元(MemoryManagementUnit,丽U)虚拟化方法。
背景技术
:当前,计算机的处理能力不断快速提升,而根据相关统计,运行于其上的服务软件在系统空闲时段往往只用到了不到10%的处理能力,在忙时也往往用不到50%。与此同时,计算机的能耗不断加大,电能的消耗已经逐渐成为IT业的主要开销之一。另外,出于安全和可靠等方面的考虑,大量的服务提供商必须使用多台服务器以满足数据备份、冗余容错和服务的安全隔离等方面的需求,这不仅大大增加了设备购置的资金投入、成倍提高了电能消耗,而且由于大量服务器的利用率较低,造成了性价比严重低下。为了解决这个问题,人们提出了虚拟化(virtualization)的概念,即通过虚拟机监控器(VirtualMachineMonitor,V画),对真实计算机的CPU(CentralProcessingUnit,中央处理单元)、内存管理单元廳U和外设进行虚拟化,在一台真实的计算机上虚拟出多台"虚拟机(VirtualMachine,VM)",每台虚拟机都可分别运行一个操作系统。这样,就能进行服务器整合(serverconsolidation),即将多台服务器整合为一台物理服务器,从而大大提高服务器利用率、降低能源消耗和提高安全性与可靠性。在桌面计算领域,虚拟化技术使得用户能够同时运行多个不同的操作系统,满足了用户对不同计算平台的需求。X86计算机所装配的物理内存从0开始编址,每个内存单元的地址称为物理地址(physicaladdress),CPU基于物理地址访问内存的不同单元。为了在X86计算机上同时运行多个虚拟机,虚拟机监控器中必须包含一个名为"MMU虚拟化模块"的组成模块,由该模块进行内存管理单元醒U的虚拟化。当前国际上的画U虚拟化方法都包括以下步骤第一步,为虚拟机分配物理内存,即根据用户的配置,将X86计算机的物理内存划分为多块,每一块内存对应一个虚拟机。目前有两种方法实现物理内存分配第一种方法是借助操作系统提供的内存分配接口分配,例如KVM项目(http:〃丽w.1inux-kvm.org/),这种分配方法直接调用操作系统提供的服务,实现简单,但不能保证所分配物理内存的物理地址的连续性;第二种方法是在X86计算机引导时预留出相应的物理内存,例如Xen项目(http:〃www.xen.org/),这种方法能够保证预留物理内存的物理地址的连续性,但实现复杂。第二步,为虚拟机创建E820表。在X86计算机中,并非所有的物理内存都是可用的。例如,物理地址区间0xA0000至0xC0000被保留给显卡的显示缓冲区,从而这部分物理内存是不可用的。为了描述X86计算机的物理内存是否可用,X86计算机定义了所谓的E820表,E820表中记录了每一段物理地址区间对应的物理内存是否可用。当今所有的操作系统都通过査询E820表获得可用内存信息,以保证只使用可用物理内存。假设在第一步中为某个虚拟机分配的物理内存的物理地址区间是[M,M+iV),则当前国际上画U虚拟化方法所构建的E820表中将物理地址区间[0,A0标识为可用内存(不考虑其它保留的物理地址区间)。例如,如果为某虚拟机分配256MB物理内存,则不管这些物理内存处于哪个物理地址区间,该虚拟机的E820表中从0开始至256MB的物理地址区间被标识为可用。第三步,当虚拟机加载新页表时,为其构建影子页表(shadowpagetable)和反向映射(backmap)。X86体系结构蘭U虚拟化的核心是分页(paging)机制,即将机器的物理内存划分为若干个固定大小的内存页(memorypage),再引入虚拟地址(virtualaddress)的概念,并构造页表(pagetable),在页表中记录每个虚拟地址页所对应的内存页的物理地址(physicaladdress)。应用程序使用虚拟地址来访问内存,CPU通过查找页表,将对应的虚拟地址转换为真实的物理地址后完成内存访问。例如,X86体系结构规定的最小页大小是4KB,假设页表中记录的虚拟地址页0x12345000对应的物理地址页是0x00055000,那么虚拟地址0x12345678经该页表转换后的物理地址是0x00055678。虚拟机中运行的操作系统的一套页表由多个物理页组成,分为多级。例如在32位的X86体系结构下,如果打开了物理地址扩展(PhysicalAddressExtension,PAE)功能,则CPU的CR3寄存器指向第一级页表,第一级页表中的每个页表项都指向一个第二级页表页,第二级页表的每个页表项都指向一个第三级页表页,第三级页表是最末级的页表页,它的每个页表项则指向一个物理内存页。CPU进行地址转换时,先根据虚拟地址在第一级页表中找到相应的第一级页表项,再在第一级页表项所指向的第二级页表中找到相应的第二级页表项,依此类推,只到找到最终的物理内存页。一套页表被加载,是指将该页表的第一级页表页的起始物理地址装入到CPU的CR3寄存器中。当进行虚拟地址到物理地址的转换时,CPU总是使用其CR3寄存器所指向的页表。在X86虚拟机监控器中,MMl)虚拟化模块将监控CR3寄存器值的改变,当CR3寄存器的值由X变为Y时,就表明新页表Y被加载了,与此相对的,称页表X被卸载了。运行于虚拟机中的操作系统根据E820表得到的可用物理内存的物理地址是错误的,例如为虚拟机分配的内存的物理地址区间是[M,M+iV),而为其构建的E820表中显示的可用内存的物理地址区间为[0,iV)。为此,当虚拟机加载新页表时,需要修改虚拟机的页表中填入的物理地址,将其改为正确的物理地址。例如,假设将物理地址区间为256MB至512MB之间的256MB物理内存分配给某个虚拟机,则为其构建的E820表中可用的物理地址区间为0至256MB。因此,如果某页表项中填入的物理地址是0,则在该页表使用之前,必须将该物理地址修正为0x10000000,即保证该操作系统实际访问的是256MB处的物理地址。其指向为这个虚拟机页表页创建的影子页表页。例如,某影子页表项指向的虚拟机的页表页为X,为X创建的影子页表页为X',则需要将该影子页表项改为指向X'。如果该影子页表项是最末级的影子页表项,则更正其中的物理地址。最后,将第一级影子页表页的起始物理地址加载到CR3寄存器中,通知CPU使用影子页表进行虚拟地址到物理地址的转换。接下来针对影子页表构建反向映射,构建反向映射是为了能够根据某个物理页找到映射该页的每级页表项。构建反向映射的方法是在影子页表中,对每个影子页表页,将所有映射了该影子页表页的上一级页表项的物理地址加入该影子页表页的反向映射中;对每个普通的物理页,将所有映射了该物理页的最末级页表项的物理地址加入到该页的反向映射中。例如,假设某个第一级页表项A指向一个页表页C,另一个最末级页表项B也指向页表页C,则页C的反向映射包含A和B的物理地址。第四步,当虚拟机页表被更新时,保持影子页表与虚拟机页表的同步更新。即当虚拟机中运行的操作系统修改了页表后,CPU实际使用的影子页表也必须同步更新。目前,主要有两种方法能够实现虚拟机的页表与影子页表之间的同步更新。第一种方法是监视虚拟操作系统对其页表的访问,保证画U虚拟化模块能够捕获操作系统对其所有页表的修改,并将修改同步更新到影子页表中。该方法的关键是捕获虚拟机中运行的操作系统对页表的写操作,这可以通过醒U硬件提供的保护机制实现。根据X86体系结构规范,醒U硬件在页表的每一项映射中都定义了数个保护位,其中一位是R/W(Read/Write,读/写)位,由R/W位控制页表中该项所映射的内存页是否可写。除了R/W位外,另外还有两个标志位,即A位和P位。A位即"Accessed位"或"访问位",由CPU设置,当CPU第一次访问某个页表项并通过该页表项完成虚拟地址到物理地址的转换后,就将该页表项的A位置l。P位即"Present位"或"存在位",由操作系统设置,当P位为1时,该页表项有效;如果P位为0,CPU利用该页表项进行地址转换时会失败,并通过页故障通知操作系统进行处理。每一级页表项都设有A位和P位,当CPU进行地址转换时,只有当相应的三级页表项的P位都为1才能成功将虚拟地址转换为物理地址,同时将三级页表项中的A位都设置为1。MMU虚拟化模块通过修改影子页表的R/W位,使得操作系统的页表对应的内存页是只读的,这样当操作系统试图修改页表时将引起页故障(pagefault),此时CPU将中止操作系统的运行而通知MMU虚拟化模块,由其对影子页表进行同步更新。第二种方法是不监视操作系统对其页表的修改,而是等到被修改的页表投入使用时再将其更新到影子页表中。这种方法的关键是判断操作系统的页表何时被CPU使用,页表被CPU使用时,CPU使用CR3寄存器所指示的页表进行地址转换。因此,当CR3寄存器的值被更新时,顧U虚拟化模块就知道有新的页表被启用了,从而设置相应的影子页表。如果操作系统更新当前正在使用的页表,则根据X86体系结构规范,为了启用被更新的页表项,必须让CPU执行一条INVPGL指令,醒U虚拟化模块通过捕获INVPGL指令判断当前正在使用的页表项的更新,并同步更新影子页表。上述两种影子页表同步更新方法都必须为操作系统的所有物理页表页创建影子页表页,而在操作系统中同时运行着大量的进程,每一个进程都对应一套页表,而一套页表中最多可包含数千个物理页,因此醒U虚拟化方法需要消耗大量的物理内存用于创建影子页表。此外,虚拟机的页表每次被更新时都会产生页故障并通知醒U虚拟化模块对影子页表进行同步更新。操作系统对页表的更新操作非常频繁,同时每次页故障的处理也很耗时,因此MMU虚拟化会导致虚拟机性能严重降低。从当前硬件发展水平来看,目前市场上主流的X86计算机均未对醒U虚拟化提供直接的硬件支持,这就要求尽量优化丽U虚拟化方法,降低物理内存消耗,并提高虚拟机的性能。
发明内容本发明要解决的技术问题是针对目前MMU虚拟化方法既消耗大量的物理内存,又导致虚拟机性能大幅降低的技术问题,提供一种内存管理单元虚拟化方法,大幅减少影子页表页的数量,从而降低影子页表所导致的内存开销,同时提供一种懒惰式影子页表更新方法,降低影子页表同步导致的性能损失。本发明的技术方案是-第一步,为虚拟机分配物理内存采用
背景技术
介绍的第二种方法为虚拟机分配物理内存,即在X86计算机引导时为同时运行于该计算机上的"个虚拟机预留出所需的物理内存,并保证所分配的物理内存的物理地址是连续的。假设X86计算机共装配了大小为M的物理内存,则其物理内存的物理地址区间为[O,M)。为w个虚拟机所预留的内存分别为[0,MJ,[MpM2),…,[K),…,[M"屮M"),其中M,M,l化"。第二步,为每个虚拟机创建并修正E820表2.1为每个虚拟机创建E820表每个虚拟机的E820表中的物理地址区间都是[O,M),第z'个虚拟机的E820表中只有物理地址区间为[M卜,,AQ的物理内存被标记为可用内存,其它两块物理地址区间[0,MM)和[Mj,M)都被标记为不可用内存;2.2为每个虚拟机修正E820表当今的操作系统都假设物理地址从0开始的一片物理内存[O,户)总是可用的,并在系统引导时无条件使用该片物理内存,其中P从实验得出(例如,尸为16MB就能够保证当前主流操作系统的正常运行)。上述"个虚拟机中,只有为第一个虚拟机分配的物理地址区间[0,Af,)满足该需求(在实际使用时,总有J^>/>)。对其它虚拟机/(2S/《"),按如下方法修正其E820表2.2.1将物理地址区间[O,尸)标记为可用内存;2.2.2将物理地址区间[户,M,—,+户)标记为不可用内存;2.2.3将物理地址区间[M,—t+尸,M,)标记为可用内存;2.2.4物理地址区间[M,,M)仍标记为不可用内存。上述修改保证了物理地址区间[0,P)在每个虚拟机的E820表中总是可用的,后面构建影子页表时,将把[0,尸)区间内的物理地扯JC修正为M,—1+x。换言之,虚拟机尽管能够看到物理地址区间[O,尸),但其真正使用的是物理地址区间[M,一i,M,.—i+户)中的物理内存。第三步,判断虚拟机是否加载了新页表,若加载了,则按如下方法构建影子页表和反向映射;若未加载,转第四步-3.1创建影子页表。对第/个虚拟机的每个页表页,如果满足如下任意一个条件,则为该页表页创建影子页表页,否则不创建影子页表页*且该页表页中存在一个页表项,该页表项中填入的物理地址;c满足xe[O,尸),这是因为除第一个虚拟机外的其它虚拟机都需要在页表中修正[O,iO区间中的物理地址;*该页表页中存在一个页表项Pte,pte中填入的物理地址X是下一级页表页的地址(即pte不是最末级页表的页表项),并且物理地址为X的下一级页表页需要创建影子页表页。这是因为为X创建影子页表页X'后,需要将pte中填入的物理地址由X改为X'。如果为cra的CR3寄存器所指向的第一级页表页Y创建了影子页表Y',则将CR3寄存器中的值从Y改为Y';*该页表页是整套页表中最末级的页表页,且存在某个页表项pte,使得pte中填入的物理地址X是某个页表页的地址,这是因为在后续步骤中要修改pte的R/W位,以对该pte所映射的页表页X进行写保护。3.2修正影子页表项。为第z'个虚拟机构建影子页表后,检查所创建的每个影子页表页的每个影子页表项spte,按如下方法对影子页表项进行修正3.2.1检查影子页表项spte是否为最末级页表项,如果spte不是最末级页表项,转3.2.2;如果spte是最末级页表项,则若/*1且spte中填入的物理地址;c满足;ce[0,尸)时,将spte中填入的物理地址jc修正为M,.—^x,转3.3;若spte中填入的物理地址x是某个页表页的起始物理地址,则将这些spte的R/W位改为0,即对该页表页进行写保护,转3.3;3.2.2检査spte所指向的物理地址为;c的页表页是否被创建了影子页表页x',如果是,则将spte中填入的物理地址x修正为x',转3.3;3.3创建反向映射backmap。针对第/个虚拟机的页表,为X86计算机的每个物理页都设置一个反向映射,记录所有映射或指向该物理页的页表项的物理地址。反向映射采用链表的数据结构,链表的每个节点记录如下信息*指向该物理页的页表项的物理地址;*该页表项的P位与R/W位的值。设修正过的影子页表共有m个影子页表页,分别为^,…,J^,…,X^其中12A^m,设第A:个影子页表页J^共有个影子页表项,则对第y'个影子页表项印te,(其中1Sy《&),设中填入的物理地址为y,则将的物理地址以及P位与R/W位的值加入到y的反向映射中。用backmap(Y)表示物理页Y的所有反向映射链表项的集合;3.4为第/个虚拟机的每个页表页都设置一个"页表连续更新计数器",初始值为0,并将创建的所有影子页表页的所有影子页表项的A位置0;3.5将影子页表装入CPU的CR3寄存器中,通知CPU使用影子页表进行虚拟地址到物理地址的转换,转第四步。第四步,如果没有接收到CPU产生的页故障,或接收到的页故障既不是P位导致的,也不是R/W位导致的,则转第三步。如果接收到CPU产生的页故障,则如果接收的页故障是由P位导致的,转第六步;如果接收的页故障是由R/W位导致的,则按如下方法更新页表项和"页表连续更新计数器"4.1按如下方法更新页表项4.1.1接收页故障。R/W位导致的页故障是由于虚拟机中的操作系统更新某个页表项pte而产生的,由于对所有页表页都进行了写保护,因此每次更新操作都会导致CPU产生一个R/W类的页故障,CPU还同时给出被修改的页表项pte的地址。页故障的接收方法与国际同类画U虚拟化方法(例如Xen)所采用的方法完全一样;4.1.2如果pte所在的页表页X没有影子页表页,则根据3.1所示的条件判断是否需要为X创建影子页表页。如果需要为X创建影子页表页,则根据3.1所示的条件考查是否需要为X的上一级页表页创建影子页表页;4.1.3如果pte所在的页表页X在此前或在4.丄2中被创建了影子页表页X',设pte在X'中对应的影子页表项为spte,则根据3.2所示的方法修正影子页表项spte中的物理地址和R/W位;4.1.4设该页表项pte被更新前所指向的物理页是Y,被更新后所指向的物理页是Y',则从backmap(Y)中删除pte对应的链表项,并按3.3所示的方法在Y'的反向映射链表backmap(Y')中创建一个新的链表项。当X没有影子页表页时,将pte的物理地址及R/W位和P位填入该反向映射链表项中;当X存在影子页表页,且pte对应的影子页表项为spte时,将spte的物理地址及R/W位和P位填入该反向映射链表项中;4.2按如下方法更新"页表连续更新计数器"4.2.1更新页表页X的"连续更新计数器"。检査页表页X的上一级影子页表项中的A位,如果A位为0,表明X未被CPU用于进行地址转换,将X的连续更新计数器加1;如果A位为1,表明自操作系统上次更新X以来CPU利用X进行了一次或多次地址转换,将X的连续更新计数器清O;4.2.2判断页表页X的"连续更新计数器"的值是否达到某个给定的常量值Alpha(Alpha取值为16《^p/^S32),如果是则转第五步;否则,转第三步。第五步,按如下方法对上述被更新的页表页X进行设置,采用懒惰式页表更新方法完成对X的后续更新5.1消除反向映射。如果X没有影子页表页,设X共有C个页表项,则对X的每一个页表项;A(其中B"C)所指向的物理页^,在backmap(")中去掉/7g所对应的链表项。如果X被创建了影子页表X',则对X'的每一个页表项^fe,(其中1S/《C)所指向的物理页17,在backraap(i;')中去掉^^所对应的反向映射链表项;5.2设置反向映射中的页表项。设页表页X的反向映射链表backmap(X)中共有『个页表项/7A,…,/7A,…,/^『,其中l《xS『,则对每个页表项p^,根据p^是否为最末级页表的页表项,分两种情况处理*如果p^是最末级页表的页表项,则根据3.l所述的影子页表创建规则,p^必是影子页表项,而且其R/W位已经被修改为O,此时,根据反向映射项中记录的户A的R/W位的值,将;A的R/W位恢复为其原来的值,即为1,表明可写,转第三步;*如果;K不是最末级页表的页表项,则首先判断声^是否是影子页表项,如果pA是影子页表项,则将其P位置为0;如果;^x是虚拟机中页表的页表项,则为所在的页表页及其所有上级页表页创建影子页表页,如果/^所在的页表页或其某个上级页表页己经被创建了影子页表页,则不需要创建多份。创建页表页后,按3.2的方法进行影子页表项的内容修正,并构建相应的反向映射。之后,将对应的影子页表项^^的P位置为0,转第三步。对页表页X而言,由于映射X的最末级页表项中的R/W位被恢复为1,从而操作系统对X的后续批量更新不会导致页故障,相应的影子页表(如果有的话)也不进行同步更新。第六步,当P位导致的页故障产生时,CPU给出被更新的页表项pte的物理地址,则按如下方法对pte所在的页表页X进行设置6.1按如下方法,对X的后续更新不再采用懒惰式页表更新方法6.1.1根据4.1.2所示的方法,判断是否需要为页表页X创建影子页表页。如果X存在影子页表页X',则对影子页表页X'的每个影子页表项,执行4.1.3与4.1.4所示的页表项更新方法,包括物理地址修正、R/W位修正和反向映射创建;6.1.2考查backmap(X)中的每个页表项p^,根据pA是否是最末级的页表项,分两种情况进行处理*如果;A是最末级页表的页表项,则将;A的R/W位重新置0,以对页表页X重新施加写保护;*如果p^不是最末级页表的页表项,则根据5.2的方法,声^一定是一个影子页表项,先在X的反向映射链表中,找出/7^所对应链表项,取出其中保存的p^的原始的P位的值,将其恢复到p^中。一般来说,P位的值为l,表示允许CP^理地址区间是[O,户)与[Mw+尸,M,),其中物理地址区间[M,一+尸,M,)中的可用物理内存的物理地址本身就是正确的,不需要创建影子页表进行修正。因此在本发明的第三步中,只有当某个最末级页表项中填入的物理地址在[O,尸)之间,才需要创建影子页表页,并对物理地址进行修正;同时本发明的第四步也只需要对创建了影子页表页的部分虚拟机页表页进行同步更新操作。根据实验,P—般取值为16MB左右,而实际应用时分配给每个虚拟机的内存量都至少在256MB以上。按此数据,一套页表中最少只需要为十六分之一的页表页创建影子页表页;2.采用本发明第五步懒惰式影子页表更新方法,进一步降低了影子页表同步导致的性能损失。在X86体系结构下,每个页表页共有512或1024个页表项,当操作系统更新某个页表页的全部页表项时,现有的其它丽U虚拟化方法会产生512或1024个页故障,并进行512或1024次影子页表同步更新。而采用本发明时,当操作系统连续更新了给定的常数Alpha个页表项后,就会进入懒惰模式。假设Alpha取值为16,则进入懒惰模式后,操作系统更新该页表页将不再产生页故障,也无需进行影子页表同步更新。等到该页表页第一次被CPU使用时,会产生一次页故障,并对所有的页表项进行同步更新。因此本发明将批量更新一个页表页的所产生的页故障数量从512或1024次降至17次,从而大大降低了页故障的处理时间。经过测试,本发明的画U虚拟化性能是国际同类MMU虚拟化方法的1.73.4倍,内存消耗则不到国际同类方法的一半。图1为X86体系结构的页表结构示意图;图2为X86体系结构的页表项内容;图3为本发明的总体流程图;图4为本发明与国际同类方法的性能对比图。具体实施方式本发明己经在三种X86体系结构上成功实施,这三种X86体系结构分别为争32位、且不打开物理地址扩展(PAE)功能*32位、且打开物理地址扩展(PAE)功能*64位X86体系结构图1给出了上述三种X86体系结构的页表结构,这三种X86体系结构的页表结构是相同的,但页表参数不同。页表由多级页表页组成,每级页表页的大小都固定为4KB,CPU的CR3寄存器中存储了当前CPU正在使用的页表的第一级页表页的物理地址,每个第一级页表项都指向一个第二级页表页,第二级页表页中的每个第二级页表项都指向一个第三级页表页,依此类推。最末级页表页中的每个最末级页表项都指向一个物理页,这些物理页中存放了CPU需要访问的程序和数据。如果某种X86体系结构的页表共有n级,则该X86体系结构的虚拟地址就被划分为n+l段,其中虚拟地址高位的n段分别对应于每级页表的索引。虚拟地址的最低位的若干比特被称为"页偏移",用于在最末级页表所指向的物理页中定位出最终的物理地址。CPU的一次虚拟地址转换过程是这样的首先CPU根据CR3寄存器找到当前所使用的页表的第一级页表页的起始物理地址,再根据虚拟地址最高位的第一级索引的值,找到该虚拟地址所对应的第一级页表项。再根据虚拟地址的第二级索引的值,在第一级页表项所指向的第二级页表页中,找出相应的第二级页表项,依此类推,直到找到最末级页表项所指向的物理页后,再将虚拟地址最低位的页偏移与物理页的起始地址相加,得到最终的物理地址。上述三种X86体系结构对应的页表参数分别为*32位、且不打开物理地址扩展(PAE)功能页表最多有两级,每级页表共有1024个页表项,每个页表项是32位。虚拟地址是32位,其中第一级和第二级索引都是10比特,分别是第虚拟地址的第22位到第31位和第12位到第21位;*32位、且打开物理地址扩展(PAE)功能页表最多有三级,第一级页表共4个页表项,第二、第三级页表都是512个页表项,每个页表项是64位。虚拟地址是32位,其中第一级索引是2比特,即虚拟地址的第30和第31位,第二、第三级索引都是9位,分别是第21到第29位和第12到第20位;參64位X86体系结构页表最多有四级,每级页表都是512个页表项,每个页表项是64位。虚拟地址是48位,每级索引都是9位,分别为4739、38~30、29~21、20~12。上述三种X86体系结构页表项的页偏移都是12比特,即虚拟地址的第0位至第11位。图2是X86体系结构的页表项内容,每个页表项都是32或64比特,也称为32或64位,其中第12至31(或63)位共20(或52)比特给出了下一级页表页或物理页的起始物理地址,剩余的第0至第11位共12比特则是各种标志位。这些标志位包括*第O位,即P(Present,存在)位,如果该位被置为0,表示该页表项没有指向下一级页表或物理页,则CPU利用该页表项进行地址转换时会产生页故障;*第1位,即R/W(Read/Write,读/写)位,如被置为0,则该页表项对应的所有物理页均为只读,写操作将产生页故障;*第5位,即A(Accessed,访问)位,是由CPU设置的,操作系统一般将A位初始化为O,表示CPU未使用该页表项进行过地址转换,当CPU第一次利用该页表项进行地址转换时,自动将该位置l。图3为本发明的流程图。本发明的流程是-1.为虚拟机分配物理内存。2.根据这些信息为每个虚拟机创建并修正E820表,保证修正后每个虚拟机的E820表的物理地址区间[0,P)总是可用的。3.判断虚拟机是否加载了新页表,若加载了,则为新页表创建影子页表,再对影子页表的页表项中的物理地址和R/W位进行修正,再基于修正后的影子页表创建反向映射。接下来设置"页表连续更新计数器"的初值为O,并将所有影子页表项的A位置O。最后将该影子页表装入到CPU的CR3寄存器中,作为虚拟机的当前页表使用。完成上述工作后,转第4步。若未加载新页表,则直接转第4步。4.判断CPU是否产生了页故障,如果CPU在进行虚拟地址到物理地址的转换过程中产生了页故障,则采用与国际同类方法完全一样的方法获得CPU提供的页故障错误码,错误码指出了该页故障产生的原因。如果没有产生页故障,或错误码指出的页故障产生的原因不是由页表项的P位或R/W位导致的,则转第3步进入下一次循环。如果该页故障是由于页表项的P位为O导致的,则转第6步。如果该页故障是由于页表项的R/W位为O导致的,则表明虚拟机中的操作系统正在更新某个页表项,CPU提供了被更新的页表项的地址,处理该页表项的更新,包括接收页故障,并判断是否需要为该页表项所在的页表页及其所有上级页表页创建影子页表,对影子页表项的物理地址和R/W位的修正,以及对反向映射链表的操作;然后根据导致该页故障的影子页表项的A位是否为O,将被修改的页表页的"页表连续更新计数器"清0或加1,接下来判断该连续更新计数器的值是否达到预定次数Alpha(Alpha取值为16S^^"S32),如果达到了,则转第5步;否则,转第3步进入下一次循环。5.进行相关设置,按懒惰式页表更新方法处理该页表页的后续更新,转3进入下一次循环。6.当接收到CPU产生的由P位导致的页故障后,表明CPU第一次使用了某个正在按懒惰式页表更新方法进行更新的页表页,通过相关设置,停止按懒惰式页表更新方法处理该页表页的后续更新,将页表连续更新计数器清O,转3进入下一次循环。图4是本发明与国际同类方法的性能对比图,虚拟化技术使得一台物理计算机上能够同时运行多个虚拟机,但由于醒U虚拟化等造成的开销,使得虚拟机中运行的操作系统的性能必然比不上直接运行在真实计算机上的操作系统,醒U虚拟化方法的目标是尽可能地降低虚拟化带来的性能损失。.图4的横坐标是四个测试项,分别是操作系统的内核综合性能、应用程序执行吞吐率、进程创建性能和8个并发进程的脚本执行效率,它们都是专业性能测试工具UnixBench4.1.0的标准测试项,图中的数据也都是由该工具测试得出的。上述四个测试项的每一项中对应三个数据,从左到右分别是运行于VMwareESXServer中的Linux、半虚拟化后作为Xen的domO的同版本Linux、采用了本发明的同版本Linux。图4的纵坐标是这四种Li加x的性能相对于未经虚拟化的标准Linux的性能的百分比值,例如在OS内核综合性能一项测试中,VMware中的Linux该项得分是未经虚拟化的Linux的36%,XendomOLinux该项得分是62%,而本发明则是88%。在操作系统访问页表最频繁的进程创建(processcreation)测试项中,VMware是15.8%,XendomO是30.3%,而本发明则为54.1%,是VMware的3.4倍、是XendomO的1.7倍。图4中的数据说明,本发明的MMU虚拟化性能比国际主流丽U虚拟化方法高。权利要求1.一种X86体系结构内存管理单元虚拟化方法,其特征在于包括以下步骤第一步,为虚拟机分配物理内存即在X86计算机引导时为同时运行于该计算机上的n个虚拟机预留出所需的物理内存,并保证所分配的物理内存的物理地址是连续的,为n个虚拟机预留的内存分别为[0,M1),[M1,M2),…,[Mi-1,Mi),…,[Mn-1,Mn),其中Mn=M,1≤i≤n,M为X86计算机物理内存的大小,物理内存物理地址区间为[0,M);第二步,为每个虚拟机创建并修正E820表2.1为每个虚拟机创建E820表每个虚拟机的E820表中的物理地址区间都是[0,M),第i个虚拟机的E820表中只有物理地址区间为[Mi-1,Mi)的物理内存被标记为可用内存,其它两块物理地址区间[0,Mi-1)和[Mi,M)都被标记为不可用内存;2.2为每个虚拟机修正E820表;第三步,判断虚拟机是否加载了新页表,若加载了,则按如下方法构建影子页表和反向映射,若未加载,转第四步3.1对第i个虚拟机的每个页表页,如果满足如下任意一个条件,则为该页表页创建影子页表页,否则不创建影子页表页条件一,i≠1,且该页表页中存在一个页表项,该页表项中填入的物理地址x满足x∈[0,P);条件二,该页表页中存在一个页表项pte,pte中填入的物理地址X是下一级页表页的地址,即pte不是最末级页表的页表项,并且物理地址为X的下一级页表页需要创建影子页表页;条件三,该页表页是整套页表中最末级的页表页,且存在某个页表项pte,使得pte中填入的物理地址X是某个页表页的地址;3.2为第i个虚拟机构建影子页表后,检查所创建的每个影子页表页的每个影子页表项spte,按如下方法对影子页表项进行修正3.2.1检查影子页表项spte是否为最末级页表项,如果spte不是最末级页表项,转3.2.2;如果spte是最末级页表项,则若i≠1且spte中填入的物理地址x满足x∈[0,P)时,将spte中填入的物理地址x修正为Mi-1+x,转3.3;若spte中填入的物理地址x是某个页表页的起始物理地址,则将这些spte的R/W位改为0,转3.3;3.2.2检查spte所指向的物理地址为x的页表页是否被创建了影子页表页x′,如果是,则将spte中填入的物理地址x修正为x′,转3.3;3.3创建反向映射backmap,反向映射采用链表的数据结构,链表的每个节点记录如下信息指向该物理页的页表项的物理地址、该页表项的P位与R/W位的值;设修正过的影子页表共有m个影子页表页,分别为X1,…,Xk,…,Xm,其中1≤k≤m,第k个影子页表页Xk共有nk个影子页表项,则对第j个影子页表项sptej,其中1≤j≤nk,设sptej中填入的物理地址为Y,则将sptej的物理地址以及P位与R/W位的值加入到Y的反向映射中,用backmap(Y)表示物理页Y的所有反向映射链表项的集合;3.4为第i个虚拟机的每个页表页都设置一个“页表连续更新计数器”,初始值为0,并将创建的所有影子页表页的所有影子页表项的A位置0;3.5将影子页表装入CPU的CR3寄存器中,通知CPU使用影子页表进行虚拟地址到物理地址的转换,转第四步;第四步,如果没有接收到CPU产生的页故障,或接收到的页故障既不是P位导致的,也不是R/W位导致的,则转第三步;如果接收到CPU产生的页故障,则如果接收的页故障是由P位导致的,转第六步;如果接收的页故障是由R/W位导致的,则更新页表项和“页表连续更新计数器”4.1按如下方法更新页表项4.1.1接收页故障;4.1.2如果pte所在的页表页X没有影子页表页,则根据3.1所示的条件判断是否需要为X创建影子页表页,如果需要为X创建影子页表页,则根据3.1所示的条件考查是否需要为X的上一级页表页创建影子页表页;4.1.3如果pte所在的页表页X在此前或在4.1.2中被创建了影子页表页X’,设pte在X’中对应的影子页表项为spte,则根据3.2所示的方法修正影子页表项spte中的物理地址和R/W位;4.1.4设该页表项pte被更新前所指向的物理页是Y,被更新后所指向的物理页是Y’,则从backmap(Y)中删除pte对应的链表项,并按3.3所示的方法在Y’的反向映射链表backmap(Y’)中创建一个新的链表项;当X没有影子页表页时,将pte的物理地址及R/W位和P位填入该反向映射链表项中;当X存在影子页表页,且pte对应的影子页表项为spte时,将spte的物理地址及R/W位和P位填入该反向映射链表项中;4.2按如下方法更新“页表连续更新计数器”4.2.1更新页表页X的“连续更新计数器”检查页表页X的上一级影子页表项中的A位,如果A位为0,将X的连续更新计数器加1;如果A位为1,将X的连续更新计数器清0;4.2.2判断页表页X的“连续更新计数器”的值是否达到常量值Alpha,如果是则转第五步;否则,转第三步;第五步,按如下方法对上述被更新的页表页X进行设置,采用懒惰式页表更新方法完成对X的后续更新5.1消除反向映射如果X没有影子页表页,则对X的每一个页表项ptel所指向的物理页Yl,其中1≤l≤C,C为X的页表项个数,在backmap(Yl)中去掉ptel所对应的链表项,如果X被创建了影子页表X’,则对X’的每一个页表项sptel所指向的物理页Y′l,在backmap(Y′l)中去掉sptel所对应的反向映射链表项;5.2设置反向映射中的页表项设页表页X的反向映射链表backmap(X)中共有W个页表项pte1,…,ptex,…,pteW,其中1≤x≤W,则对每个页表项ptex,根据ptex是否为最末级页表的页表项,分两种情况处理●如果ptex是最末级页表的页表项,根据反向映射项中记录的ptex的R/W位的值,将ptex的R/W位恢复为其原来的值,即为1,转第三步;●如果ptex不是最末级页表的页表项,则首先判断ptex是否是影子页表项,如果ptex是影子页表项,则将其P位置为0;如果ptex是虚拟机中页表的页表项,则为ptex所在的页表页及其所有上级页表页创建影子页表页,如果ptex所在的页表页或其某个上级页表页已经被创建了影子页表页,则不需要创建多份;创建页表页后,按3.2的方法进行影子页表项的内容修正,并构建相应的反向映射,且将ptex对应的影子页表项sptex的P位置为0,转第三步;第六步,当P位导致的页故障产生时,CPU给出被更新的页表项pte的物理地址,按如下方法对pte所在的页表页X进行设置6.1按如下方法,对X的后续更新不再采用懒惰式页表更新方法6.1.1根据4.1.2所示的方法判断是否需要为页表页X创建影子页表页,如果X存在影子页表页X’,则对影子页表页X’的每个影子页表项,执行4.1.3与4.1.4所示的页表项更新方法,包括物理地址修正、R/W位修正和反向映射创建;6.1.2考查backmap(X)中的每个页表项ptex,根据ptex是否是最末级的页表项,分两种情况进行处理●如果ptex是最末级页表的页表项,则将ptex的R/W位重新置0;●如果ptex不是最末级页表的页表项,则先在X的反向映射链表中找出ptex所对应链表项,取出其中保存的ptex的原始的P位的值,将其恢复到ptex中;6.2将X的“页表连续更新计数器”清0,转第三步。2.如权利要求1所述的X86体系结构内存管理单元虚拟化方法,其特征在于所述为每个虚拟机修正E820表的方法是2.2.1将物理地址区间[O,尸)标记为可用内存,户从实验得出;2.2.2将物理地址区间[尸,M,q+户)标记为不可用内存;2.2.3将物理地址区间[M^+P,M,)标记为可用内存;、2.2.4物理地址区间[M,.,M)仍标记为不可用内存。3.如权利要求2所述的X86体系结构内存管理单元虚拟化方法,其特征在于所述尸为應B。4.如权利要求1所述的X86体系结构内存管理单元虚拟化方法,其特征在于所述Alpha取值为16《爿/;toS32。全文摘要本发明公开了一种X86体系结构内存管理单元虚拟化方法,要解决的技术问题是提供一种内存管理单元虚拟化方法,大幅减少影子页表页的数量,降低影子页表导致的内存开销和影子页表同步导致的性能损失。技术方案是先为虚拟机分配物理内存;然后为每个虚拟机创建并修正E820表;当虚拟机加载新页表时,构建影子页表和反向映射;当虚拟机未加载新页表时,如果接收到CPU产生的页故障,则根据情况采用懒惰式页表更新方法批量修改页表。采用本发明能大幅减少影子页表页的数量,从而降低影子页表所导致的内存开销和影子页表同步导致的性能损失;本发明基于懒惰式影子页表更新方法进一步降低了影子页表同步导致的性能损失。文档编号G06F12/08GK101620573SQ200910043830公开日2010年1月6日申请日期2009年7月3日优先权日2009年7月3日发明者刘晓建,吴庆波,孔金珠,张卫华,戴华东,易晓东,谭郁松申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1