发明名称 X86体系结构内存管理单元虚拟化方法
摘要 本发明公开了一种X86体系结构内存管理单元虚拟化方法,要解决的技术问题是:提供一种内存管理单元虚拟化方法,大幅减少影子页表页的数量,降低影子页表导致的内存开销和影子页表同步导致的性能损失。技术方案是先为虚拟机分配物理内存;然后为每个虚拟机创建并修正E820表;当虚拟机加载新页表时,构建影子页表和反向映射;当虚拟机未加载新页表时,如果接收到CPU产生的页故障,则根据情况采用懒惰式页表更新方法批量修改页表。采用本发明能大幅减少影子页表页的数量,从而降低影子页表所导致的内存开销和影子页表同步导致的性能损失;本发明基于懒惰式影子页表更新方法进一步降低了影子页表同步导致的性能损失。
申请公布号 CN101620573A 申请公布日期 2010.01.06
申请号 CN200910043830.1 申请日期 2009.07.03
申请人 中国人民解放军国防科学技术大学 发明人 易晓东;谭郁松;刘晓建;张卫华;戴华东;吴庆波;孔金珠
分类号 G06F12/08(2006.01)I;G06F12/10(2006.01)I;G06F9/455(2006.01)I 主分类号 G06F12/08(2006.01)I
代理机构 国防科技大学专利服务中心 代理人 郭 敏
主权项 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,转第三步。
地址 410073湖南省长沙市砚瓦池正街47号