CN101882113B - 一种基于客户操作系统内核代码替换的内存虚拟化方法 - Google Patents
一种基于客户操作系统内核代码替换的内存虚拟化方法 Download PDFInfo
- Publication number
- CN101882113B CN101882113B CN200910083149XA CN200910083149A CN101882113B CN 101882113 B CN101882113 B CN 101882113B CN 200910083149X A CN200910083149X A CN 200910083149XA CN 200910083149 A CN200910083149 A CN 200910083149A CN 101882113 B CN101882113 B CN 101882113B
- Authority
- CN
- China
- Prior art keywords
- page
- pte
- pde
- guest
- old
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 84
- 230000015654 memory Effects 0.000 title claims abstract description 74
- 230000008569 process Effects 0.000 claims abstract description 38
- 238000011084 recovery Methods 0.000 claims abstract description 38
- 238000013507 mapping Methods 0.000 claims abstract description 14
- 238000006243 chemical reaction Methods 0.000 claims abstract description 5
- 230000002457 bidirectional effect Effects 0.000 claims abstract description 3
- 238000005516 engineering process Methods 0.000 description 17
- 230000007246 mechanism Effects 0.000 description 13
- 230000006872 improvement Effects 0.000 description 7
- 238000012986 modification Methods 0.000 description 6
- 230000004048 modification Effects 0.000 description 6
- 238000013459 approach Methods 0.000 description 5
- 230000006870 function Effects 0.000 description 5
- 238000013461 design Methods 0.000 description 4
- 238000004088 simulation Methods 0.000 description 4
- 238000012360 testing method Methods 0.000 description 4
- 238000013519 translation Methods 0.000 description 4
- 230000000694 effects Effects 0.000 description 3
- 230000006399 behavior Effects 0.000 description 2
- 230000008092 positive effect Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 230000008859 change Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000018109 developmental process Effects 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 239000007943 implant Substances 0.000 description 1
- 238000002513 implantation Methods 0.000 description 1
- 230000004793 poor memory Effects 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000012800 visualization Methods 0.000 description 1
Images
Landscapes
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明公开了一种基于客户操作系统内核代码替换的内存虚拟化方法,属于计算机软件技术领域。本发明的方法为:1)将所有指向页表页或页目录页的页表项PTE转换为受保护的页表项P-PTE;同时为每个进程维护一个恢复表;2)在VMM内部建立从客户到主机的内存页面号映射表G2H和从主机到客户间的内存页面号映射表H2G,完成客户和主机间的双向内存地址转换;3)根据映射表G2H和H2G实现页目录项PDE、普通页表项PTE和P-PTE的读取,以及PDE和PTE的写入。与现有技术现比,本发明在不修改Guest OS内核源代码的前提下,内存虚拟化的开销小、性能高,从而解决现有全虚拟化系统中的内存虚拟化性能较差的问题。
Description
技术领域
本发明涉及一种虚拟化技术,特别是涉及一种虚拟机管理器的内存虚拟化技术,属于计算机软件技术领域。
背景技术
虚拟机(Virtual Machine,VM)技术源于上世纪60年代,其核心思想是:在一台物理主机上虚拟出多个虚拟计算机(VM),其上能同时运行多个独立的操作系统,这些客户操作系统(Guest OS)通过虚拟机管理器(Virtual Machine Monitor,VMM)访问实际的物理资源。当前存在几种不同的虚拟技术:一种是半虚拟化技术(Paravirtualization),需要对Guest OS的源代码做一些修改;另一种是全虚拟化技术(Full Virtualization),Guest OS无需任何修改。
我们知道,半虚拟化通过修改Guest OS源代码可以获得很好的性能,而全虚拟化技术则是以降低性能来提高兼容性(无需修改Guest OS的源代码)。近来新处理器的开发缩短了这方面的差距,如Intel VT(虚拟技术,Virtualization Technology)和AMD SVM(安全虚拟机,Secure Virtual Machine)芯片从硬件上支持了虚拟技术,试图取代半虚拟化技术。
以Intel VT为例,它增加了在虚拟状态下的两种处理器工作模式:Root操作模式和Non-root操作模式。VMM运行在Root操作模式下,Guest OS运行在Non-root操作模式下。开始时通过执行VMXON指令进入虚拟化状态,处理器运行在Root操作模式下,执行VMM的代码,当VMM要运行一个VM时,执行VMLAUNCH指令使处理器发生VM entry,进入Non-root操作模式,运行Guest OS指令。此时,若遇到敏感指令,处理器会发生VM-VMM切换,回到Root操作模式,由VMM进行处理。处理完成后,通过VMRESUME指令,再次发生VM entry,进入Non-root操作模式继续运行Guest OS的指令。硬件辅助虚拟化技术很好地支持了全虚拟化(不修改Guest OS源码)并降低了VMM的实现难度(不需要动态二进制翻译)。
但是加入了硬件辅助的全虚拟化性能仍然和半虚拟化技术有一定差距。其主要原因是Guest OS仍然有过多的VM-VMM切换,频繁从Non-root模式切换到Root模式,使得虚拟化的开销太大。经过测试,每次VM-VMM切换导致的系统开销达到几千个CPU时钟周期。特别是在客户虚拟机存在大量页表操作和I/O操作的时候,会产生大量的VM-VMM切换,性能下降尤其明显。
本发明主要针对的是如何减少内存虚拟化的开销,以提高内存虚拟化的性能。下面简单的介绍一下传统的内存虚拟化方法:
半虚拟化方法通过修改Guest OS的源代码,避免虚拟化带来的开销。在内存虚拟化方面,通过修改Guest OS中的页表访问相关的源码,实现了在页表项(Page Table Entry,PTE)中直接存放实际的机器内存页面号,方便CPU的内存管理单元(Memory Management Unit,MMU)直接把虚拟内存地址转换为机器内存地址。在操作系统进行页面管理时,任何对PTE的读取操作,其修改后的代码都会通过访问机器内存页面号到物理内存页面号的转换表,返回包含物理页面号的页表项;任何对页表项的写操作,由于所有的页表页都被VMM标记为只读,因而可通过页面中断(Page Fault)进入VMM中,由VMM进行页面管理。因为半虚拟化方法仅在有限的读写页表页操作上引入了非常有限的开销,所以半虚拟化方法能达到较高的性能。但半虚拟化方法需要修改Guest OS的源码,不适用于无法得到源码的操作系统。
只有全虚拟化方法才能让诸如Windows这类无法得到源码的操作系统作为Guest OS使用。在全虚拟化方法中,通常采用影子页表(Shadow Page Table)机制实现内存虚拟化。VMM通过为Guest OS中常被使用的页表页在VMM中维护一套对应的影子页表,影子页表的页表项中存放对应的机器内存页面号,CPU的内存管理单元通过影子页表完成从虚拟内存地址到机器内存地址的转换。Guest OS中的页表仅被其自身访问用于在客户物理地址空间上管理内存。VMM通过把Guest OS中的页表页标记为只读,从而可以捕获所有对页表项的写操作,进而可以同步地更新影子页表中的页表项。同时,VMM对影子页表项的标志位进行特殊的设置,以实现当CPU需要修改影子页表的访问(Access)标志位和写(Dirty)标志位时,能够即时对Guest OS中原始页表项(原始PTE)也做同样的修改。这种频繁的同步操作同时会导致大量的VM-VMM切换,使得采用全虚拟化方法的系统性能明显低于采用半虚拟化方法的系统。
从上述分析可以看出,传统的内存虚拟化方法都有明显的局限性。半虚拟化方法可以达到很好的性能,但是因为要修改Guest OS的源代码,使得它无法运行那些流行的非开源操作系统,比如Window系列操作系统;全虚拟化方法虽然无需修改Guest OS的源代码,但是由于VM-VMM切换的大量存在,使得其性能指标不甚理想。
一个合理的做法就是:将半虚拟化和全虚拟化技术结合起来,在不修改Guest OS内核源代码的前提下,在二进制代码层面上,动态替换Guest OS的内核代码,达到和半虚拟化方法相似的效果。要达到这个目标,有两件事情需要完成:一是如何动态替换Guest的内核代码,二是替换成怎样的代码。
针对第一个问题,参考2009年罗英伟等人提出的中国专利申请(申请人:北京大学,申请号:200910081513.9,发明名称:一种虚拟机管理器的客户操作系统内核代码动态替换方法),其中提出了一种能够在二进制层面对客户操作系统内核代码做动态替换的方法。本发明基于此方法,针对第二个问题提出一个全新的内存虚拟化方法,该方法可以结合半虚拟化和全虚拟化方法的优势,显著地减少页面中断导致的VM-VMM切换,从而降低其带来的系统开销,能够在不修改Guest OS源代码也可达到半虚拟化的效果。
发明内容
本发明的目的是建立一种基于客户操作系统内核代码替换的新的内存虚拟化方法,在不修改Guest OS内核源代码的前提下,尽量减少内存虚拟化的开销,以提高内存虚拟化的性能,从而解决现有全虚拟化系统中的内存虚拟化性能较差的问题。
这里,我们首先要保证这种新的内存半虚拟化方法是正确的,经过我们替换的内核代码必须能够准确无误的执行,保持和未修改之前一样的行为,任何可能改变代码行为的情况都是不允许的。只有在保证正确性的前提下,性能提升才有意义。
此外,我们还要保证新的内存半虚拟化方法是有效的,替换代码的执行效率应该高于原来的代码,这样才能保证性能的提升。
虚拟机直接页表访问机制
新的内存半虚拟化方法的设计目标是避免全虚拟化中影子页表同步的开销。为此我们引入了一种虚拟机直接页表访问机制,它允许在不修改Guest OS的源代码的情况下,把Guest OS页表项中的客户物理内存页面号替换成机器内存页面号,实现从虚拟内存地址到机器内存地址的映射。在VMM中可不再为Guest OS维护相应的影子页表,避免了影子页表与Guest OS页表间同步的开销。我们把在Guest OS中那些存放着机器页面号的页表称为直接页表(Direct Page Table),把使用着直接页表结构的进程称为半虚拟化进程(Para-virtualized Process)。在半虚拟化进程运行时,MMU可通过直接页表即可完成虚拟地址到机器地址的转换。图1描述了典型的直接页表结构。这里的难点问题在于,如何让Guest OS在管理半虚拟化进程的直接页表时,仍然使用客户物理地址读写页表项。为此,我们把直接页表结构中所有指向页表页或页目录页的页表项转换为具有特殊格式的受保护的页表项(Protected PTE,P-PTE),其中P-PTE的存在位(present bit)被清零。因此访问页表页或页目录页的访问操作时,会因为MMU转换虚拟地址到机器地址使用某个P-PTE,而发生页面中断(Page Fault),进而陷入到VMM中来(发生VM-VMM切换)。P-PTE的状态位具有特殊的模式,以便能够把P-PTE和正常的PTE区分开来,我们会在实施例中给出具体的P-PTE格式。
Guest OS访问页表项,还需要知道客户物理地址到主机物理地址之间的转换关系。在虚拟机启动时,我们在VMM内部建立起从客户到主机(Guest to Host,G2H)和从主机到客户(Host to Guest,H2G)间的内存页面号映射表。G2H负责把客户内存页面号映射到主机内存页面号,而H2G则做相反的映射。这两个映射表基本上是静态的,除非VMM需要调整分配给虚拟机的主机物理内存时才可能发生变化。GuestOS中的代码可以通过访问链入到Guest OS地址空间中的G2H和H2G表,完成客户和主机间的双向内存地址转换,从而避免陷入到VMM中。
恢复表
从图1中还可以看出:我们为每个进程维护一个恢复表(Recovery Table,RT)。恢复表也是进程空间中的一个页表。由于我们对P-PTE做了修改,我们会将P-PTE的原始值保存在恢复表中,以便在需要时可以获得。在P-PTE中保存有记录其原始PTE的所处在的恢复表的表号和原始值位置信息(P-PTE的具体格式见实施例),因而在知道P-PTE的值时,就可以通过路径1定位到其在恢复表中对应的原始PTE。从而可以通过原始PTE来访问页表页的虚拟地址,即可绕过P-PTE完成对页表页的读写操作,也就是图中的路径2。当我们植入到Guest OS中的代码来完成此操作时,就可不必陷出到VMM,并且读写操作会通过MMU完成对原始PTE的Dirty位和Access位的更新,而植入的代码(即生成的替换代码)也知道如何根据G2H写入正确的值到页表页,根据H2G从页表页读出正确的值。
恢复表允许我们进行进程级的恢复(Process-level Recovery)或虚拟机级的恢复(OS-levelRecovery)。在我们的设计中,每个恢复表都需要占用一个内核空间的PDE,而我们可以从Guest OS中借用的PDE是有限的。因此,只有有限数目的进程可同时被半虚拟化,但需要半虚拟化的进程数量超过限制时,我们就需要做进程级别的恢复,把通过最近最少使用(LRU)方式探测出来的最不常用的进程恢复为普通进程。恢复的过程涉及到根据G2H和H2G表把直接页表页中的主机页面号还原回客户页面号,并对P-PTE通过恢复表中的原始PTE进行还原,从而释放出其占用的恢复表给新的半虚拟化进程使用。
我们保留了Guest OS的部分地址空间用于维护恢复表、G2H表、H2G表以及植入代码地址空间。尽管Guest OS几乎不会使用这部分地址空间,但这部分地址空间仍然可能被Guest OS访问到。一旦如此,就需要做虚拟机级别的完全恢复。恢复包括把每个半虚拟化进程进行恢复和恢复所有被修改的调用点。
代码植入
由于直接页表的保护机制,在Guest OS中任何对页表页的访问都会导致其陷入到VMM(发生VM-VMM切换),频繁的陷入到VMM会降低虚拟化的性能,甚至于不及全虚拟化影子页表模式的性能。
由于传统的内存全虚拟化机制(影子页表)在面对内存密集型应用时,常常需要频繁地同步影子页表,而同步必须陷入到VMM中来完成,在这种情形下,无法通过生成替换代码来减少VM-VMM切换。但是,在新的内存半虚拟化中,我们引入代码替换【KeithAdams,Ole Agesen:A Comparison of Software and Hardware Techniques for x86Virtualization,ASPLOS’06第3页】以避免由于引入虚拟机直接页表访问机制而导致的过多的VM-VMM切换,从而达到高性能。在VMM中,我们按照陷入指令在Guest OS中的具体位置,对其做统计计数,以便找出那些导致大量VM-VMM切换的陷入指令,我们称之为热点指令。在虚拟机直接页表访问机制下,我们特别关注那些导致缺页或导致页保护错误的热点指令,这些热点指令导致了绝大多数的VM-VMM切换。我们可以利用G2H和H2G表以及虚拟机直接页表访问机制来生成替换这些热点指令的新代码,植入Guest OS中。在Guest OS中,新植入的代码不经陷出到VMM,就可完成对页表的透明管理。
在这里,我们对Guest OS内核代码生成的替换体现在两个方面:一是引入了虚拟机直接页表访问机制,二是植入了新的替换热点的代码。
发明的优点与积极效果:
本发明提出的基于客户操作系统内核代码动态替换技术的新的内存虚拟化方法具有以下优点与积极效果:
1.平台无关性。无需修改Guest OS的源代码,完全将Guest OS看作一个黑盒,我们的新的内存虚拟化工作完全是在二进制代码层面上做的。从这点来看,我们遵从了全虚拟化方法的基本原则,而避免了半虚拟化需要修改Guest OS源代码的局限性。
2.有效性。我们在同一台物理计算机上分别在裸机、未修改的全虚拟化VMM(KVM)、采用新的内存半虚拟化的VMM(KVM-rp)三种情况下,运行同样配置的Linux内核编译程序(Linux Kernel Compile),对比测试了新的内存半虚拟化方法带来的性能提升。图2是测试结果,其中的纵坐标代表程序执行时间,而横坐标代表热点的消除个数。从图2中可以看出,在我们消除了15个左右热点的时候,采用新的内存半虚拟化的VMM(KVM-rp)的执行执行时间(266秒)已经非常接近裸机的执行执行时间(246秒),而大大低于未修改的全虚拟化VMM的执行时间(350秒)。从这个实验数据可以看出,我们的新的内存半虚拟化方法能够非常有效的提升内存虚拟化的性能。另外,我们还测试了新的内存虚拟化方法在四种基准测试程序(SpecJBB 2005、SpecCPU2006、Kernel Compile和WorstCase,一个我们自己编写的程序,用于测试裸机和虚拟机在处理缺页中断上的性能差别,因为WorstCase程序平均每次访问内存操作都会引起一个缺页中断)上所带来的性能提升。图3以规格化的方式对比了所有基准测试程序的运行时间(其中JBB是个例外,因为JBB是通过Spec评分来衡量性能)。图中显示,新的内存虚拟化方法(KVM-rp)能够显著降低有大量缺页中断的程序的虚拟化开销,提高其运行速度。对于Kernel Compile,KVM-rp比KVM提高了32%的性能,基本上达到了裸机性能的91%。对于SpecJBB,由于多数导致VM-VMM切换的指令都是I/O指令,因而KVM-rp对SpecJBB的性能提升不显著,但也有3.2%的性能提升。对于WorstCase,KVM-rp的性能达到了裸机性能的80%,并且比KVM的性能提升了1倍还多。
3.透明性。我们新的内存半虚拟化方法对于普通用户来说完全是透明的,也就是说普通用户无需知道任何关于代码替换机制的细节。Guest OS启动以后,新的内存半虚拟化机制会自动的启用,无需任何用户干预,便可获得显著的性能提升。
附图说明
图1、直接页表结构;
图2、新的内存半虚拟化的性能提升曲线;
图3、新的内存半虚拟化带来的整体性能提升;
图4、被保护页表项的结构;
图5、G2H表的表项结构;
图6、H2G表的表项结构。
具体实施方式
本实施例基于开源的全虚拟化虚拟机管理器KVM,以及32位的Linux客户操作系统,实现了一个新的内存半虚拟化的原型系统。
1、建立一种虚拟机直接页表访问机制,它允许在不修改Guest OS的源代码的情况下,把Guest OS页表项中的客户物理内存页面号替换成机器内存页面号,实现从虚拟内存地址到机器内存地址的映射。前面提到过,那些指向页表的页表项会被保护起来,改写成特殊的格式,图4描述了一个受保护页表项的具体格式。受保护页表项最低的12位是页表项的属性位,我们全部置为零,以便和普通的页表项区分开来。第22到26位为恢复表号位,其中保存存储此受保护页表项原始值的恢复表的表号,第12位到21位为恢复表位置位,用于记录此受保护页表项原始值在恢复表的位置,从而我们可以通过被保护页表项,找到其在恢复表中对应的原始值。剩下的第27位到31位为普通页表和页目录标识位,用来标识此受保护页表项指向的是普通页表,还是页目录。
2、建立G2H和H2G表;对于32位的操作系统,我们简化了G2H和H2G表的设计,采用一对一的映射方式,每个方向的映射最多需要1M个4字节表项。图5描述了对32位操作系统设计的G2H的表项结构(G2H Table Entry)。G2H表项可通过客户页面号索引访问,G2H页表项中高20位记录的是主机页面号(host frame number);第0位作为存在位(present),表明客户页面是否对应着一个主机页面,如果没有相对应的主机页面,存在位就清零;第1位作为保护位(protected),说明对应的页面是否被保护起来,不允许客户操作系统中被未修改的代码直接访问。如果保护位为1,则表明对应的页面被用作页表页或页目录页,对受保护页面的访问需要通过P-PTE完成。
图6描述了H2G表的表项结构(H2G Table Entry)。其高20位记录的是主机页面号对应的客户页面号(guest frame number)。H2G表也包含有保护位(protected)和存在位(present),保护位用于说明一个主机页面被用作客户操作系统中的页面页或页目录页,因而被保护起来不会被客户操作系统直接访问;存在位则表明主机页面是否对应着客户页面。H2G表项中的2至第7位用于记录页面引用计数,后面会介绍引用计数的作用。
3、在读取直接页表中的页目录项(Page Directory Entry,PDE)和普通页表项(PTE)时,VMM通过查找H2G表,将其中保存的Host的物理地址转换为Guest的物理地址,从而可以返回客户操作系统可直接使用的PDE和PTE值。在读取受保护的页表项(P-PTE)时,需要根据P-PTE中保存的恢复表号和原始值位置信息,找到其在恢复表中对应的原始PTE值,然后通过查找H2G表将原始值转换为客户操作系统可直接使用的PDE和PTE值。
4、写入直接页表的操作要更复杂。我们分别对写入PDE和写入PTE两个方面做详细的说明:
当客户操作系统写入PDE时,根据新旧PDE是否存在,分为四种情形处理。如果旧PDE(旧PDE指写入前的值)本身的存在位为0(即PDE指向的页表不在内存中),则新PDE的值可直接写入。但如果旧PDE在H2G中的存在位为1(即该页表页已被保护过),则写入新PDE值前需要先把旧PDE对应的页表页的在H2G中的引用计数减1。如果在H2G中页面的引用计数为0,也就是说不存在任何半虚拟化进程使用该页面作为页表页时,则对应的页面将不再需要保护。H2G中的引用计数表明了在所有半虚拟化进程的直接页表中,共有多少个PDE引用到该页表作为页表页。页表页在多个进程间共享一般是在进程创建子进程时,子进程的页表从父进程中通过写时复制(Copy on Write,CoW)的方式直接继承过来而形成的。
·如果旧PDE所指页面的引用计数值为1,则当前进程是最后一个在直接页表中使用该页表的进程。在用新PDE替换了旧PDE后,这个旧PDE指向的页面就不再是需要保护的页表页,因而需要把它恢复为普通页面以便于正常访问。页面中所记录的主机页面号必须被转换为原来的客户页面号,因为这个页面还可能被其他非半虚拟化进程用作页表页。指向该页面的P-PTE也同时被还原为普通PTE。
·如果引用计数大于1,也就是说还存在半虚拟化进程在其直接页表结构中使用着该页表,我们可简单地把其引用计数减1即可。
如果新PDE指向一个新的还未被任何半虚拟化进程用作页表页的页面,即还未被保护的页面,那么就需要首先对该页面做保护:先在G2H和H2G表中标记该页面被保护,同时还要把任何引用该页面的页表项(PTE)转换为相应的P-PTE。在把PTE转换为P-PTE时,PTE的原始内容被保存在恢复表(Recovery Table,RT)中,而转换得到的P-PTE中记录了在恢复表中找到原始PTE表项的指针。如果新PDE指向一个已经被保护的页表页,说明这个页表页已经被其他进程用作其页表页了,则只需要把H2G表中的页面引用计数增加1。
当客户操作系统写入PTE时,我们首先检查新旧PTE是否包含相同的主机页面号。如果都包含同一主机页面号,则只需要替换末尾12位的页表项属性位即可。要注意,旧的PTE(旧PTE指写入前的值)可能就是一个P-PTE!在这种情况下,主机页面号是存放在恢复表的原始PTE中,对其修改也是发生在原始PTE中,需要根据P-PTE中保存的恢复表号和原始值位置信息,找到其在恢复表中对应的原始PTE值进行页表项属性位更新。如果新旧PTE的主机页面号不同,或者旧PTE是一个普通的PTE,再或者旧PTE不存在,则旧PTE可被直接覆盖。即使旧PTE是一个P-PTE,因它所指向的受保护页已经被PDE所维护(包括相应的引用计数),所以也可被直接覆盖,而无需任何附加操作。如果新的PTE指向一个普通的页(不是一个直接页表页),新PTE的内容可用于直接覆盖旧PTE。如果新的PTE指向的是一个页表页,我们就需要保护新PTE所指向的页(如果它还没有被保护),即将新PTE转换为P-PTE,然后我们用相应的P-PTE覆盖旧PTE,并将新PTE的内容保存在恢复表中。
下面以一条写PTE的指令为例来说明热点代码的替换生成:
mov%ebx,(%ebp)
这条指令的含义为:将ebx寄存器的值写入ebp寄存器指向的PTE。我们用下面的代码片段替换该指令,替换代码的执行效果和被替换的指令执行完后完全相同,但不再会产生VM-VMM切换。
1.push%eax
2.push%edx
3.mov%ebx,%edx
4.lea(%ebp),%eax
5.call rel320xfa0011e0;call the implantedfunction to write PTE
6.cmp$0x0,%eax
7.pop,%edx
8.pop,%eax
9.jcc rel32 0xfa010227;jump to the end of the code fragment
10.mov%ebx,(%ebp)
首先把eax和edx寄存器压栈(第1、2条指令),并把ebx寄存器的值和ebp寄存器指向的PTE的地址值分别赋值给edx和eax(第3、4条指令),edx和eax是函数0xfa0011e0的传入参数,被调用的函数0xfa0011e0将根据前面所讲的机制完成可在GuestOS中直接完成的写操作(第5条指令)。函数返回值通过eax寄存器传出,通过比较返回值是否为0(第6条指令),可以判断函数内是否完成了对指令的模拟。在通过栈先恢复了edx和eax寄存器的值后(第7、8条指令),根据前面判断结果,如果函数体内已经完成的对指令的模拟,则整个模拟过程结束,直接跳到片段结束位置(第9条指令);否则,执行原始指令以便通过页面中断(Page Fault)陷出到VMM中去模拟写PTE。
我们所提出的基于客户操作系统内核代码动态替换技术的新的内存虚拟化方法,其主要技术特征是:在不修改客户操作系统源代码的前提下,对客户操作系统页表结构做出部分调整,并结合客户操作系统内核代码动态替换技术,消除了全虚拟化VMM中内存虚拟化技术所带来的频繁VM-VMM切换,提高了全虚拟化VMM的内存虚拟化性能。因此,凡是符合客户操作系统内核代码动态替换、二进制代码级别消除VM-VMM切换的内存虚拟化技术都在本专利的保护范围之内。
Claims (8)
1.一种基于客户操作系统内核代码替换的内存虚拟化方法,其步骤为:
1)将直接页表结构中所有指向页表页或页目录页的页表项PTE转换为受保护的页表项P-PTE;同时为每个进程维护一个恢复表,用于记录P-PTE转换前的PTE值;
2)在虚拟机管理器VMM内部建立从客户到主机的内存页面号映射表G2H和从主机到客户间的内存页面号映射表H2G,完成客户和主机间的双向内存地址转换;
3)根据映射表G2H和H2G实现直接页表中的页目录项PDE、普通页表项PTE和P-PTE的读取,以及PDE和PTE的写入;其中,
所述读取直接页表中的页目录项PDE、普通页表项PTE和P-PTE的方法为:读取直接页表中的页目录项PDE和普通页表项PTE时,VMM通过查找H2G表将PDE值和PTE值返回客户操作系统;读取P-PTE时,首先查找P-PTE在恢复表中对应的原始PTE值,然后通过查找H2G表将原始PTE值转换为客户操作系统可直接使用的PDE和PTE值返回客户操作系统;
所述写入PDE和PTE的方法为:
A)当客户操作系统写入PDE时,
a)如果旧PDE指向的页表不在内存中,则新PDE的值可直接写入;
b)如果旧PDE已被保护过,则把旧PDE对应的页表页在H2G中的引用计数减1后写入新PDE值;
c)如果新PDE指向一个未被保护的页面,则先在G2H和H2G表中标记该页面被保护,同时把任何引用该页面的页表项PTE转换为相应的P-PTE;
d)如果新PDE指向一个已被保护的页表页,则把H2G表中的页面引用计数增加1;
B)当客户操作系统写入PTE时,检查G2H中新旧PTE是否包含相同的主机页面号;
a)如果都包含同一主机页面号,则更新页表项属性位;
b)如果新旧PTE的主机页面号不同,或者旧PTE是一个普通的PTE、或者旧PTE不存在,则直接覆盖旧PTE。
2.如权利要求1所述的方法,其特征在于所述P-PTE的格式包括:属性位、恢复表号位、恢复表位置位、普通页表和页目录标识位。
3.如权利要求1或2所述的方法,其特征在于所述页表项PTE转换为相应的P-PTE时,在所述P-PTE中记录原始PTE表项在恢复表中的表号和原始值位置信息。
4.如权利要求1所述的方法,其特征在于所述G2H表项结构包括:主机页面号、存在位、保护位,所述H2G表项结构包括:客户页面号、存在位、保护位、页面引用计数;所述G2H表和H2G表采用一对一的映射方式建立。
5.如权利要求1所述的方法,其特征在于所述把旧PDE对应的页表页在H2G中的引用计数减1后写入新PDE值,如果引用计数减1后的值为0,则把旧PDE恢复为普通页面,同时将该页面中所记录的主机页面号转换为原来的客户页面号,将指向该页面的P-PTE还原为普通PTE。
6.如权利要求1所述的方法,其特征在于所述更新页表项属性位时,如果旧PTE是一个P-PTE,则首先查找P-PTE在恢复表中对应的原始PTE值,然后通过查找H2G表将原始PTE值的页表项属性位进行更新。
7.如权利要求1所述的方法,其特征在于所述新旧PTE的主机页面号不同时,如果新PTE指向一个普通的页,则新PTE的内容直接覆盖旧PTE;如果新PTE指向一个页表页,则将该页表页转换为P-PTE,然后用该P-PTE覆盖旧PTE,并将新PTE的内容保存在恢复表中。
8.如权利要求1所述的方法,其特征在于如果需要半虚拟化的进程数量超过设定阈值时,通过最近最少使用方式探测出最不常用的进程,将其恢复为普通进程;所述恢复为普通进程的方法为:根据G2H表和H2G表把直接页表页中的主机页面号还原回客户页面号,并通过恢复表将P-PTE还原为对应的原始PTE。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910083149XA CN101882113B (zh) | 2009-05-05 | 2009-05-05 | 一种基于客户操作系统内核代码替换的内存虚拟化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910083149XA CN101882113B (zh) | 2009-05-05 | 2009-05-05 | 一种基于客户操作系统内核代码替换的内存虚拟化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101882113A CN101882113A (zh) | 2010-11-10 |
CN101882113B true CN101882113B (zh) | 2012-02-22 |
Family
ID=43054130
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200910083149XA Expired - Fee Related CN101882113B (zh) | 2009-05-05 | 2009-05-05 | 一种基于客户操作系统内核代码替换的内存虚拟化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101882113B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2013100921A1 (en) * | 2011-12-28 | 2013-07-04 | Intel Corporation | Allocating memory access control policies |
CN103197915B (zh) * | 2013-03-01 | 2015-08-19 | 华为技术有限公司 | 一种处理敏感指令的方法、装置以及物理机 |
CN104680042B (zh) * | 2015-03-10 | 2017-10-24 | 北京深思数盾科技股份有限公司 | 一种虚拟机性能分析的方法及系统 |
CN107330336B (zh) * | 2017-05-23 | 2020-02-14 | 中国人民解放军信息工程大学 | Linux操作系统内存页面即时加解密方法和系统 |
CN108958879B (zh) * | 2017-05-24 | 2021-02-26 | 华为技术有限公司 | 一种虚拟机的监控方法和装置 |
WO2020010556A1 (zh) * | 2018-07-11 | 2020-01-16 | 华为技术有限公司 | 增强用户空间与内核空间的隔离性的方法和装置 |
CN115061954B (zh) * | 2022-08-18 | 2022-11-29 | 统信软件技术有限公司 | 一种缺页中断处理方法、计算设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1779662A (zh) * | 2004-11-24 | 2006-05-31 | 中国科学院计算技术研究所 | 改进的虚拟地址变换方法及其装置 |
CN101107593A (zh) * | 2005-01-28 | 2008-01-16 | 英特尔公司 | 支持虚拟机环境中的地址转换的方法及装置 |
CN101158924A (zh) * | 2007-11-27 | 2008-04-09 | 北京大学 | 一种虚拟机管理器的动态内存映射方法 |
CN101271436A (zh) * | 2007-03-19 | 2008-09-24 | 联想(北京)有限公司 | 虚拟机系统及其高级可编程中断控制器的访问处理方法 |
CN101315614A (zh) * | 2007-06-01 | 2008-12-03 | 英特尔公司 | 支持页属性的虚拟地址至物理地址的转换 |
-
2009
- 2009-05-05 CN CN200910083149XA patent/CN101882113B/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1779662A (zh) * | 2004-11-24 | 2006-05-31 | 中国科学院计算技术研究所 | 改进的虚拟地址变换方法及其装置 |
CN101107593A (zh) * | 2005-01-28 | 2008-01-16 | 英特尔公司 | 支持虚拟机环境中的地址转换的方法及装置 |
CN101271436A (zh) * | 2007-03-19 | 2008-09-24 | 联想(北京)有限公司 | 虚拟机系统及其高级可编程中断控制器的访问处理方法 |
CN101315614A (zh) * | 2007-06-01 | 2008-12-03 | 英特尔公司 | 支持页属性的虚拟地址至物理地址的转换 |
CN101158924A (zh) * | 2007-11-27 | 2008-04-09 | 北京大学 | 一种虚拟机管理器的动态内存映射方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101882113A (zh) | 2010-11-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9928180B2 (en) | Synchronizing a translation lookaside buffer with page tables | |
US10318322B2 (en) | Binary translator with precise exception synchronization mechanism | |
US9304915B2 (en) | Virtualization system using hardware assistance for page table coherence | |
US8762684B2 (en) | Hardware assistance for page table coherence with guest page mappings | |
US8166276B2 (en) | Translate and verify instruction for a processor | |
US7313669B2 (en) | Virtual translation lookaside buffer | |
CN101882113B (zh) | 一种基于客户操作系统内核代码替换的内存虚拟化方法 | |
US7844954B2 (en) | Using branch instruction counts to facilitate replay of virtual machine instruction execution | |
TWI471727B (zh) | 用於虛擬機頁面轉譯快取的方法及裝置 | |
US6785886B1 (en) | Deferred shadowing of segment descriptors in a virtual machine monitor for a segmented computer architecture | |
US8789042B2 (en) | Microprocessor system for virtual machine execution | |
US7035963B2 (en) | Method for resolving address space conflicts between a virtual machine monitor and a guest operating system | |
US7073042B2 (en) | Reclaiming existing fields in address translation data structures to extend control over memory accesses | |
CA2270122C (en) | A gated store buffer for an advanced microprocessor | |
US8239620B2 (en) | Microprocessor with dual-level address translation | |
US8887139B2 (en) | Virtual system and method of analyzing operation of virtual system | |
Wang et al. | Dynamic memory paravirtualization transparent to guest OS | |
Bungale et al. | Supervisor-Mode Virtualization for x86 in VDebug |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120222 Termination date: 20160505 |