具体实施方式
综述
地址翻译控制可用于通过有效地拒绝将违反政策的虚拟地址映射来实现存储器访问控制政策。一般而言,地址翻译控制通过在编辑地址翻译映射的尝试上施加实质上的限制来起作用,使得该映射总是保持安全(在该映射不向给定的软件实体暴露到该实体的界限外(或不可写)的页的链接(或可写链接),并且不允许不可信实体写入该映射的意义上)。通常,通过评估编辑映射的请求以确定实施该请求是否会将该映射置于不利状态,来施加这些实质上的限制;如果将导致不利状态,则修改该请求使得实施所期望的请求仍能维持所期望的状态。(如,可修改将导致向政策下可读但不可写的页的读/写链接的编辑映射的请求以将该链接标记为只读。)该技术的问题是有时候软件的正确行为取决于包含该软件认为它已写入存储器的值的存储器-如,在核实校验和的情况下-并且修改请求将导致存储器包含不同于软件认为它所写入的值的值。本发明通过维护用作页映射页的页的不同版本解决了这一问题:向软件对象展现的数据版本,以及可以在不违反映射安全的情况下用作地址翻译过程的一部分的一个或多个映射版本。令这一页的数据版本变得只读,使得可由ATC截取对页的写,从而可修改页使得保持不同的版本同步。
示例性计算方案
图1示出了适合在其中实现本发明的各方面的一个示例计算环境。计算***环境100仅为合适的计算环境的一个示例,并非建议对本发明的使用或功能的范围的局限。也不应将计算环境100解释为对示例性操作环境100中示出的任一组件或其组合具有依赖或需求。
本发明可以使用众多其它通用或专用计算***环境或配置来操作。适合使用本发明的已知的计算***、环境和/或配置包括但不限于:个人计算机、服务器计算机、手持式或膝上设备、多处理器***、基于微处理器的***、机顶盒、可编程消费者电子设备、网络PC、小型机、大型机、嵌入式***、包括任一上述***或设备的分布式计算环境等等。
本发明可在计算机可执行指令的一般上下文环境中描述,计算机可执行指令如由计算机执行的程序模块。一般而言,程序模块包括例程、程序、对象、组件、数据结构等等,执行特定的任务或实现特定的抽象数据类型。本发明也可以在分布式计算环境中实践,其中,任务由通过通信网络或其它数据传输媒质连接的远程处理设备来执行。在分布式计算环境中,程序模块可以位于本地和远程计算机存储媒质中,如存储器存储设备。
参考图1,用于实现本发明的示例***包括以计算机110形式的通用计算装置。计算机110的组件可包括但不限于,处理单元120、***存储器130以及将包括***存储器的各类***组件耦合至处理单元120的***总线121。处理单元120可代表多个逻辑处理单元,如多线程处理器上所支持的。***总线121可以是若干种总线结构类型的任一种,包括存储器总线或存储器控制器、***总线以及使用各类总线结构的局部总线。作为示例而非局限,这类结构包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、增强ISA(EISA)总线、视频电子技术标准协会(VESA)局部总线以及***部件互连(PCI)总线(也称为Mezzanine总线)。***总线121也可被实现为点对点连接、交换光纤等通信设备。
计算机110通常包括各种计算机可读媒质。计算机可读媒质可以是可由计算机110访问的任一可用媒质,包括易失和非易失媒质、可移动和不可移动媒质。作为示例而非局限,计算机可读媒质包括计算机存储媒质和通信媒质。计算机存储媒质包括以用于储存信息的任一方法或技术实现的易失和非易失,可移动和不可移动媒质,信息如计算机可读指令、数据结构、程序模块或其它数据。计算机存储媒质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机110访问的任一其它媒质。通信媒质通常在诸如载波或其它传输机制的已调制数据信号中包含计算机可读指令、数据结构、程序模块或其它数据,并包括任一信息传送媒质。术语“已调制数据信号”指以对信号中的信息进行编码的方式设置或改变其一个或多个特征的信号。作为示例而非局限,通信媒质包括有线媒质,如有线网络或直接连线连接,以及无线媒质,如声学、RF、红外和其它无线媒质。上述任一的组合也应当包括在计算机可读媒质的范围之内。
***存储器130包括以易失和/或非易失存储器形式的计算机存储媒质,如只读存储器(ROM)131和随机存取存储器(RAM)132。基本输入/输出***133(BIOS)包括如在启动时帮助在计算机110内的元件之间传输信息的基本例程,通常储存在ROM131中。RAM132通常包含处理单元120立即可访问或者当前正在操作的数据和/或程序模块。作为示例而非局限,图1示出了操作***134、应用程序135、其它程序模块136和程序数据137。
计算机110也可包括其它可移动/不可移动、易失/非易失计算机存储媒质。仅作示例,图1示出了对不可移动、非易失磁媒质进行读写的硬盘驱动器141、对可移动、非易失磁盘152进行读写的磁盘驱动器151以及对可移动、非易失光盘156,如CD ROM或其它光媒质进行读写的光盘驱动器155。可以在示例性操作环境中使用的其它可移动/不可移动、易失/非易失计算机存储媒质包括但不限于,磁带盒、闪存卡、数字多功能盘、数字视频带、固态RAM、固态ROM等等。硬盘驱动器141通常通过不可移动存储器接口,如接口140连接到***总线121,磁盘驱动器151和光盘驱动器155通常通过可移动存储器接口,如接口150连接到***总线121。
图1讨论并示出的驱动器及其关联的计算机存储媒质为计算机110提供了计算机可读指令、数据结构、程序模块和其它数据的存储。例如,在图1中,示出硬盘驱动器141储存操作***144、应用程序145、其它程序模块146和程序数据147。注意,这些组件可以与操作***134、应用程序135、其它程序模块136和程序数据137相同,也可以与它们不同。这里对操作***144、应用程序145、其它程序模块146和程序数据147给予不同的标号来说明至少它们是不同的副本。用户可以通过输入设备,如键盘162和定位设备161(通常指鼠标、跟踪球或触摸板)向计算机110输入命令和信息。其它输入设备(未示出)可包括麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等等。这些和其它输入设备通常通过耦合至***总线的用户输入接口160连接至处理单元120,但是也可以通过其它接口和总线结构连接,如并行端口、游戏端口或通用串行总线(USB)。监视器191或其它类型的显示设备也通过接口,如视频接口190连接至***总线121。除监视器之外,计算机也包括其它***输出设备,如扬声器197和打印机196,通过输出***接口195连接。
计算机110可以在使用到一个或多个远程计算机,如远程计算机180的逻辑连接的网络化环境中操作。远程计算机180可以是个人计算机、服务器、路由器、网络PC、对等设备或其它公用网络节点,并通常包括许多或所有上述与计算机110相关的元件,尽管在图1中仅示出了存储器存储设备181。图1描述的逻辑连接包括局域网(LAN)171和广域网(WAN)173,但也可包括其它网络。这类网络环境常见于办公室、企业范围计算机网络、内联网以及因特网。
当在LAN网络环境中使用时,计算机110通过网络接口或适配器170连接至LAN171。当在WAN网络环境中使用时,计算机110通常包括调制解调器172或其它装置,用于通过WAN173,如因特网建立通信。调制解调器172可以是内置或外置的,通过用户输入接口160或其它合适的机制连接至***总线121。在网络化环境中,描述的与计算机110相关的程序模块或其部分可储存在远程存储器存储设备中。作为示例而非局限,图1示出了远程应用程序185驻留在存储器设备181中。可以理解,示出的网络连接是示例性的,也可以使用在计算机之间建立通信链路的其它装置。
示例性虚拟地址模式
图2示出了虚拟地址***的一个示例。图2描述的示例是一分页类型虚拟地址模式,尽管可以理解,虚拟寻址可基于其它模型,如分段(segmentation)。图2所示的模式是二级地址模式,如INTEL x86处理器上可用的虚拟寻址模式之一。该模式是“两级”的,因为必须使用两级“间接”方将虚拟页标识符翻译成物理页,如后文所述。
在该分页模式中,页目录202包含一组条目。条目的一个示例结构在下文结合图3更详细地描述,但是本质上,每一条目标识了具体页表,如页表204(1)、204(2)或204(3)的物理位置(如,页帧号即“PFN”)。每一页表进而包含一组条目,每一条目标识具体数据页,如页206(1)、206(2)、206(3)或206(4)的物理位置(还是页帧号)。数据页是RAM132的确定长度的连续部分。数据页可储存任一类型的数据,并且应当注意,除储存普通数据之外,数据页也可用于储存页目录202和页204(1)到204(3)的内容。由此,给定的页可以是目录、表、数据页或作为这三个结构的组合扮演多重角色。
图2描述的虚拟地址模式是两级虚拟地址模式,因为需要同时通过页目录(级1)和页表(级2)以查找具体页。本领域的技术人员可以理解,可以用任意级数来设计虚拟地址***,并且本发明的原理可应用到所有这类虚拟地址模式。如本领域所已知的,IINTEL x86处理器支持具有一、二或三级的虚拟地址,并且通常采用一种“混合”模式,其中“小”页(即,长度为4千字节的页)使用两级虚拟地址,“大”页(即,长度为4兆字节的页)使用一级虚拟地址。
在图2的分页模式中,页上的一个字节可由虚拟地址210来标识,包括页目录偏移211、页表偏移212和页偏移213。(该虚拟地址结构应用到储存在小页中的数据;大页在后文描述。)由此,为查找一物理地址,执行地址翻译的存储器管理单元(MMU)220使用页目录偏移211来查找页目录202中具体条目。例如,偏移211可等于零,指示应当参考页目录202中的第零个条目。该条目包含储存页表的PFM,因此MMU20使用该PFN来查找页表之一(如,页表204(1))。MMU220然后使用页表偏移212作为到标识的页表的索引,并检索在该偏移处找到的条目。该条目包含数据页(如页206(1))的PFN,因此MMU220将页偏移213添加到标识的页的基础地址,以查找物理存储器的具体字节。除纯地址翻译之外,MMU220也可适用于执行各种其它功能:如,如果表中的页条目被标记为“不存在”,则MMU220可从盘加载该页;如果该页被标记为“只读”,则MMU可不允许写访问,等等。
如果虚拟地址涉及大页,则虚拟地址的结构以及翻译该地址的过程与上述有些许不同。虚拟地址仅包含一个偏移,为到目录的索引。在该偏移处查找的目录条目不是包含页表的PFN,而是包含大数据页的PFN。该目录条目也具有一个位,它被设置成指示该条目涉及大页而非页表。当设置了大页位时,虚拟地址不包含到页表的索引,因此在翻译过程中不使用页表;相反,虚拟地址的剩余部分(如,除到目录的索引之外的部分)被作为到大页的索引来处理。绕过了页表级,因此仅发生一级翻译。
在图2的虚拟地址模式中,页目录本身的位置(即,PFN)储存在存储位置201。当开始翻译虚拟地址210时,MMU220使用存储位置的内容来查找页目录202。由此,可以存在多个页映射,并且可通过设置存储位置201的内容包含给定映射的页目录的PFN来选择具体的映射用于当前使用。在INTEL x86处理器的示例中,存储位置201对应于名为CR3的寄存器。
如上述者,页表或页目录中的每一条目包含具体物理页的PFN,并也可包含某些其它数据。图3示出了页表或页目录中条目300的示例结构。
条目300包括具体物理页的PFN302。例如,如果条目300是页目录的一部分,则PFN302是应当在下一级地址翻译过程中被参考的页表的PFN(或者,在大页链接的情况下,条目仅包含该条目所参考的大数据页的PFN)。另外,条目300包含一个位304,指示该条目是用于大页还是小页。(仅当条目300为页目录的一部分时该位才有意义。为简洁计,条目的格式可以相同,无论该条目是目录的一部分还是表的一部分,尽管在表的情况下,位304的意义未下定义。)
只读位306指示作为条目的最终目标的数据页是否被视为读/写(位清除)或只读(位设置)。如果目标数据页是只读的,则对该页的写请求将失败。(MMU220可用于强迫页的只读状态。)只读位在目录和表条目中皆可存在;如果最终导向数据页的目录和表链接各自的只读位设置发生冲突,则可使用冲突解决规则来确定该目标数据页是读/写还是只读。例如,冲突规则可规定,为将页作为读/写处理,通向该页的目录和表链接必须都被标记为读/写(即,两者条目中的只读位306必须被清除)。同一页可由通过映射的不同路径到达,并且是被作为读/写还是只读处理要取决于使用了哪一路径来达到该页。
存在位308指示目标数据页当前是在物理存储器中存在,还是需要从盘上复制到存储器。例如,如果存在位308被清除(指示目标页不存在),则对该页的访问请求将生成页错误,该错误然后由中断服务例程处理,将页的内容从盘复制到物理存储器并调整地址翻译映射来反应页的物理位置。当对于给定映射,如果页目录和页表条目中的存在位被不同地设置时,这些位之间的冲突可由类似于上文对读/写位所讨论的冲突解决规则来分解-如,当且仅当目录和表条目都被标记为存在时,该映射被视为存在。
使用地址翻译表条目编辑控制(ATC)的存储器访问控制
结合图2-3所描述的虚拟地址模式的一个特征是有可能存在部分物理存储器,它没有对应的虚拟地址。这一观察的必然结论是,给定存储器的任一部分,可通过确保该地址翻译映射不通向该存储器部分来限制对该存储器部分的访问。实际上,由于存储器位置没有虚拟地址,该存储器位置被呈现为界限外。(在许多***中-如,INTEL x86处理器-几乎所有的存储器访问请求由虚拟地址作出;对于由物理地址作出访问请求的那些限制的情况,可使用并行访问控制机制。)
ATC用于实现存储器访问控制机制的方法按照以下符号来解释:NA(“无访问”)是在某一政策下不允许访问的页的组。MP(“映射页”)是可通过地址翻译映射访问的页的组-即,存在虚拟地址的页的组。只要条件NA∩MP=φ连续成立,则防止了对作为NA成员的页的访问。该条件在图4中描述为维恩(Venn)图:即,页406是机器上可用的物理页组;MP402是存在虚拟地址的页组;NA404是在政策下不允许访问的页组。只要图4的条件连续成立,即不可使用虚拟地址来访问在政策下处于界限外的页,因为该映射不通向这些页(即,没有虚拟地址的页)。由此,图4描述的条件可用于通过ATC实现存储器访问控制。该条件被称为“不变式”,因为ATC的目标是限制对地址翻译映射的改变以防止条件从为真的状态改变为非真状态。
图4描述了可用于存储器访问控制的简单不变式条件,并仅为说明目的示出。取决于访问控制发生的环境,可有更复杂的条件。例如,可设置关于哪些条目被包含在目录(或表)中的具体规则,并通过使用只读和/或存在位来帮助强迫访问控制条件来改善访问控制。例如,以下描述是可用于在INTEL x86处理器上通过ATC实现存储器访问控制的一组规则:
D1是可用作页目录的页组。D2是可用作页表的页组。D=D1∪D2。页目录或页表中被标记为“存在”的每一条目(即,其存在位被设置)被称为“链接”。如果有从D1中的某一页到D2页的小读写链接,则所讨论的D2页是“写活动的”。(“小”链接是从目录到表的链接-即,目录中最终将通向小页的链接。“大”链接是目录中指向大页的链接。)假定有这样的政策来定义允许某一实体对其进行读和/或写访问页。
维护以下不变式:
-CR3在D1中;
-所有D1和D2页在相关政策下是可读的;
-D1页的每一小链接指向一个D2页;
-D2页的链接指向在政策下可读的页;
-写活动的D2页的每一读写链接指向在政策下可写且不在D中的页;
-包含在从D1页的大链接的大页目标中的每一小页在政策下是可读的;如果该链接是读写的,则小页在政策下也可写,且不在D中。
ATC被用来确保防止那些将破坏上述不变式的对地址翻译映射的变化。维护这些不变式确保了所讨论的实体不能破坏政策。
不管施加了哪一不变式,不变式的真实性可通过评估每一访问请求来确定假如实际实现了该请求,它是否会导致不变式继续成立的状态来维护。如果所得的状态将满足该不变式,则实现该请求。然而,如果该不变式将不再成立,则至少有两个选项:
-(1)拒绝该请求;或
-(2)将请求修改成将继续满足该不变式的形式。
选项(1)有缺点,在实践中,将需要拒绝大量访问请求,这将破坏计算机***的功能。然而,采用选项(2),软件对象将值写入存储位置,并且该存储位置最终储存不同于软件对象认为它所写的值的修改值;如上所述,软件的正确功能(如,校验和核实)将取决于储存软件认为它所写入存储器的实际值的存储器,并且由此,选项(2)也可破坏软件的功能。本发明通过储存页的多个版本解决了这一问题。一个版本包含程序认为它写入该页的确切数据。页的另一副本包含其如果在地址翻译过程中使用将促使维护相关不变式条件的数据的版本。
阴影页
依照本发明的一个特征,页可有多个表示法。同一页的多个表示法确保了有包含程序实际上写入页的数据的页的版本,以及在地址翻译过程中可安全地用作页目录和页表的页的其它(“阴影”)版本。本上下文中的“安全使用”是指将阴影页用作目录(或表,视具体情况而定)将不导致违反应用到ATC***的不变式。
较佳地,给定页x,有该页的三个版本,应当被称为d(x)、t(x)和m(x)。d(x)是页的“目录”版本-即,适合用作上述地址翻译过程中的页目录的页的版本。t(x)是安全地用作页表的页的版本。m(x)是页的“存储器”版本-即,包含由一个或多个程序写入页的实际数据的版本。在本发明的描述中,术语“d(x)”要么是指页x的目录版本的内容,要么是指储存页x的目录版本的PFN。对于t(x)和m(x)也是一样。术语d(x)、t(x)和m(x)是否涉及页内容或其PFN可从上下文清楚,或可特别指明。
图5示出了d(x)、t(x)和m(x)如何在地址翻译过程中使用。图5涉及三个页,标签为x、y和z(分别为标号502、502和506)。页x是页目录,页y是页表,页z是数据页。应当注意,页x、y和z可扮演多重角色。由此,页x可担当页目录或数据页,视具体情况而定。页y在某一上下文中可担当页表,而在其它上下文中担当页目录。然而,为图5的目的而假定正在翻译具体的虚拟地址,并且为翻译该地址的目的,页x、y和z分别扮演目录、表和数据页的角色。
页x以版本d(x)、t(x)和m(x)存在。为翻译所讨论的地址,参考页x的目录版本(即,d(x))。作为目录,x中的条目包含目标页表的PFN,并且x和d(x)之间的原则差异是对于页目录x中的每一目标ti,x包含ti的PFN,而d(x)包含t(ti)的PFN-换言之,d(x)被修改成指向目标页的表版本而非那些页的原始版本。
当参考页d(x)时,d(x)中的相关条目(即,由虚拟地址的目录偏移部分指示的条目,图2中的元素211)指向页t(y)。然后参考页t(y)来查找具体数据页。t(y)中的条目包含目标数据页的PFN。t(y)和y之间的关系类似于d(x)和x之间的关系:对于由y引用的每一数据页di,t(y)包含m(di)的PFN而非di的PFN。(然而,应当注意,m(di)的PFN一般与di的PFN相同,因为在页的原始位置储存页的数据版本一般是存储器的最有效使用。)使用由虚拟地址的表偏移域所指示的偏移(如,图2中的元素212),查找表t(y)中合适的条目。该条目涉及具体数据页的PFN,本示例中为m(z)。
在页m(z)被标识之后,基于虚拟地址中所指示的页偏移(如,图2中的元素213)访问页m(z)中合适的数据单元。
由此,在常规的地址翻译过程中,到数据页的路径从页x通向页y再到页z。当使用了依照本发明的阴影页时,翻译页从页d(x)通向页t(y)再到页m(z)。
创建页d(x)、t(x)和m(x)
通过在页x上执行定义的变换来创建页d(x)、t(x)和m(x)。以下是这些变换的较佳实施例的描述。
较佳地,m(x)表示程序写入页x的实际数据,没有任何类型的修改或过滤。换言之,从x到m(x)的变换本质上是相同的变换。
较佳地,依照以下规则创建d(x)和t(x)。d(x)与x相同,但是对于涉及被标记为存在的页x的条目的每一页ti,d(x)中对应的条目涉及t(ti)的PFN而非ti的PFN。t(x)与x相同,但是对于涉及被标记为存在的页x的条目的每一页di,t(x)涉及m(di)的PFN而非di的PFN。因此,如果在相关政策下,目标页是可读但不可写,或如果目标页是页目录或页表,则该条目被标记为只读。
以下是如何创建d(x)和t(x)的更正式描述。为描述之目的,D1是可用作页目录的PFN的组,D2是可用作页表的PFN的组。命题(statement)D1.x是指x是D1的成员,D2.x指x是D2的成员。设M是存储器映射,如可通过在其上实施存储器访问控制模式的相关软件对象所见到的。M.x.e表示储存在其PFN为x的物理页的第e个条目中的值。R.x指在x在相关政策下是可读的,W.x指x在相关政策下是可写的。m、t、d和P令以下成立(在每一情况下,设b是M.x.e,并设D.x=D1.x∨D2.x):
-如果﹁R.x,m.x=t.x=d.x=未定义,其中,“未定义”是不在物理存储器中的页的PFN。
-﹁d.x=如果D1.x,则为x,否则未定义
-﹁D2.x=>t.x=未定义
-P.(m.x).e=v(即,在P中,m.x看似与x在M中的完全相同)
-d.x≠未定义=>P.(d.x).e=如果v.存在,则为v[pfn←t.(v.pfn)],否则为v
-t.x≠未定义=>P.(t.x).e=如果v.存在,则为v[pfn←m.(v.pfn),rw←(v.rw∧(R.(v.pfn)=>W.(v.pfn))∧﹁D.(v.pfn))],否则为v
换言之,x的目录版本看似与x的存储器版本完全相同,但是其PFN重定向到表版本;x的表版本看似与x的存储器版本完全相同,但是其PFN重定向到读版本,并且对可读但不可写或在D中的目标清除读写位(或对这类目标设置只读位,取决于条目的表示是包括读/写位还是只读位)。注意,对于目录,在x处保留x的目录版本,但是对于表,在x处保留x的读版本以将从D2中移除x(如,将其交换到盘)的成本最小化。只要版本恰巧保留了同一数据(如,对于ATC允许的目录和表),它们就共享同一物理页,因此对于不试图作出ATC将拒绝或修改的写的软件对象,不需要创建阴影页。
图6和7分别示出了创建d(x)和t(x)的示例过程。
现在参考图6,假定有作为映射(如,上述的映射M)的一部分的页x,并且期望基于x创建页d(x)。首先,确定(602)在相关政策下页x是否可读。如果x不可读,则d(x)未定义(606),并且过程终止。如果x可读,则确定(604)x是否是D1的成员-即,x是否被指定为用作页目录。如果x不是D1的成员,则d(x)未定义(606)。如果x是D1的成员,则创建页d(x)使它包含与页x相同的内容,除条目中被标记为存在的的PFN域被改为指向其目标的表版本之外。可通过设置n=0(607),然后对于n的给定值,确定x中的第n个条目是否被标记为存在(608),来达到该结果。如果x中第n个条目不被标记为存在,则d(x)中的第n个条目可被设置成等于x中第n个条目(610)。如果x中的第n个条目被标记为存在,则d(x)中的第n个条目可被设置成等于x中第n个条目,除其PFN被改为指向表版本(612)之外-即,如果P.n.pfn涉及页P的PFN域,并且如果v具有上述意义,则d(x).n.pfn=t(v.pfn)。在设置了d(x)中的第n个条目制售,递增n(614),过程返回到608来设置下一条目。
现在参考图7,再次假定有作为映射的一部分的页x,并且期望创建页t(x)。最初,确定(702)在相关政策下x是否可读。如果x不可读,则将t(x)设为未定义值(706),过程终止。如果在相关政策下x可读,则确定(704)x是否是D2的成员。如果x不是D2的成员,则将t(x)设为未定义(706)。如果x是D2的成员,则创建页t(x)使得条目中的值等于x中的值,除被标记为存在的页的PFN被调整为指向目标页的存储器版本,并且调整某些读/写链接令其变为只读之外。为创建页t(x)的内容,最初将计数器设为0(708)。然后确定页x中的第n个条目是否被标记为存在。如果该条目不被标记为存在,则将t(x)中的第n个条目设为等于x中的第n个条目(712)。如果第n页被标记为存在,则将页t(x)中的第n个条目设为等于x中的第n个条目,除该条目的PFN域被设为指向目标页的存储器版本(714)之外-即,如果x中第n个条目的目标页具有PFN=A,则t(x)中第n个条目的PFN域被设为等于m(A)。(如上所述,m(A)的PFN经常等于A的PFN。)下一步,确定(716)第n个条目的目标页在相关政策下是否是可读但不可写的页。如果目标页可读但不可写,则将t(x)中第n个条目标记为只读(720)。否则,确定(718)x中第n个条目的目标页是否为D1或D2的成员。如果是,则t(x)中第n个条目被标记为只读(720)。然后递增计数器n,过程循环回至714以创建t(x)中的下一条目。
储存阴影页
能够储存每一页的三个版本(即,d(x)、t(x)和m(x)),尽管有某些优化允许更有效地来表示页。首先,如果上述算法将导致创建与已储存的版本相同的阴影页,则不需要创建阴影页。由此,对于大多数页,仅需储存该页的一个版本,在这一情况下,对于这样的页x,d(x)、t(x)和m(x)的PFN都相同。
第二,对于所有不同于目录的页,页的原始版本较佳地担当该页的数据版本。由此,对于非目录页(即,其帧号不是D1的成员的页),m(x)的PFN等于x的PFN;x的目录和表版本将储存在别处。然而,在目录页的情况下,该页的原始版本较佳地(并且在一些情况下,必须)担当该页的目录版本。由于按照允许担当目录的页(如,在INTEL x86处理器上,其PFN可被加载到CR3的页)的PFN来定义组D1,将目录版本移到另一PFN是不实用的;由于CR3需要由可能不知道阴影页的存在的软件对象加载(如,CR3可由其存储器访问被ATC***所限制的操作***加载),该目录页可能需要位于软件对象认为那些页所在之处的PFN处。
将阴影页用于大页
如上所述,INTEL x86处理器(以及各种其它处理器)支持大页的应用,在这一情况下,将虚拟地址翻译成物理地址不涉及页表。为使大页在上述的阴影机制中起作用,可为大页创建阴影页表,即使该阴影页表不对应于任一真实的页表。由此,当页目录x包含大链接时,可创建该页的目录版本(即,d(x)),它在条目中包含对应于x的大链接的小链接。该小链接指向阴影页表(即t(x)),它包含到组成大页的各个小页的链接。由于上文描述的阴影算法的部分涉及令某些页变为只读,将大页***成小页避免了必须将整个大页标记为只读页。如需要,作为大页的部分的个别小页可被标记为只读。(将大页标记为只读的缺点是每一对该页的写请求将生成异常,并且必须由更有特权的组件(如,执行ATC的组件)来评估,以确定写是否能够在不违背可应用的不变式的情况下发生。需要以这一方式处理对大页的每一写请求将显著地降低***性能。)
注意,上述示例仅为解释目的提供,并且不应当被解释为对本发明的限制。尽管参考各种实施例描述了本发明,可以理解,此处所使用的词语是描述和说明的词语,而非限制的词语。此外,尽管此处参考具体的装置、材料和实施例描述了本发明,本发明不意味着限制在所揭示的细节上;相反,本发明延及如处于所附权利要求书范围之内的所有功能上等效的结构、方法和用途。从本说明书的教导获益的本领域的技术人员在不脱离本发明的各方面的范围和精神的情况下,可对其作出各种修改和变化。