用于在子上下文之间控制存储器访问的装置、系统和方法

文档序号:6561348阅读:169来源:国知局
专利名称:用于在子上下文之间控制存储器访问的装置、系统和方法
技术领域
本发明涉及计算设备中的存储器保护,并尤其涉及依照当前的代码执行点来保护存储器。
背景技术
在早期的计算设备中,在计算机上一次只运行一个程序。运行的程序完全控制了机器中的硬件,其中这些硬件包括逻辑设备、处理器、存储器、输入设备以及输出设备。运行的程序中的程序缺陷可导致该运行程序工作不正常或终止。然而,由于一次仅仅运行一个程序,因此其他程序是不受影响的。
随着计算机变得更为复杂,在单个计算机上运行了多个程序。多任务处理核心采用了不同方式来调整处理器访问。在常规的多任务处理的实现方式中,该核心在很短的时间片中调度计算机上运行的每一个程序。在每一个时间片期间运行一个程序。在每一个时间片末端,该核心保存当前运行的程序的状态,然后恢复挂起(suspended)程序的状态,并且允许挂起程序在新的时间片期间运行。通过毫秒级别的时间片,计算机能够连续运行多个程序,同时给出同时运行多个程序的效果。
在早期的多任务环境中,每一个程序在其时间片期间会完全控制计算机。当前运行的程序控制了处理器、存储器、输入设备以及输出设备。当前运行的程序有能力影响分配给挂起程序的存储器。字处理程序有能力修改分配给统计程序的存储器。尽管软件程序员尝试避免这些错误,但是这些错误还是会发生,并且这些错误导致很多问题。一个程序对分配给另一个程序的存储器执行的存储器访问是普遍的,并且是很难检测的。
响应于这些问题,计算机体系结构和软件的设计人员共同工作而设计了基于进程的受保护的存储器系统。在基于进程的受保护的存储器系统中,核心是运行进程中的程序。并且核心基于进程而将存储器分配给程序。
举例来说,核心启动进程中的程序。该核心调度进程来运行和分配运行进程的时间片。当该程序是当前运行的进程时,该程序从核心请求存储器块。然后,核心分配存储器块,并且会将该存储器块与特定的进程相关联。
核心结合了专用硬件来监视运行进程进行的存储器访问。运行进程对当前分配给该运行进程的存储器所进行的访问是得到许可的。然而,运行进程对未分配给它的存储器所进行的访问创建出异常。核心处理该异常,并且阻止对未分配给当前进程的存储器的访问。
基于进程的受保护存储器系统实现了其目的——防止同时运行的程序影响到分配给其他程序的计算机资源。然而,它是以很高的代价来实现其目的的。首先,从一个进程切换到另一个进程所需要的时间量会增长。其次,进程切换必须更频繁的进行,以便处理进程间的通信(IPC)。第三,核心对计算机资源的请求必须通过进程切换或通过系统中断来调整,这创建了切换开销并且占用了关键的核心资源。
核心必须了解分配给每一个进程的存储器块以及权限。通常,核心使用了用于每个进程的页表来存储该信息。该页表保持了运行进程所用虚拟地址与物理存储器位置的映射。此外,该页表还追踪哪个存储器被交换到磁盘。用于单个进程的页表可以是非常大的。很多计算机系统都使用了转换后备缓冲器(TLB)来缓存该页表,以便加速地址转换。
进程切换是耗时的过程。在由核心调度进程的时候,该核心会转储清除(flush)TLB,并且会设置指向新页表的指针。该页表的某些部分必须被加载到存储器中,并且与包括了代码页以及数据页的进程相关联的附加存储器页必须被加载到存储器中。通过采用这种方式来将存储器分配给进程,核心能够限制进程间的存储器访问。然而,即使是从一个进程到另一个进程的最简单的调用也会导致进程切换开销。
在基于进程的受保护的存储器系统中存在异常,以便允许核心以及高度可信的程序访问计算机中的所有存储器。举例来说,核心通常是以特许模式运行的,该模式允许核心访问任何存储器地址而不会导致异常。此外,某些设备驱动器和其享库同样可以在特许等级上运行。这些异常减少所需要的进程切换的数量,但也降低了系统的稳定性。
目前已经提出了很多建议,以便减小核心代码的大小以及将尽可能多的系统级服务推送到非核心应用中。这种系统有时被称为微核心。基于微核心的操作系统从核心中分离出了很多系统功能。这些被分离的系统功能可以存在于系统代码段中,也可以存在于独立的进程中。
如果被分离的系统功能是作为系统代码段而存在的,那么它们必定会由不可信的进程所调用。在基于进程的存储器保护体系结构中,这种设计将会允许不可信的程序直接调用系统代码,由此绕过存储器保护标准。作为选择,系统功能可以作为独立进程来实施,该进程会为来自不可信进程的请求提供服务。然而,通过创建附加进程来执行系统功能将会产生与进程切换相关联的很高的开销成本。
从以上论述中可知,目前明显需要一种装置、系统和方法,其允许计算设备上运行的应用直接调用系统功能,而不会产生进程切换开销,同时维持存储器保护标准来防止不可信的应用不恰当地访问系统资源。非常有益的是,这种装置、系统和方法将会提升系统的稳定性,同时减少调用系统功能所需要的时间。这种装置、系统和方法还将减少与进程间的通信相关联的开销。

发明内容
本发明是响应于本领域的当前状况而被开发的,特别地,本发明是响应于本领域中尚未被当前可用的存储器保护系统完全解决的需要和问题而被开发的。相应地,通过开发本发明,可以提供一种用于实现受保护的虚拟存储器子上下文(subcontext)的装置、系统和方法,其中所述虚拟存储器子上下文克服了众多或所有的如上所述的本领域内的缺陷。
用于实现受保护的虚拟存储器子上下文的装置提供有包含多个模块的逻辑单元,这些模块被配置成在功能上执行以下的必要步骤将存储器块分配给特定子上下文,在子上下文映射模块中存储所述分配,在子上下文映射模块中存储子上下文间的存储器访问权限,追踪当前子上下文的身份,追踪当前子上下文所执行的子上下文间存储器访问,以及阻拦那些并未得到子上下文映射模块中存储的子上下文间存储器访问权限许可的存储器访问。
在一实施例中,该装置被配置成阻拦被禁止的子上下文存储器读写。
在一实施例中,该装置还被配置成保持子上下文入口点以及相关权限的表格,并且阻拦没有正确使用已注册子上下文入口点或没有正确权限进行此类调用的子上下文间的程序调用。
在另一实施例中,该装置可以被配置成使得进程间的通信更便利。
还提供了本发明的一种用于实现受保护的虚拟存储器子上下文的系统。该系统可以包括中央处理单元、随机存取存储器、子上下文映射模块以及控制模块,其中该控制模块被配置成阻止没有被子上下文映射模块中存储的权限所许可的子上下文间的存储器访问。特别地,在一实施例中,该系统还包括入口点表格,该表格被配置成保持子上下文入口点与子上下文间的权限的列表,并且被配置成阻拦没有使用具有恰当权限的已注册子上下文入口点的子上下文间的程序调用。
还提供了一种用于服务和安装本发明的方法,以便实现受保护的虚拟存储器子上下文。在所公开的实施例中的方法基本上包括了安装和服务本发明所必需的步骤。在一实施例中,该方法包括将算计可读代码集成到计算系统中,其中所述代码与计算系统相结合而将存储器块分配给子上下文,在子上下文映射模块中存储子上下文间的访问权限,追踪当前子上下文的身份,追踪当前子上下文所执行的子上下文间存储器访问,以及阻拦那些没有子上下文映射模块中存储的匹配权限的存储器访问。该方法还可以包括保持子上下文入口点模块,并且阻拦没有在子上下文入口点模块中注册的子上下文间的程序调用。该方法还可以阻拦没有在子上下文入口点模块中存储匹配权限的调用。
在全部的本说明书中,对特征、优点的引用或相似的语言并不意味着所有这些可以借助本发明实现的特征和优点都应该处于或处于本发明的单个实施例中。与此相反,涉及这些特征和优点的语言被理解成是指结合实施例所描述的特定特征、优点或特性被包括在本发明的至少一实施例中。因此,在全部的本说明书中,关于特征及优点的讨论以及相似的语言可以是指同一实施例,但这并不是必需的。
此外,在一个或多个实施例中,所描述的本发明的特征、优点及特性可以采用任何一种适当的方式来组合。本领域技术人员将会了解,本发明可以在没有特定实施例中的一个或多个特定特征或优点的情况下来实施。在其他实例中,在某些实施例中可以认识到附加的特征和优点,而这些特征和优点并未在本发明的所有实施例中呈现出。
从后续的描述以及权利要求中可以更全面地清楚理解本发明的这些特征和优点,或者这些特征和优点可以通过实施下文所述的本发明来加以了解。


为使本发明的优点易于理解,将参考附图中描述的特定实施例来对上文简述的发明进行更为具体的描述。应该理解的是,这些附图仅仅描述的是本发明的典型实施例,由此不应将其视为是对本发明的范围进行限制,将会通过使用附图并且结合附加的特征和细节来对本发明进行描述和说明,在附图中图1是例示现有技术中基于进程的存储器保护体系结构的示意框图;图2是例示依照本发明控制计算设备中的子上下文间的存储器访问的装置的一实施例的示意框图;图3是例示本发明一实施例中的某些模块的框图;图4例示了可在本发明一实施例中使用的两个表格;图5是例示依照本发明的用于存储器保护的方法的一实施例的示意流程图;
图6是例示本发明一实施例中的进程与子上下文之间的关系的框图;以及图7a和7b是例示结合本发明的两种可能的线程实现的框图。
具体实施例方式
本说明书中描述的众多功能单元都已被标记成模块,以便更为特别地强调其实现方式的独立性。举例来说,模块可以作为硬件电路来实现,其中该硬件电路包括定制的VLSI电路或门阵列、诸如逻辑芯片之类的现有半导体、晶体管或其他分离组件,模块也可以在可编程的硬件设备中实现,其中该硬件设备诸如现场可编程门阵列、可编程阵列逻辑、可编程逻辑设备等等。
模块也可以采用用于由多种类型的处理器所执行的软件的形式来实现。举例来说,经过识别的可执行代码模块包括一个或多个物理或逻辑的计算机指令块,这些计算机指令块例如可以被组织成对象、过程或功能。然而,经过识别的模块的可执行代码未必在物理上是同处一地的,而是可以包括存储在不同位置的分离指令,当在逻辑上将这些指令连接在一起的时候,这些指令包括该模块并且实现该模块的所述功能。
实际上,可执行代码模块可以是单个指令,也可以是多个指令,甚至可以分布到若干个不同代码段、不同程序中以及若干个存储器设备中。同样,在这里可以在模块内标识和例示工作数据,也可以采用任何适当形式来包含工作数据,还可以用任何适当类型的数据结构来组织工作数据。工作数据可以作为单个数据集来收集,或者可以分布在包括不同存储设备在内的不同位置,并且可以至少部分地只作为系统或网络上的电子信号而存在。
在全部的本说明书中,关于“一实施例”、“实施例”的引用或类似的语言指的是将结合该实施例所描述的特定特征、结构或特性包括在本发明的至少一实施例中。因此,在全部的本说明书中,所出现的短语“在一实施例中”、“在实施例中”以及相似的语言可以全都指同一实施例,但这并不是必需的。
对信号承载媒体的引用可以采用能够生成信号、使得信号生成或是使得机器可读指令程序在数字处理装置上运行的任何形式。信号承载媒体可以包括传输线、紧致光盘、数字视频盘、磁带、贝努里驱动器、磁盘、穿孔卡、闪速存储器、集成电路或其他数字处理装置的存储设备。
此外,在一个或多个实施例中,所描述的本发明的特征、结构或特性可以采用任何适当的形式来组合。在后续描述中,提供了众多的特定细节,以便提供关于本发明实施例的精确理解,这些细节例如编程、软件模块、用户选择、网络事务、数据库查询、数据库结构、硬件模块、硬件电路、硬件芯片等等。然而,本领域技术人员将了解,本发明是可以在没有一个或多个特定细节的情况下实施的,此外,本发明也可以借助其他的方法、组件、材料等等来实施。在其他实例中,并未详细显示或描述那些众所周知的结构、材料或操作,以免与本发明的方面相混淆。
图1描述了传统的基于进程的受保护存储器计算设备100的一实施例,其中显示的是将存储器块分配给进程。传统的计算系统实现了在伪并行环境中运行多个进程的多任务处理操作系统。存储器则是由系统单独分配给每一个进程的。
在计算设备100中,进程A是在独立于进程B的情况下运行的。存储器块104、106以及108被分配给了进程A。图中将进程与存储器块相连的正交线例示的是在逻辑上将特定存储器块分配给特定进程。存储器块116、118以及120被分配给进程B。存储器块102在进程A与进程B中间共享。
存储器块可以是从随机存取存储器(RAM)或其他存储媒体分配的。如所示,存储器块可以包含数据或代码。传统的系统往往创建的是类似102的共享只读存储器块,以便保持可以被多个进程调用的可重入库服务代码。
在计算设备100中,系统阻拦某些存储器访问,同时允许其他的存储器访问。存储器访问可以是读取存储器的请求、访问存储器的请求、或是在特定存储器位置执行代码的请求。在附图中,对角实线代表存储器访问。进程对分配给该进程的存储器的存储器访问通常是允许的。由于进程A的存储器访问针对的是分配给进程A的存储器块208,因此存储器访问110是允许的。
作为选择,由于存储器块116并未分配给进程A,而是仅仅分配给了进程B,因此,进程A对存储器块116的存储器访问112被阻拦。由于存储器块102被分配给了进程A和进程B,因此,任何一个进程都可以访问共享存储器块102中的存储器。
这种存储器保护方法是基于将存储器块分配给特定进程以及防止一个进程访问并非分配给该进程的存储器块的,该方法被称为基于进程的存储器保护。基于进程的存储器保护可以由专用的处理器、总线、寄存器以及表格来提供援助,以便减少用于实现基于进程的存储器保护的开销。
每一个进程以及与之关联的存储器都是上下文(context)。当计算设备挂起一个进程并且激活第二个进程的时候,进行上下文切换。上下文切换会导致某些耗时的开销成本,这些开销成本关联于清洗缓冲器、增加的高速缓存缺失、将页存入次级存储装置、从次级存储装置中恢复页面以及类似的活动。
图2是例示依照本发明控制计算设备中的存储器访问的装置的一实施例的示意框图。图2描述的是计算设备200。进程A和进程B正在多任务处理环境中在计算设备200上运行。存储器块204、206以及208分配给了进程A,而存储器块210、212和214被分配给了进程B。存储器块202是在进程A与B之间共享的。
图2还描述了本发明的关键组件之一——子上下文。子上下文是存储器的逻辑群组。子上下文可以包括一个或多个存储器块。然而,任何特定的存储器位置只可以被包括在一个子上下文中。对角虚线例示了将存储器块分配给子上下文。如虚线所示,子上下文220包括存储器块202。即使在进程A与B之间共享该存储器块202,但该存储器块202并未与任何其他子上下文共享。子上下文222包括存储器块204和206。子上下文224包括存储器块208和214。
在当前的代码执行点指向处于与子上下文相关联的存储器块内部的存储器地址之时,给定子上下文是有效的。举例来说,如果计算设备当前正在执行存储块204中存储的代码,那么有效子上下文230是子上下文222。在代码执行点的线程移动到另一个并非分配给所述有效子上下文的存储器块之时,那么该有效子上下文改变为与包含当前代码执行点的存储器块相关联的子上下文。举例来说,如果处理器启动位于存储器块208中的代码的处理,那么子上下文224将会成为有效子上下文。
虽然这种基于进程的存储器保护方案可以与本发明并行或者作为本发明的一部分而继续工作,但是本发明引入了由计算设备强制执行的附加存储器保护规则。一般来说,借助本发明可以阻止有效子上下文访问不与所述有效子上下文相关联的存储器。举例来说,由于有效子上下文222正访问的是其自身子上下文内部的存储器,因此本发明允许存储器访问234。
然而,由于没有将存储器块202分配给有效子上下文222,因此本发明阻止有效子上下文222对存储器块202的存储器访问232。与此相反,所述存储器块202被分配给子上下文220。
该图例示了将基于进程的存储器保护与基于子上下文的存储器保护的结合。在所示的示例中,如果有效进程A在执行存储器访问234时是有效进程,那么基于进程的存储器保护将会允许该访问。然而,如果进程B在执行存储器访问234时是有效的,那么基于进程的保护将会阻拦存储器访问234。通过将其结合使用,这两种存储器保护方案可以阻拦存储器访问。
本发明包括覆盖处理,以便允许有效子上下文访问第二子上下文中的存储器。目标子上下文或是经特许的子上下文可以创建权限映射,以便允许访问方(accessor)的子上下文访问分配给目标子上下文的存储器。举例来说,子上下文220可以创建映射,由此允许子上下文222对子上下文220进行读取访问。这种权限映射将被存储在子上下文映射模块308中(参见图3)。通过恰当地执行这种权限映射,将允许存储器访问232用于只读。
可以创建用于读取、写入和执行权限的权限映射。读取权限映射将允许访问方子上下文读取与目标子上下文相关联的数据。同样,写入权限映射将允许访问方子上下文写入与目标子上下文相关联的数据。执行权限映射将允许访问方子上下文在目标子上下文中执行代码。当然,由于代码执行点将会移动到目标子上下文,因此,代码在目标子上下文中的执行将会导致有效子上下文切换到目标子上下文。在下文中将会参考图3来描述另一种用于控制子上下文间的程序调用的方式。
此外,在某些实施例中,权限映射可以是可迁移的(transitive)。如果存在允许子上下文A访问子上下文B的映射并且还存在允许子上下文B访问子上下文C的映射,那么子上下文A访问子上下文C的隐性映射是允许的。然而,并非意味着相反的权限映射。在没有明确映射的情况下,从A到B的权限映射并不意味着从B到A的映射是得到许可的。
图3描述的是本发明的装置实施例300的主要组件的逻辑表示。装置300包括控制模块302、子上下文存储器关联模块306以及子上下文映射模块308。子上下文映射模块308的某些部分可以作为子上下文入口点模块310来实现。
子上下文存储器关联模块306提供了一种用于追踪哪些存储器块与给定子上下文相关联的工具。这可以采用多种方式实现。该工具可以作为列举了计算设备中的所有子上下文以及相关联的存储器块的表格来实现。该工具也可以通过在每一个页表条目中创建附加字段来实现。所述附加字段将标识相关联页面所属的子上下文。如这两个示例所示,子上下文存储器关联模块可以作为紧密集成的对象或是作为松散耦合的机制来实现。
子上下文映射模块308保持了权限映射列表。如上所述,权限映射规定了哪些子上下文可以访问与目标子上下文相关联的存储器。举例来说,权限映射存储映射到目标子上下文T的访问方子上下文A,其中所述子上下文A具有相关联的权限掩码M(A,T,M)。这种条目允许子上下文A依照权限掩码M所规定的权限来访问子上下文T中的存储器。
存储器访问包括读取、写入和执行访问。通常,权限映射是由目标在子上下文映射模块中注册的。然而,由操作系统进行注册或者由特殊的经特许子上下文进行注册也是允许的。
此外,子上下文映射表的执行映射部分可以作为子模块来实现,所述子模块被显示为子上下文入口点模块310。子上下文入口点模块310保持了用于子上下文之间的代码执行的权限映射列表。
在一实施例中,子上下文入口点模块为每一个子上下文保持了入口点列表。入口点条目存储访问方子上下文A、目标子上下文T以及入口点地址X(A->T,X)。条目(A->T,X)允许访问方子上下文A在目标子上下文T中在地址X处执行入口点。入口点地址X可以作为单个入口点地址来规定,或者作为地址的范围来规定。然而,将入口点限制成单个地址可以提供更高的安全级别。与其他权限映射一样,只有目标子上下文或经特许的子上下文才可以在该表中为给定的目标子上下文创建条目。
控制模块302监视存储器访问以及子上下文间的代码执行,并且强制实施基于子上下文的存储器保护。在某些实施例中,控制模块可以包括当前的子上下文引用320,并且可以包括先前的子上下文引用322。
控制模块可以通过检测子上下文失效来监视存储器访问。与页失效相同,子上下文失效是在当前子上下文尝试访问当前子上下文之外的存储器的时候出现的。这可以采用硬件或软件形式来实现。
在本发明的一实施例中,子上下文实现检测是以软件形式实现的。控制模块为当前子上下文中未包括的所有页修改页权限,由此将为对当前子上下文之外的页的访问生成页失效。对不与当前子上下文相关联的页的存储器访问导致页失效,所述页失效由控制模块处理。然后,该控制模块检查子上下文映射模块以及子上下文入口点模块中的条目,以便确定是否应该忽略失效。如果访问被允许,那么控制模块将执行过程传递到页失效处理器,以确保基于进程的存储器保护同样允许所述访问。如果访问被拒绝,则阻止所述子上下文访问所请求的存储器。
在本发明的另一实施例中,通过向CPU添加附加寄存器,并且修改存储器保护逻辑来包括对于子上下文间的访问的检查,而以硬件方式来实现控制模块。子上下文存储器关联模块306是作为页表的各个条目中的新字段来实现的,其中所述字段与每一个存储器页相关联。存储器页被分配给子上下文,而子上下文关联被记录在页表中。
本领域技术人员将会了解,依照本领域中当前已知的技术,控制模块302、子上下文存储器关联模块306以及子上下文映射模块308可以用硬件、软件或两者相结合而实现。同样,子上下文间的执行保护可以作为子上下文映射模块308的读取或写入访问保护的一部分来实现,或者可以作为子上下文入口点模块310来实现,还可以作为子上下文映射模块310的子模块来实现。
在某些传统的系统中,虚拟存储器地址由页表或转换后备缓冲器转换成物理地址。某些系统将与当前页相关联的进程的进程ID存储为页表的相应记录中的字段。在对存储器的请求期间,地址转换逻辑将当前进程ID与所请求页的页表条目中存储的进程ID相比较。如果进程ID不匹配,则生成异常。
同样,依照本发明的一实施例,地址转换逻辑将页表中的子上下文ID与有效子上下文中的子上下文ID相比较。如果这二者不匹配,并且在子上下文映射模块中不存在权限映射,则生成子上下文存储器异常,由此阻止对被请求的存储器进行访问。
控制模块逻辑可以用软件、硬件或是这两者相结合而实现。同样,子上下文存储器关联模块306、子上下文映射模块308以及子上下文入口点模块310也可以用软件、硬件或是这两者相集合而实现。
图4描述在子上下文映射模块308以及子上下文入口点模块310中存储的字段的一实施例的更详细的逻辑表示。所示的子上下文映射模块具有三列,分别是目标子上下文、访问方子上下文以及权限掩码。对子上下文间的存储器访问而言,控制模块302(参见图3)检查子上下文映射模块,以便确定是否存在用于目标-访问方对的条目。在所描述的表格中的第一个条目允许子上下文A对子上下文T进行读取和写入的访问。第二个条目允许子上下文B对子上下文T进行读取、写入和执行操作的访问。而第三个条目允许子上下文C对子上下文A1进行只读的访问。最后,第四个条目允许子上下文A1对子上下文T1进行只读访问。
注意,在本发明的某些实施例中,子上下文的权限可以是可迁移的。因此,在目标和访问方列中同时出现了一个子上下文的基础上,可以允许可迁移的访问。在所示的示例中,C可以访问A1,并且A1可以访问T1。由于这两个条目都允许只读访问,因此C将同样能够对T1进行只读访问。
同样,子上下文入口点模块310描述入口点模块310的一实施例。显示了三列目标子上下文、访问方子上下文以及入口点地址或地址的范围。第一个条目允许子上下文A调用子上下文T中的单个地址0×FA00002B。第二个条目允许子上下文B调用子上下文T中的地址的范围。第三个条目允许子上下文C调用子上下文A1中的单个的入口点,而第四个条目允许子上下文A1调用子上下文T1中的任何地址。
注意,子上下文A1作为目标子上下文而被列举在一个条目中,并且作为访问方子上下文被列举在另一个条目中。由于某些子上下文实现方式的可迁移特性,子上下文C将同样能够执行子上下文T1中的任何代码位置。在某些实现方式中,如果在子上下文映射模块308中配置了类似的可迁移权限,那么相同的情况对数据访问而言也是适用的。
这些附图仅仅用于说明目的。对本领域技术人员来说,用于合并条目以及优化表格中的搜索的各种优化处理都将是显而易见的。
后续的示意流程图主要是作为逻辑流程图来阐述的。同样,所描述的顺序和所标记的步骤表示的是所给出的方法的一实施例。还可以设想其他的步骤和方法,这些步骤和方法在功能、逻辑或效果方面与所述方法中的一个或多个步骤或是其某些部分是等同的。此外,所使用的格式和符号被提供用于说明方法的逻辑步骤,并且不应该被理解成是对本方法的范围进行限制。虽然在流程图中可以使用各种箭头类型和线条类型,但是这些箭头类型和线条类型不应该被理解成是对相应方法的范围进行限制。实际上,某些箭头或其他连接符可以用于仅仅指示本发明的逻辑流程。举例来说,箭头可以表示处于所述方法中被列举的步骤之间的未规定持续时间的等待或监视周期。另外,产生特定方法的顺序可以严格符合所显示的相应步骤的顺序,也可以不符合。
图5是描述用于实现受保护的存储器虚拟子上下文的方法500的流程图。在一实施例中,方法500是作为遵循信号承载媒体中包含的指令的结果来执行的,其中所述信号承载媒体有形地包含机器可读指令的程序。操作集合500包括开始502、将存储器块与子上下文相关联504、存储访问权限506、追踪有效子上下文508、追踪存储器访问510、确定是否允许存储器访问512、阻拦或允许访问516和514、返回504518以及结束520。
关联存储器块504可以作为计算设备初始化的一部分来启动,并在新程序启动和终止的时候继续进行。通常,可以执行新程序的有效子上下文从计算设备请求存储器资源,并且将这些存储器资源分配给特定的子上下文。而参考图3所描述的子上下文存储器关联模块306可以作为单个表格来实现,或者可以作为引用来实现,其中所述引用作为页表中各个条目的字段而被存储。同样,所述关联可以采用不同的方式来实现,这对本领域技术人员而言是显而易见的。
将存储器与子上下文相关联的处理可以由计算设备或是有效子上下文来控制。然而,有效子上下文通常将无权对先前分配给其他子上下文的存储器的关联进行修改。
存储访问权限506会在图3的子上下文映射模块308中创建条目。每一个条目都会为子上下文间的存储器访问创建覆盖选项。通常,有效子上下文会将自身作为目标子上下文而在表格中创建条目,这样允许另一个子上下文充当访问方子上下文。此外,经特许的子上下文可以为其他的目标子上下文分配权限。
追踪有效子上下文508是由控制模块执行的一个功能。在实际的实现方式中,控制模块的这个功能可以作为硬件寄存器或软件模块来实现。通过识别当前执行线程以及通过随后确定哪个子上下文与包含了当前正被执行的代码的存储器块相关联,可以确定有效子上下文。
追踪存储器访问510包括对所有的子上下文间的存储器访问进行监视。这可以采用软件或硬件的方式来实现。在某些实现方式中,可以包括安装异常处理器,所述异常处理器会在任何时间运行不与所访问的有效子上下文相关联的存储器页。在另一实现方式中,访问控制可以由专用硬件来处理。
确定是否允许子上下文间的存储器访问512包括在子上下文模块中定位与有效子上下文、目标子上下文以及存储器访问类型相对应的条目。如果存在用于当前存储器访问的条目,则允许所述存储器访问514。如果不存在用于当前存储器访问请求的条目,则阻拦所述存储器访问516。
最后,该处理通过返回(518)到504而继续进行。在实际的实现方式中,这些操作可以并行执行,也可以取决于计算设备的体系结构而以不同于这里所示的顺序执行。
图6描述服务子上下文访问的一实施例中的进程与子上下文的逻辑关系600。所述逻辑关系600包括三个进程进程A、进程B以及进程C。关系600还包括子上下文620。包含了可执行代码的存储器块624与子上下文620相关联。没有其他的子上下文或进程与子上下文620相关联。
此外,逻辑关系600还包括子上下文入口点模块610。入口点模块610包含入口点条目,该入口点条目的目标子上下文与子上下文620相对应。所述入口点还包括代码入口点以及设置成星号“*”的访问方子上下文。由于该入口点进行了编码,因此该入口点允许任何其他子上下文调用子上下文620中的入口点记录中所列举的入口点地址。
所述逻辑关系600例示了一种可使用本发明来实现可以由不可信代码访问的服务库的方法。进程A可以调用存储器块624中存储的系统级代码。本发明允许进程A仅仅调用入口点模块610中注册的经过证实的代码入口点。由于执行线程是在进程A中继续进行的,因此不需要上下文切换,这节省了通常与对系统库的调用相关联的上下文切换开销。
进程B和进程C还可以在同一个入口点上调用服务库例程。如果服务子上下文代码是以可重入方式写入的,那么不需要包括信号量(semaphore)或其他阻拦逻辑。然而,如果以不可重入的方式写入服务子上下文代码,那么可以使用阻拦机制来防止一个以上的进程同时使用所述代码。
此外,位于存储器块624中的服务子上下文代码可以被配置成对从中调用该服务上下文代码的子上下文进行访问。举例来说,与在进程A中运行的有效子上下文相关联的代码及数据段可以为子上下文620所访问。通常,执行调用的子上下文的代码和数据段是可以被目标子上下文访问的,但是并不总是这样。这样允许存储器块624中的系统库代码更新执行调用的子上下文中的数据结构,而不会产生上下文切换。这样,在使用本发明来实现系统服务调用时,避免了两次上下文切换。同样,执行调用的代码可以是不可信的用户应用。在某些情况下,软件设计人员可能希望对目标子上下文进行限制,以免其访问执行调用的子上下文中的数据或代码。本发明允许软件设计人员做出这种决定。
图6例示了本发明的另一个方面。在图6中,进程A、进程B以及进程C各自引用了与子上下文620相关联的共享存储器段。通常,每一个进程都可以使用不同的虚拟地址来引用共享存储器段中的相同位置。然而在本发明的一实施例中,用于访问与特定子上下文相关联的某些存储器段的虚拟地址必需是相同的。因此,进程A、进程B以及进程C将使用相同的虚拟地址来访问存储器块624中的相同存储器位置。
由于某些计算机体系结构中的可寻址存储器数量有限,因此有必要重复使用虚拟地址。使用相同的虚拟地址来定址不同存储器位置的两个子上下文被称为“重叠”子上下文。在缺少可用地址空间的很多实现方式中将需要所述重叠子上下文;其他的实现方式有可能具有足够大但并不需要的地址空间。例如,32位和64位体系结构分别是典型地缺少地址空间以及地址空间富裕的当前实现方式示例。
本领域技术人员将会理解,系统设计人员通常分配了一部分将使用非重叠虚拟地址来进行访问的存储器。无论哪一个进程使用虚拟地址,来自这个非重叠地址组的同一个虚拟地址都会映射到同一个物理地址。通常,系统设计人员会为系统代码分配非重叠存储器,并且会为应用代码分配重叠存储器地址。
再次参考图6,通过分配来自非重叠存储器的服务上下文,能够确保来自应用进程(例如进程A、进程B和进程C)的调用将全部使用相同虚拟地址来访问存储器块624。这样一来,用于转换虚拟地址的页表没有必要被更新来适应子上下文间的服务调用。
此外,存储器块624可以用于进程间的通信。存储器块624可以是从虚拟地址空间的非重叠部分分配的。子上下文620可以映射到进程A、进程B和进程C。这样一来,每一个进程都将能够使用相同的虚拟地址来访问存储器块624。这三个进程可以使用存储器块624来传递进程间的通信。
相同的进程间通信可以借助重叠地址来实现,但是非重叠地址将会极大地减少用于在两个进程之间传递数据的开销。在具有充足的可用虚拟地址可用的计算机体系结构中,理想地是分配所有来自非重叠地址空间的存储器。
图7a和7b描述使用了本发明的两种可能的实现方式。在图7a中,三个线程730、732和734中的每个都是在一个子上下文中运行的。如果说线程在子上下文中运行意味着包含了用于该线程的可执行代码的代码段与这个子上下文相关联。在这个代码正被执行的时候,所述子上下文是有效子上下文,并且所述线程在这个子上下文中运行。在图7a中,用于每一个线程的代码与子上下文D相关联,并且每一个线程都是在进程720的时间片中运行的。由于每一个线程都是在同一个子上下文中运行的,因此不会有子上下文存储器保护来阻止线程730访问任何一个数据块736、737或738。
与之相反,图7b描述三个子上下文E、F和G。线程740、742和744是在其相应的子上下文E、F和G中运行的。由于数据块746与线程740的子上下文相关联,因此线程740可以访问数据块746。然而,由于数据块747和748不与线程740的子上下文相关联,因此线程740被阻止访问数据块747和748。
在没有存储器保护的情况下,线程通常被称为轻量进程。在本发明的这个实施例中,为线程提供了受保护的存储器,同时不会产生进程切换的开销。每一个线程都是在进程750的进程控制下运行的。在未显示的另一实施例中,运行在相同子上下文中的线程也可以在不同进程之中运行。
本发明也可以采用其他的特定形式来实现,而不脱离本发明的实质或是其基本特性。所描述的实施例在所有方面都被视为仅仅是描述性而不是限制性的。因此,本发明的范围是由权利要求而不是先前的说明书所指示的。处于权利要求的等价物的含义和范围以内的所有变化都将被包含在其范围以内。
权利要求
1.一种用于在计算设备中控制子上下文之间的存储器访问的装置,该装置包括子上下文存储器关联模块,被配置对存储器块到子上下文分配进行管理;子上下文映射模块,被配置保持子上下文间的存储器访问权限;以及控制模块,被配置阻止与一子上下文相关联的计算机代码对分配给另一子上下文的存储器块的存储器访问,除非所述子上下文间的存储器访问权限允许所述存储器访问。
2.如权利要求1所述的装置,其中所述存储器访问是从包括存储器读取、存储器写入以及指令加载的组中选出的。
3.如权利要求1所述的装置,其中所述子上下文映射模块还包括子上下文入口点模块,该模块被配置保持用于子上下文的已注册入口点以及子上下文间的入口点权限,所述控制模块进一步被配置阻止未使用已注册子上下文入口点的子上下文间的代码调用,其中所述已注册子上下文入口点的权限允许当前的子上下文调用已注册入口点的子上下文。
4.如权利要求3所述的装置,其中所述计算设备以硬件形式实现用于所述子上下文映射模块的高速缓存、用于入口点表的硬件高速缓存、以及用于与当前代码执行点相关联的子上下文的寄存器。
5.如权利要求1所述的装置,还包括页表,该页表被配置分配来自随机存取存储器的存储器页,其中所述控制模块还阻止进程对并未分配给该进程的存储器位置的存储器访问。
6.如权利要求1所述的装置,其中所述子上下文存储器关联模块还被配置将多个进程可以访问的存储器块与子上下文相关联。
7.如权利要求6所述的装置,其中单个虚拟地址被配置允许多个进程访问所述存储器块。
8.如权利要求6所述的装置,其中所述子上下文映射模块中的存储器访问权限还被配置允许使用所述存储器块的多个进程之间的进程间通信。
9.如权利要求6所述的装置,其中所述子上下文映射模块中的存储器访问权限还被配置允许在多个进程中运行的多个线程访问单个子上下文中的存储器。
10.如权利要求6所述的装置,其中所述子上下文存储器映射模块中的存储器访问权限还被配置允许一子上下文中的应用直接调用系统级别库子上下文中,由此不需要进行上下文切换。
11.一种用于控制子上下文之间的存储器访问的系统,该系统包括计算设备,包括中央处理单元;以及可以被所述中央处理单元访问的随机存取存储器;子上下文存储器关联模块,被配置保持存储器块到子上下文的分配;子上下文映射模块,被配置保持子上下文间的存储器访问权限;以及控制模块,被配置阻止与一子上下文相关联的计算机代码对分配给另一子上下文的存储器块的存储器访问,除非所述子上下文间的存储器访问权限允许所述存储器访问。
12.如权利要求11所述的系统,其中受到所述控制模块阻止的存储器访问是从包括存储器读取、存储器写入以及指令加载的组中选出的。
13.如权利要求11所述的系统,所述子上下文映射模块还包括子上下文入口点模块,该模块被配置保持用于子上下文的已注册入口点以及子上下文间的入口点权限,所述控制模块进一步被配置阻止未使用已注册子上下文入口点的子上下文间的代码调用,其中所述已注册子上下文入口点的权限允许与一子上下文调用代码相关联的代码,所述一子上下文调用代码与第二子上下文相关联。
14.一种信号承载媒体,该媒体有形地包含了机器可读指令程序,所述机器可读指令程序可由数字处理装置执行,以便执行一组操作来控制子上下文之间的存储器访问,所述操作包括将存储器块分配给特定的子上下文;追踪关联于第一子上下文的计算机代码对关联于第二子上下文的存储器块所进行的存储器访问;以及依照子上下文映射模块中存储的子上下文间存储器访问权限来阻止所述存储器访问。
15.如权利要求14所述的信号承载媒体,其中阻拦存储器访问阻拦的是从包括存储器读取、存储器写入以及指令加载的组中选出的访问。
16.如权利要求14所述的信号承载媒体,其中所述操作还包括存储用于子上下文的已注册入口点以及子上下文间的入口点权限;以及阻止执行未使用已注册子上下文入口点的子上下文间的代码调用,其中所述已注册子上下文入口点的权限允许与第一子上下文相关联的代码调用与第二子上下文相关联的代码。
17.如权利要求14所述的信号承载媒体,其中所有所述操作都用软件实现。
18.如权利要求14所述的信号承载媒体,其中所述子上下文映射模块被集成在数字处理装置的中央处理单元中。
19.一种部署计算基础设施的方法,包括将计算机可读代码集成到计算系统中,其中所述代码结合所述计算系统能够执行以下操作将存储器块分配给特定的子上下文,并将所述分配存储在子上下文存储器关联模块中;将子上下文间的存储器访问权限存储在子上下文映射模块中;追踪关联于第一子上下文的代码对关联于第二子上下文的存储器块所进行的存储器访问;以及依照所述子上下文间存储器访问权限来阻止所述存储器访问。
20.如权利要求19所述的方法,其中所述代码结合所述计算系统还能够执行以下操作保持用于每个子上下文的一组已注册入口点以及相关联的子上下文间的入口点权限;以及阻止关联于一子上下文的计算机代码对关联于另一子上下文的计算机代码的代码调用。
全文摘要
一种用于在计算设备中控制子上下文之间的存储器访问的装置、系统和方法。所述装置、系统和方法实现了关联存储器块组的子上下文。所述装置、系统和方法保持用于子上下文间的存储器访问的权限映射。控制模块监视所有的子上下文间的存储器访问,并且阻止那些不存在权限映射的访问。
文档编号G06F9/46GK1924815SQ200610121998
公开日2007年3月7日 申请日期2006年8月30日 优先权日2005年8月31日
发明者R·L·路易斯 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1