买专利卖专利找龙图腾,真高效! 查专利查商标用IPTOP,全免费!专利年费监控用IP管家,真方便!
申请/专利权人:英特尔公司
摘要:本文公开了用于计算的装置。在实施例中,装置可以包括一个或多个处理器、存储器和编译器,编译器用于由一个或多个处理器操作以编译计算机程序。编译器可以包括一个或多个分析器,用于解析和分析计算机程序的生成指针或取消引用指针的源代码。编译器还可以包括耦合到一个或多个分析器的代码生成器,用于生成用于计算机程序的源代码的可执行指令,包括至少部分地基于分析的结果将附加的加密或解密可执行指令插入到计算机程序中,以对所述源代码的存储器访问操作进行认证。
主权项:1.一种用于对存储器区域的访问进行认证的装置,包括:第一处理器;以及由所述第一处理器操作以编译计算机程序的编译器,其中,所述编译器包括:一个或多个分析器,用于解析和分析所述计算机程序的生成指针或取消引用指针的源代码;以及代码生成器,其耦合到所述一个或多个分析器,以生成针对所述计算机程序的源代码的可执行指令,包括至少部分地基于所述分析的结果,将附加的加密或解密可执行指令插入到所述计算机程序的所述源代码的所生成的可执行指令中,以对所述源代码的存储器访问操作进行认证;其中,当所述计算机程序的所述源代码的所生成的可执行指令以及所述附加的加密或解密可执行指令由第二处理器执行时,所执行的加密指令的输出包括至少部分加密的指针,并且所述至少部分加密的指针包括嵌入的元数据,所述嵌入的元数据授予对与所述第二处理器耦合的存储器的存储器位置的访问权,并且其中,所述至少部分加密的指针被输入到解密指令中,当所述解密指令被执行时,恢复所述指针。
全文数据:用于隔离的密码强制执行能力技术领域本公开的实施例涉及计算领域,尤其涉及与用于引导和限制计算机程序的存储器访问的加密和解密指针包括相关联的元数据相关联的装置、方法和存储介质。背景技术当软件应用运行在计算设备上时,处理器执行机器级指令,应用的高级源代码已经例如,通过编译器翻译成该机器级指令。特定处理器可以执行的预定义的机器级指令集合是处理器的指令集。处理器通常从存储器中获取与软件应用的功能相对应的机器级指令,并且然后执行指令。在软件应用执行期间,操作系统可以使用存储器分配机制将存储器分配给执行的进程。存储器分配机制分配存储器的量例如,存储器位置的块,其中存储器位置的块的大小被指定为变元,并且返回指向已分配存储器的起始处的指针例如,指针指向已分配存储器位置的块的起始处。在一些上下文中,多个进程可以在计算设备的处理器上同时执行,并且每个进程可以对处理器的共享的存储器区域有访问权。恶意代码可能通过对手或对计算设备的攻击而被插入到高级源代码和机器中,以及可能其它的程序表示代码中。恶意代码可能试图访问该进程的原始源代码未曾试图访问或未曾有访问权的存储器区域要么特定于单个进程要么由多个进程共享。可替代地,原始源代码可能部分地或整体地由试图损坏运行在通过试图执行未授权存储器访问而运行恶意代码的同一平台上的其它服务的安全性的对手创作。附图说明通过下面结合附图进行的详细描述将容易理解实施例。为便于该描述,附图标记指代相似的结构元件。在附图的图中通过示例的方式而非限制的方式来示出实施例。图1A示出了根据各个实施例的用于编译源代码并且输出包括插入的加密和解密指令的可执行代码的示例编译器架构。图1B示出了根据各个实施例的用于加载计算机程序的源代码、识别源代码在何处生成指针或取消引用指针、以及生成包括加密和解密指令的可执行代码的过程的操作流程的概览。图2示出了根据各个实施例的用于托管运行时环境中的多个服务的示例存储器布局。图3示出了根据各个实施例的加密的指针。图4示出了根据各个实施例的诸如图3所示的加密的指针转换成普通指针以及将普通指针传递给标准指令。图5示出了根据各个实施例的用于执行解密指令的过程的操作流程的概览。图6示出了根据各个实施例的用于处理存储器访问请求的运行时过程的操作流程的概览。图7示出了根据各个实施例的通过加载预缓存的纪元密钥并且生成新密钥而实现的优化。图8示出了根据各个实施例的包括共享堆和两个示例保护域的示例存储器布局。图9A示出了根据各个实施例的通过运行于图8的示例保护域中的函数生成的示例指针。图9B示出了根据各个实施例的通过运行于图8的示例保护域中的函数生成的附加示例指针。图10示出了根据各个实施例的通过在每个ENDBRANCH间接分支有效位置标记指令后添加边界检查来维护保护域之间的完整性。图11示出了根据各个实施例的具有适合于实践本公开的数据流机器硬件加速器的计算机设备的框图。图12示出了根据各个实施例的具有被配置成实践图1A、图1B、图4、图5和图6的过程的方面的指令的示例计算机可读存储介质。具体实施方式在实施例中,用于计算的装置可以包括一个或多个处理器、存储器以及由一个或多个处理器操作以编译计算机程序的编译器。编译器可以包括:一个或多个分析器,用于解析和分析计算机程序的生成指针或取消引用指针的源代码;代码生成器,其耦合到所述一个或多个分析器以生成计算机程序的源代码的可执行指令,包括至少部分地基于分析的结果将附加的加密或解密可执行指令插入计算机程序,以对源代码的存储器访问操作进行认证。在实施例中,加载到同一进程的不同服务可能按需地仅被授予对存储器区域的访问权,而并非是进程中的所有代码被授予对该进程的地址空间内的所有存储器的完全访问权。此外,在实施例中,用于认证对运行在计算设备上的一个或多个应用所共享的存储器区域的访问的方法可以包括:从运行时环境的保护域PD中运行的函数接收针对分配共享存储器中的对象并且生成访问它的能力的第一请求,以及将密钥分派给PD并且使用PD的标识符PDID和密钥来生成到对象的存储器位置的加密的指针。该方法还可以包括:从运行于PD中的函数接收针对使用该能力的第二请求,以及解密该能力并且将到对象的未加密指针传递给函数。在下面的说明中,参考了附图,附图构成了说明书的一部分,其中相似的标记始终指代相似的部分,并且其中通过图示说明的方式示出了可以实践的实施例。应当理解,在不脱离本公开的范围的情况下,可以使用其他实施例并且可以进行结构或逻辑改变。因此,下面的详细说明不应看作限制含义,实施例的范围仅由随附权利要求及其等同内容来限定。各种方法的操作可以以对于理解所要求保护的主题最有帮助的方式依次描述为多个离散动作或操作。然而,描述的顺序不应被解释为意味着这些操作必然是依赖于顺序的。特别地,这些操作可能不按照呈现的顺序执行。所描述的操作可以以与所描述的实施例不同的顺序执行。可以在附加实施例中执行各种附加操作和或可以省略、拆分或组合所描述的操作。为了本公开的目的,短语“A和或B”是指A、B或A和B。为了本公开的目的,短语“A、B和或C”是指A、B、C、A和B、A和C、B和C或A、B和C。描述可以使用短语“在一个实施例中”或“在实施例中”,其可以各自指代相同或不同的实施例中的一个或多个。此外,关于本公开的实施例使用的术语“包括comprising”,“包括including”,“具有”等等是同义词。此外,注意的是,实施例可以被描述为描绘为流程图表、流程图、数据流图、结构图或框图的过程。虽然流程图表可以将操作描述为顺序过程,但是许多操作可以并行地、并发地或同时地执行。另外可以重新安排操作顺序。当其操作完成时过程可以终止,但还可以具有未包括在图中的附加步骤。过程可以对应于方法、函数、步骤、子例程、子程序等。当过程对应于函数时,其终止可以对应于函数返回到调用函数和或主函数。此外,过程可以由硬件、软件、固件、中间件、微码、硬件描述语言或其任意组合来实现。当以软件、固件、中间价或微码实现时,执行必要任务的程序代码或代码段可以存储在机器或计算机可读介质中。代码段可以表示步骤、函数、子程序、程序、例程、子例程、模块、程序代码、软件包、类或指令、数据结构、程序语句等的任意组合。如包括权利要求在内的本文所使用的,术语“电路”可以指执行一个或多个软件或固件程序、可编程组合逻辑电路例如,现场可编程门阵列FPGA和或提供所述功能的其它合适的硬件组件的专用集成电路ASIC、电子电路、处理器共享、专用或组,包括数据流机器的一个或多个“处理元件PE和或存储器共享、专用或组,是其一部分或包括这些。在一些实施例中,电路可以实现一个或多个软件或固件模块,或者与电路相关联的功能可以由一个或多个软件或固件模块来实现。如包括权利要求在内的下文所使用的,术语“存储器”可以表示用于存储数据的一个或多个硬件设备,包括随机存取存储器RAM、磁RAM、核心存储器、只读存储器ROM、磁盘存储介质、光存储介质、闪存设备和或用于存储数据的其它机器可读介质。术语“计算机可读介质”可以包括但不限于存储器、便携式或固定存储设备、光存储设备、无线信道以及能够存储、包含或携带指令和或数据的其它各种介质。如包括权利要求在内的下文所使用的,术语“保护域”PD是指对受保护资源的一组访问特权。在许多进程共存的情况下,每个进程具有经由某种形式的密钥对多个受保护资源的不同访问许可,将一组这样的密钥组合在一起以提供对其所需的资源的访问权给单个进程可能是便利的。访问控制可然后独立于所涉及的进程被操纵。保护域可以是一组密钥,或者等同地是密钥给予访问权的一组资源。多个保护域可以操作于服务器或其它计算设备上,并且它们可以各自对共享存储器具有访问权。在多个微服务见下文操作于单个设备上的情况下,每个微服务可以在单独的保护域中进行操作。计算设备可以将一个或多个保护域访问权中的每一个分派给专用存储器区域用于其代码栈和专用堆,并且还可以在受制于条件的情况下或在定义的时间间隔内将每个保护域访问权授予共享存储器区域。如包括权利要求在内的下文所使用的,术语“微服务”是指应用开发方法,其中开发单个应用作为一套小服务,每个服务运行于其自己的进程并且与轻量级机制进行通信,通常是HTTP资源API。服务围绕商业能力构建并且可独立地部署。注意的是,在软件应用中,程序源被变换成用于特定处理器的机器可执行指令的列表,其然后被加载到与处理器附接的存储器中。数据和指令从存储器读入处理器核心,其中指令被执行,然后结果回写到存储器。在实施例中,用于编译计算机程序的编译器可用于解析和分析计算机程序的源指令,包括生成指针或取消引用指针的源代码的标识,并且还可以用于生成并输出计算机程序的可执行代码,包括至少部分地基于分析结果将附加的加密或解密可执行指令插入计算机程序中,以对源代码的存储器访问操作进行认证和授权。此处注意,编译器是读取源代码以源语言的形式并且将其翻译成目标代码以机器语言的形式的程序。编译器在制定目标代码的同时形成了中间代码以无关机器的形式。例如,用于C的编译器将C编程语言的高级源代码翻译成机器语言的目标代码,该目标代码可由计算机处理器执行,例如,能在处理器上执行的X86指令或能在处理器上执行的机器指令。另外,用于C的编译器在形成目标代码的同时形成中间代码。可以在中间代码上执行无关机器的和取决于机器的优化。还注意到,复杂数据中心工作负载越来越被结构化为微服务,因为工作负载的整体功能被划分成若干松散耦合的服务,这些松散耦合的服务通常在不同的容器中隔离并且经由消息传递进行通信。进程和远程步骤调用RPC的这种增长会从多个源引入大量的开销。在实施例中,可以生成新指令以通过将多个服务组合到单个地址空间中而使得指向消息数据的指针能够直接被共享,来缩减该开销。然而,即使服务可以共享地址空间,这样的新指令也可以通过对各服务必须拥有以便访问诸如存储器中的消息内容的共享资源的能力标记进行加密来保持各个微服务隔离。如所提到的,在实施例中,编译器可以插桩instrument原始源代码以插入新指令。新指令可以包括在生成指针的任何源代码指令之后的加密指令,并且还可以包括其插入在源代码取消引用指针的地方的解密指令。图1A和图1B示出了根据各种实施例的该编译器插桩过程。参考图1A,从编译器框101开始,可以存在扫描器、或词法分析器,它们可以将源程序102的字符流转换成标记流,并且移除空格,移除评论,扩展宏,等等。所得标记流可以传递给解析器,或句法分析器103,它们可以将标记序列转换成例如抽象句法树。由解析器103生成的抽象句法树可以被传递给语义分析器105,语义分析器105可以检查合法规则,并且在这样做时还可以捆绑句法树的各片通过求解标识符引用,插入投掷cast操作以进行隐式强制coercion,等等以形成语义图。在实施例中,语义分析器105可以识别源程序102的嵌套的环和数据相关性,并且将信息包括在语义图中。继续参考图1A,由语义分析器105生成的语义图可以传递到中间代码和谓词计算代码生成器110。中间代码和谓词计算代码生成器110可以根据语义图来生成源程序102的中间代码预先优化。在实施例中,中间代码和谓词计算代码生成器110还可以产生用于在指针生成后对指针进行加密的代码以及用于在指针被取消引用时将指针解密的代码。中间代码包括用于对指针加密和对指针解密的代码可以传递给无关机器的代码改进器113。无关机器的代码改进器113可以通过各种方式来优化中间代码,并且将经优化的代码传递给目标代码生成器115。目标代码生成器115可以将基本框串连在一起成为具有落空fall-through的直线代码,并且将汇编语言代码传递给最后级,取决于机器的代码改进器117,取决于机器的代码改进器117可以执行附加的优化和清理,并且产生可执行代码112。如图1A中的112处所示,编译器100A输出包括加密指令和解密指令的可执行代码以对指针生成和源代码中的指针取消引用进行认证。在一些实施例中,这些加密和解密指令可以是“ENCCAP”加密能力、“DECDCAP”解密数据能力和“DECCCAP”解密代码能力指令,如下文详述的。可替代地,它们可以是具有相似或等同功能的其它指令。在实施例中,加密和解密指令可以提供用于计算机程序的一部分向程序的另一部分发送授权以访问某部分存储器的机制。除了并入这些教导之外,编译器100A可以是本领域已知的任何编译器,能够以高级语言例如C、C++、Fortran等来编译源代码并且输出机器可执行代码。虽然为了易于理解,将编译器100A描述为具有七个阶段。在替代实施例中,一些阶段可以组合或拆分。类似地,在替代实施例中,指针生成和指针取消引用的识别以及生成代码以对指针进行加密以及对加密的指针进行解密可以在编译器的除了语义分析器105和或中间代码和谓词计算代码生成器110的其它阶段或补充功能中实现。图1B示出了根据各个实施例的操作于源代码上并且生成包括用于对生成的指针进行加密并且对取消引用的指针进行解密的可执行代码的对应的对象代码的编译器例如,具有图1A所描绘的架构的编译器的过程的操作流程的概览。如图所示,过程100B可以包括在框140-170处执行的操作。参考图1B,过程100B可以开始于框140。在框140处,编译器可以加载用于分析的计算机程序的源指令,例如图1A的源程序102。从框140,过程100B可以进行到框150,在框150中编译器可以识别源代码在何处生成指向一个或多个存储器地址的指针。从框150,过程流可以进行到框160,其中编译器可以生成并输出可执行计算机代码,在被执行时,可执行计算机代码对指针进行加密,并且将所识别的指令插入源代码中。从框160,过程100B可以进行到框170,其中编译器可以识别源代码在何处取消引用指向一个或多个存储器地址的指针。从框170中,过程流可以进行到框180,其中编译器可以生成并输出可执行计算机代码,在被执行时,可执行计算机代码对加密的指针进行解密在存储器中将其取消引用之前。从框180中,过程流可以返回到框150,如果有要分析的更多源代码,并且在框150至180处重复处理,或者如果没有要分析的附加源代码,则过程100B可以终止。在实施例中,加载到相同过程的不同服务可能根据需要仅被授予对存储器区域的访问权,而不是给定过程中的所有代码被授予对该过程的地址空间内的全部存储器的完全访问权。例如,在图2中描绘了用于托管被作为虚拟机托管的运行时环境中的多个微服务的一个可能的存储器布局。对此进行参考,存在具有其自己的代码栈211和专用堆213的根PD210。类似地,还存在与第一服务相关联的PD#1220以及与运行时环境中操作的第二服务相关联的PD#2230。继续参考图2,与PD#1220和PD#2230相关联的每个服务如PD210一样具有栈和专用堆。另外,每个服务可以被根PD210授予访问共享堆240中的必要对象的能力,并且每个服务还可以生成授予它自己对其自己的栈和专用堆中的对象的访问权的能力例如,指针。在实施例中,这些能力可以由根PD210管理的密钥进行加密以防止未授权能力由这些服务生成,例如一个服务试图访问由另一服务处理的对象。继续参考图2,存在共享堆240,该共享堆240可由服务220和230使用来访问对象、对对象进行操作、以及在有条件和受限的基础上将修改后的对象存储回共享存储器中。即,在实施例中,如果服务用来访问共享堆240的指针在加密且添加元数据时,本文还称为“能力”被成功地解密,则不与根PD210相关联的全部服务仅可以访问共享堆240。因此,运行于PD#1220中的服务可以基于如上所述插入其可执行代码中的加密指令的执行而生成到共享堆240中的对象的加密的指针或能力223。同样如上所述,对对象的访问权可以或者可以不被授予,取决于加密的指针223是否经由插入其可执行代码中的解密指令而成功地解密。相同的有条件访问应用于加密的指针233,加密的指针233可由运行于PD#2230中的服务生成。因此,加密的指针223和233利用图2中的问号来指示。如果加密的指针已受攻击,或被不当操纵,如下文所述,当使用它的服务尝试取消引用它使用加密的指针时,将不会成功地解密,并且对共享堆240中的对象的访问将被拒绝。以此方式,操作于运行时环境中的各种服务可以以受控的方式向彼此传递对象,并且因此保持对象可以包括的任何分层结构。为了实现对根据各个实施例的加密的保护,需要适当对原始源代码进行插桩,如上文结合图1A和图1B所描述的。为此目的,存在运行时加载器250,在PD的栈中执行任何代码之前,运行时加载器250可以扫描全部代码以确保加密和解密指令实际上由编译器插入,如图1B所示。该扫描在图2中由在运行时加载器管理器250与PD#1220和PD#2230的相应的栈之间提供的箭头251、252来示出。在实施例中,如果代码未通过该测试,则运行时加载器管理器250可以拒绝加载该代码。注意到,传统上单独的微服务可以被托管在分开的虚拟机VM或容器中。然而,由于上下文切换、页表维护、翻译后备缓冲器TLB冲洗、用于消息传递的网络栈开销等,这会引入大量的开销。相反,能力隔离的服务不会遭遇这些开销。虽然存在一些源于使用能力的开销,诸如加密和解密它们的成本,但是这显著低于常规的分开的VM模型。还通常的是,如果使用分开的VM,则无法在不破坏对象的分层结构的情况下将对象在服务之间传递。在实施例中,处理器的运行时环境中的每个微服务可以被分派保护域IDPDID。例如,PDID可以具有32位。在实施例中,PDID可以用作嵌入微服务代码中的各种立即操作数的立即值。而且,同时加载到运行时环境的单个实例中的全部微服务必须具有不同的PDID。注意到,如果PDID随机地分派,则32位PDID空间可以使得PDID冲突的可能最小化,但是冲突仍可能发生。如果单个微服务多次加载,也可能发生冲突。为了处理PDID冲突,在实施例中,微服务代码可被复制而使得嵌入的PDID可以重新分派给不同的PDID。可替代地,附加信息可以混合到PDID中。例如,在x86-64处理器中,当前指令指针IP的位47:32可以自动地用于取代嵌入的PDID的较高16位或较低16位。在实施例中,通过将4GiB的线性地址空间分配给每个保护域PD并且选择避免在最终计算的PDID之间的冲突的4GiB对齐的存储器布局,可以避免冲突而不需要复制任何代码页。还注意到,当前RIP的47:32可独立地使用以指定PDID,而无需立即操作数。可等同地使用其它对齐大小,地址位的对应切片用于确定PDID的全部或部分:IP[最高有效可用地址位索引:log2PD对齐大小]。如上提到的,在实施例中,编译器负责利用根据各个实施例的加密和解密指令来插桩源代码。如前所述,本文所使用的“插桩代码”是指修改源代码、中间表示或机器代码,使得其在适当地方包含新指令。在实施例中,描述了可添加到指令集的若干新指令。在实施例中,这些指令可以实现结合图1B所提到的加密指令和解密指令,并且因此创建图2的加密的指针。为便于说明,其式样适合公司指令集架构并且如此描述。然而,注意的是,根据各个实施例,这些新指令的功能可以实现在任何指令集中。这些新指令在本文称为“ENCCAP”对能力加密、“DECDCAP”对数据能力解密和“DECCCAP”对代码能力解密。另外,下面还结合替代实施例描述了缩小能力的新指令“NARROWCAP”缩小现有能力的存储器边界,以及生成用于初发纪元“INCEPOCH”的密钥的新指令。应理解,无论在下面何处描述这些特定指令,都将包含提供其功能性的等同或相似的指令。作为可执行指令,ENCCAP、DECDCAP和DECCCAP、NARROWCAP和INCEPOCH,虽然是编译器插桩的结果,每个都在运行时执行。因此,在实施例中当程序的一部分想要授予程序的某其它部分对一存储器的访问权时,可以使用ENCCAP指令。例如,如果堆分配器想要授予请求堆分配的程序的部分对新的堆分配的访问权。或者,例如,如果程序的一部分想要授予排序整数数组的函数对整数数组的访问权。类似地,DECDCAP指令可以用于程序的接收部分以将传入标记转换成可由存储器访问指令使用的标准指针。因此,ENCCAP和DECDCAP对指针进行加密和解密。现在参考图3,示出了根据各个实施例的示例加密的指针300。因为在实施例中,加密的指针授予对存储器区域的访问权,它们在本文与术语“能力”可互换使用。如图所示,能力还可以包含元数据,如字段305中所示指示永久或暂态和310指示指向的对象的大小。能力使用由根PD被定义为具有PDID0的PD控制的密钥授予对特定保护域中的存储器块或分支目的地的访问权。在实施例中,可以经由用于访问处理器内部寄存器的指令来访问密钥。例如,经由对一对用户模式控制寄存器的在根PD中的RDWRPKR指令,或者经由到一对模型特定寄存器的在根PD中的RDWRMSR指令,或者经由访问某其它存储机构的指令。继续参考图3,在实施例中,能力可以包括三个字段。永久字段305,对象大小字段310以及指针字段315。“永久”字段305可以包括单个位,可以在两个加密密钥中的一个之间选择:用于从不过期的能力的一个,以及用于仅针对定义的时间段称为纪元有效的能力的另一个,如下文更详细说明的。对象大小字段310可以包括6位,指定了能力授予访问权的对象的大小的log2。因此,达到263字节的对象可由该字段指定。最后,指针315包含存储器地址。在实施例中,地址可以包括57位,使得整个能力包括64位,并且因此大小上等于64位计算机器上的常规指针,这有益于减少所需的编译器、库和应用变化并且用于保存指针存储空间。在实施例中,只有指针地址的一部分可被加密而使得可以自由地修改一些未加密的较低地址位。在图3的示例中,只有较高的32位被加密,如加密的位[32]320所示。在实施例中,这些位可利用密码321来加密。注意到,密码是用于执行加密或解密的算法。在替代实施例中,具有不同块大小的密码可被使用,因此,加密的位320可以具有不同的值。能力200因此授予过程或微服务在如对象大小字段310中规定的某大小的2的幂对齐的存储器区域内的访问权。在实施例中,还可以使用对象大小310的值,以确定受约束的未加密位330的数量。如图3所示,受约束的较低地址位330在数量上由[25:log2obj.size]给出,比对象大小字段310的值小25。对象大小字段310因此具有控制多少个未加密的较低地址位并入指针的加密解密中使用的调整信息tweak的直接作用。在实施例中,调整信息可以由上文结合图1B所描述的加密和解密指令动态地生成并且作为密钥输入的部分馈送给加密和解密算法。在实施例中,调整信息可以影响指针字段315的加密的地址位的密文。因此,如果修改了任何调整信息位,则在程序尝试使用能力200时将导致用于较高地址位的不同明文。如上所述,能力可以是数据能力或代码能力。在实施例中,指定进入保护域例如,进入驻留在分配给给定PD的专用存储器区域中的函数的授权进入点的代码能力可以被定义为具有大小1,并且因此可以具有为0的对象大小字段310。在实施例中,调整信息可以包括:PDID被授权使用能力32位;零填充,右对齐约束的较低地址位25位;size[4:0]5位,以及附加大小位size[5];以及保留1位。注意的是,在能力泄漏给另一个PD的情况下,对于生成了能力的PD的PDID被包含在调整信息中。另外,附加大小位size[5]仅对于确定运行时是否需要间接访问该能力而言是相关的。在实施例中,在没有根PD干预的情况下能够由解密指令例如,DECDCAP指令直接处理的大小字段的最高值可设定为25,该值以二进制表示为011001。因此,如果设定了size[5],则对象必须如此大以至于根PD必须干预以检查所尝试的对其的访问。然而,在实施例中,还可以存在必须在根PD干预的情况下处理的不设定size[5]的对象大小如果它们的大小简单地存储在大小字段中。因此,为了简化,在一些实施例中,对于大于25的所有大小,可能期望将大小字段设定为100000,并且如果设定了size[5],则使得DECDCAP将控制转移到根PD中的处理程序。可替代地,在其它实施例中,大小可以存储在大小字段中,并且如果大小的值大于25,则例如DECDCAP的解密指令可以调用根PD中的处理程序。在实施例中,可以利用支持小块大小例如,32位并且接受64位调整信息的任何密码321对加密的位320进行加密。在替代实施例中,可以省略32位PDID,并且因此这样的替代实施例可以仅使用32位调整信息。此处注意到,本文所公开的加密和解密的优点在于,极大地与常规的非能力机器兼容,并且能力机器语义可以完全由如下文所描述的小的新指令集合来实现。在实施例中,当使用能力时,它们首先由新指令变换成普通指针,然后将那些普通指针传递给基础指令集架构ISA例如,IA-32中的普通指令。该过程示于图4中,图4描绘了根据各个实施例的通过运行时环境410使用例如新专用指令DECDCAP和DECCCAP对数据能力和代码能力中的每一个进行解密的过程。参考图4,示出了数据能力410和代码能力450。在实施例中,这些能力可以具有图3的能力300的形式。从图4的顶行开始,数据能力410连同寻求访问基础指针的PD的PDID一起,可以被输入到DECDCAP指令415中。如图4所示,该指令还以PDID作为立即输入。然而,这是可选的,在替代实施例中,解密指令可以不将PDID作为输入。在实施例中,数据对象解密指令415例如,DECDCAP的执行的输出是标准的未解密的数据指针420,然后,该数据指针420可以在正常路线上被传递给加载或存储指令425。类似地,参考图4的底行,代码能力450连同寻求访问基础指针可选地的PD的PDID一起可以被输入到代码能力解密指令455,例如,DECCCAP。如上,指令可以可选地以PDID作为立即输入。在实施例中,代码能力解密指令455的执行的输出可以是标准的未解密的代码指针460,然后该代码指针460可以在正常路线上被传递给分支指令465。图4示出了对于数据能力410和代码能力450以调整信息作为输入。注意到,在实施例中,调整信息实际上由DECDCAP和DECCCAP据其相应的输入来计算,并且无需作为分开的输入来提供。在实施例中,能力可由新的或专用指令,例如“ENCCAP”“加密能力”指令来创建。该ENCCAP指令可以具有以下句法:ENCCAPr64,rm64,imm32,其中立即操作数imm32指定寻求该能力的PD的PDID,rm64是源操作数,并且r64是指定输出能力应存储在何处的目的地操作数。如果立即值为零,则在实施例中,寄存器例如,EAX可以隐式地用作其内容指定PDID的源操作数。在实施例中,如果寄存器用作源操作数,则可以创建代码能力。否则,如果源操作数指定存储器操作数,则基址寄存器的截去的内容或者如果没有指定基址寄存器,则为零可用作该能力的地址部分例如,图2中的指针215,并且偏移量比例*索引+位移可用作对象大小。如上所述,如果对象大小为1,则创建代码能力。可替代地,可以定义ENCCAP指令,使得如果未使用基址寄存器,则使用截去的有效地址作为该能力的地址部分来创建代码能力。目的地寄存器的最终内容是加密的能力。如果某指示符被提供给指令,诸如设置零标志或者使用REP指令前缀,则创建永久能力。否则,可使用当前的每纪元密钥来加密该能力。在实施例中,如果无法表示指定的能力例如,对象大小不是2的幂,或者如果该过程没有运行于根PD中并且提供的指针和对象大小将授予对在当前PD的边界外的存储器的访问权,则可以生成一般保护错误。可替代地,ENCCAP指令可以在这样的情况下设置size[5]位,并且不对该能力进行加密以表明使用所得能力的访问必须由运行时提供的授权例程来调解,如下面所描述的,用于调节对过大而不能使用加密的能力表示的对象的访问。在实施例中,运行时加载器,诸如图2中的运行时加载器管理器250可以扫描所有代码以确保代码中ENCCAP的所有使用仅涉及栈和全局分配以及用于包含ENCCAP的该实例的PD的函数。然而,在实施例中,ENCCAP的根PD的使用不受限制。注意到,大于32兆字节MiB的共享对象无法直接利用单个能力来表示,但是对象的32MiB切片可以各自被表示。这是因为,指针位的加密切片设在指针的中间。如果要试图表示64MiB对象并且然后还试图将所得能力递增32MiB或以上,则加密切片的最低有效位将翻转。当随后对该切片进行解密时这将导致被破坏的明文。类似的推理适用于大于32MiB的所有对象大小。否则,在实施例中,对于共享堆中的对象生成能力的根PD可以被调用以调解对较大对象的访问。例如,在实施例中,根PD可以实现可由其它PD调用来请求批准访问某大对象内的特定地址范围的函数。在这样的实施例中,可能要求运行时加载器在代码加载时就扫描代码以确保对大对象的所有访问之前对根PD进行适合的请求以获批。注意到,在实施例中,该授权例程还可以用于调节对包含不一定在2的幂边界上对齐且因此不能直接使用DECDCAP指令调节的对象的存储器区域的访问如2的幂对象边界的大小约束310所显见的。在实施例中,如果ENCCAP指令用于生成该较大或未对齐对象的能力,则其能够设置size[5]位以表明该能力未加密。可替代地,因为该能力未加密,在实施例中,软件可以直接生成它,而不使用ENCCAP或等同指令。在实施例中,DECDCAP数据能力解密指令的规范可如下:DECDCAPr64,m64,imm32,其中,如上述的ENCCAP指令的情况那样,立即操作数imm32指定了寻求该能力的PD的PDID,m64是源操作数,并且r64是输出能力,现在是解密后的标准指针。在实施例中,如果源操作数m64指定了小于2的数据大小,则可以生成一般保护错误。在实施例中,如上文参考图3所提到的,DECDCAP的执行导致从基址寄存器解密该能力并且将其放入目的地操作数中,并且还将有效地址的受约束的地址位与基址寄存器中的那些进行比较。在实施例中,如果两个不同,则会发生一般保护错误或BOUND超范围错误。如上文参考图3所描述的,DECCCAP的执行导致源操作数中能力的解密以及将解密的代码指针放入目的地操作数中。在实施例中,如果源操作数中的能力指定除1以外的数据大小,则可以生成一般保护错误。在实施例中,软件运行时环境可以在代码加载时扫描每个PD的代码以确保指针的任何使用之前执行适当的DECDCAP或DECCCAP指令,取决于指令之后的代码是否使用用于数据访问或分支的指针。作为示例,下面的伪码说明了在实施例中可以如何使用DECDCAP指令在入口处,存储在RAX中的已编码指针:…DECDCAP69,7%RAX,%RCX;从RAX解密指针且加载到RCX中,指定PDID69,并且指定访问大小8.7以使能计算可访问的最高地址。MOV%RCX,%RDX;从对象加载…概括上面所述,图5说明了根据各个实施例的通过在运行时环境内执行程序或应用的处理器执行DECDCAP解密指令的过程的操作流程的概览。参考图5,过程500可开始于框505。在框505处,以加密的能力和PDID作为输入的DECDCAP指令可由处理器解密以执行。从框505,过程500可以进行到查询框510,其中处理器可以确定能力的大小是否小于2。在实施例中,这可通过读取如图3所示的能力的对象大小字段310来完成。如果在查询框510处为是Yes,则加密的能力不是数据能力,并且过程500可以在513声明一般保护错误,过程500随后可以终止。然而,此处注意,在替代实施例中,代码能力不被处理器支持即,如果加密的指针仅用于表示数据对象边界,则可以支持单字节数据能力,并且可消除查询框510以及框513。然而,如果在查询框510处的结果是否No,则该能力是经验证的数据能力,过程500可以进行到框515,其中过程500可以检查大小字段的值是否大于25。如果在查询框515处为是Yes,则对象过大而不能由DECDCAP直接处理,根PD必须干预以检查访问是否通过咨询其在软件中的内部数据结构而可允许。在这样的情况下,过程500可以将控制转移到其入口点指令地址可在内部CPU寄存器中指定的根PD中的处理程序,在该传递之后,在517,过程500可终止。如果在查询框515处为否,则过程500可以进行到框520,其中运行时环境可以作为检查将有效地址处理为能力并且验证除了其未受约束地址位之外的其全部位与基址寄存器中的那些位相同。此处注意到,有效地址表示要在对象内访问的最高地址,并且因此该比较用作边界检查。如果受约束地址位不同,则很可能错误的、恶意的或损坏的代码向该能力添加过大的值或从该能力减除过大的值,使得基于该修改后的能力的尝试访问不再位于其所指代的对象的边界内在运行时环境可以对该能力进行解密并且将所得指针放入指定的目的地操作数中的情况下。从框520,过程500可以进行到查询框530,其中可以确定两个能力是否都具有高于能力中指定的对象大小的相同的较高位。如果在530处为是,则过程500可以进行到框540,其中指令的执行完成,并且过程500可以结束。然而,如果在查询框530处的结果是否,则过程500可以进行到框545,其中运行时环境可以生成一般保护或“BOUND超范围”错误,过程500可终止。结合过程500的查询框530的边界测试,注意到,即使DECDCAP内的边界测试未能检测到某些破坏的或边界外的数据指针,它们也可能解密而指向大的地址空间中的未映射存储器位置,这将导致可检测的页错误。在实施例中,软件运行时可通过终止导致该错误的进程来响应该页错误。类似地,破坏的代码指针可能导致去往未映射存储器位置的分支,也导致页错误。在实施例中,如果启用了诸如公司的控制流强制执行技术CET的技术,则甚至更强的保障是可能的,因为破坏的代码指针位于ENDBRANCH指令上的可能性极小。如上所述,诸如存储器访问许可和保护密钥ID等附加元数据可以存储在能力中,并且关于尝试访问的信息例如,无论是将要尝试读还是写可指定到DECDCAP指令而使得DECDCAP指令能够根据能力中的元数据来检查所尝试的访问被许可并且如果不被许可则生成错误。在实施例中,软件运行时和应用可以运行在可信执行环境TEE内,例如,SGX,以保护软件运行时和应用抵御使用中位于TEE范围内的各种类型的攻击。如上所述,在实施例中,可通过运行时环境为各个永久能力和每纪元能力分派单独的密钥。在实施例中,可对于每个逻辑处理器定义纪元的一个或多个序列。在实施例中,每个处理器可以维持单独的每纪元密钥以在每个处理器能够运行独立PD的情况下避免开销同步。然而,如果某PD需要运行在多个处理器上,则运行PD的所有处理器必须使用相同的每纪元密钥。注意到,通过根据各个实施例定义纪元,可以克服经典能力机器的最显著缺陷之一,诸如使用胖指针和加标签存储器的那些缺陷。该缺陷是能力撤销,即在能力被授予后解除能力的问题。不同于具有诸如页表的中央控制的存储器授权结构的系统,能力机器将授权标记能力散布于存储器中,没有简单的始终跟踪它们的方式。纪元的使用导致能力在它们的纪元结束后自动过期,而不管它们存储在何处。这是对于微服务是非常适合的,微服务通常以反应的事件驱动方式来进行操作。在实施例中,每当新事件到达时可以生成新会话,使得当前纪元与当前会话相关联。概括上面的说明,下面是上述整数数组示例的说明。假设示例程序的原始源代码包括由以下伪码表示的数组排序函数:程序部分A伪码:{intnums[5]={34,15,64,7,9};sortnums;}sortint[5]array{whilearrayisnotsorted{forinti=0;i<4;i++{ifarray[i+1]<array[i]{swaparray+i,array+i+1;}}}}在实施例中,可以如下所述生成、发送和使用数组能力。上面在程序部分A中所示的整数数组指针可以例如使用ENCCAP来加密,该ENCCAP可以输出访问数组的加密的能力。可以将该能力提供给执行程序的调用栈,然后,调用栈将调用如上所提供的排序函数。因为指向数组的指针现在是加密的,所以需要使用DECDCAP指令来对指向对象整数数量的加密的指针进行解密。一旦DECDCAP执行,生成未加密指针,整数数组指针,并且代码可使用该未加密指针来对数组对象进行排序。因此,在实施例中,可通过编译器基于以下伪码将原始源代码变换成实际的源代码:用于插桩的程序部分A的伪码:{intnums[5]={34,15,64,7,9}alignedtotheleastpower-of-2thatisadequateforstoringnums;nums_capability=ENCCAPnums,sizeofnums;sortnums_capability;}sortint[5]capabilityarray{whilearrayisnotsorted{forintI=0;I<4;i++{array_i_ptr=DECDCAParray+I,sizeofint;array_i_plus_1_ptr=DECDCAParray+i+1,sizeofint;if*array_i_plus_1_ptr*array_i_ptr{swaparray+i,array+i+1;}}}}因此,在实施例中,在例如ENCCAP和DECDCAP指令中体现的两阶段加密解密方案表示计算机程序的一部分向程序的另一部分发送授权以访问某段存储器的机制。注意,没有这样的方案,将需要创建某种其它的机制来显式地在程序的不同部分之间传输该授权,或者以某种方式推导是否每个存储器访问被授权。为了理解这样做有挑战性的原因,此处注意,通过指针访问存储器的每个程序语句可能需要使用多个不同的指针。例如,上述示例中的排序函数是通用的,因此可从给定程序的许多不同部分调用它以对许多不同的数组进行排序。图6示出了根据各个实施例的用于处理存储器访问请求和相关联的能力的运行时过程的操作流程的概览。参考图6,过程600可以开始于框610。在框610处,操作于计算机系统上的运行时环境例如,图1A-1B的编译器的运行时环境可以从运行时环境管理的给定PD中的应用的函数接收针对分配计算机系统的共享存储器中的对象并且生成访问它的能力的请求。从框610,过程600可以进行到框620,其中运行时环境可以将密钥分派给PD并且生成指向请求中指定的对象的存储器位置的加密的指针。此处注意到,在实施例中,密钥可分派给在PD运行的同时处于活动状态的纪元。在实施例中,可以在纪元开始时分派密钥。加密的指针可通过如上所述的插入的加密指令例如,ENCCAP来生成,并且可以尤其利用请求PD的PDID和密钥来对指针进行加密,如上文所述的。如上所述,密钥可以是持久的,或者可以在纪元结束时过期。从生成了加密的指针的框620,过程600可以分岔成两个分支,一个是PD中的函数请求使用能力,另一个是PD中的函数寻求转移能力。因此,在第一分支中,过程600可以从框620进行到框630,其中处理器可以从PD中的函数接收针对使用该能力的请求。例如,在进行该请求之前,该函数可能已经以合法的方式改变了该能力的指针地址,例如通过改变不受约束的能力的指针字段的位,或者例如,以非法方式,例如通过改变受约束位。从框630,过程600可以进行到框635,其中该能力可被解密并且转换成未加密指针,并且传递到标准指令。在框650,过程600可以结束。可替代地,沿第二分支前进,过程600可以进行到框640,其中PD中的函数指示它希望将该能力转移给另一个PD中的另一个函数这是图9A的示例7的情况,如下文所述。然后,过程600可以从框640进行到框645,其中运行时环境可以对该能力进行解密,如果接收PD当前正在运行且等待传入的能力,则使用用于接收受让者PD的密钥对现在未加密的能力进行加密,并且将重新加密的能力传递到接收PD。在框645处,过程600可以结束。然而,如果接收PD尚未运行,或者未准备好传入的能力,则在实施例中,可以利用指定接收PD的身份的信息将解密的能力入队。当接收PD针对传入的能力准备好时,则解密的能力可以使用用于接收PD的密钥进行加密并且转移到接收PD。例如,接收PD可以接收传入的能力作为其启动例程的参数。可替代地,接收PD可以使用对运行时API的调用来指示其准备好在其执行中的某个点接收传入的能力。如上所述,能力可以是永久的,或者可以仅对于a有效。对于仅对于纪元有效的能力,在实施例中,为了使得用新的纪元密钥替换当前纪元密钥所需的时间最小化,一旦安装了另一个纪元密钥,则处理器或CPU可以开始生成新的纪元密钥。例如,这可以通过加载预先缓存的纪元密钥并且开始生成新的纪元密钥的新的专用的“INCEPOCH”指令来实现。在实施例中,当一个纪元已完成并且另一个纪元将要开始时,可以执行INCEPOCH指令。在实施例中,INCEPOCH可以在对于作为输入提供给下一纪元的各个能力而执行ENCCAP指令或等同物之前执行,使得那些能力使用适合的密钥进行加密。该过程示于下面描述的图7。参考图7,示出了共享堆710,其中存储有对象715。共享堆710类似于上述的图1的共享堆140。如图所示,两个微服务,微服务A730和微服务B740,每个对共享堆710具有访问权,并且可以各自需要对对象715的访问权。微服务A730和微服务B740类似于上述的图1的服务PD#1120和服务PD#2130。因此,微服务A730和微服务B740可以各自由运行时环境分派单独的PD。在接收到第一请求时,从微服务A730发布的请求A720,运行时环境可以对该请求进行解密并且基于如上所述的请求A720的解密来发布标记A725,例如未加密能力。例如,运行时环境可以执行先前放入微服务A730中运行的应用的编译的代码中的DECDCAP指令,如上所述的。标记A725可对于如图所示的单个纪元,纪元A721,授予微服务A730对对象715的访问权。在稍后的某个时间,微服务A730可以寻求将对对象715的访问权转移到微服务B740。例如,对象715可以是雇员记录,并且在记录的某种处理之后,微服务A730可以将其传递给微服务B740以进行进一步处理。在实施例中,不是总是授予对共享堆中的对象的两个微服务访问,为更大的安全性起见,每个微服务对对象的访问可利用加密的指针进行控制,如上所述。继续参考图7,在微服务A730已经完成其对对象715的处理之后,其可以请求对象被传递到微服务B740,如所提到的。因此,其可以发布请求B735,为加密的指针或能力的形式,将对象715的访问权转移到微服务B740。该请求可由运行时环境解密,并且变换成标记B745,然后,标记B745现在授予微服务B740对对象的唯一访问权。如微服务A的情况一样,标记B745所授予的访问权可以受时间限制,仅持续纪元B741的持续时间。如图所示,过程可以继续,作为微服务B740的部分运行的应用可以寻求将对对象715的访问权转移回微服务A,或者经由请求C转移到第三微服务。在实施例中,为了管理在给定纪元期间哪些能力是有效的,每个逻辑处理器可被分派与每个共享对象相关联的元数据。在实施例中,可以维护每个纪元的共享对象表,并且垃圾收集元数据可存储在表中。在实施例中,如果对象的整体或部分由当前纪元中的任何能力或该逻辑处理器上的永久能力引用,或者例如如果对象排队直至在用于该逻辑处理器的调度队列中被发送到某其它PD,则该共享对象的元数据可以表明该事实。在实施例中,当用于某对象的元数据表明对象不再由任何暂态或永久能力引用或存在于用于任何逻辑处理器的任何调度队列中时,该对象可释放。在实施例中,在每个纪元的结束时,根PD可以更新它在其中运行的逻辑处理器的元数据,清除表明对在结束的纪元中使用的对象存在暂态能力的元数据。另外,在实施例中,当消息在调度队列之间转移时,用于所引用的对象的元数据可以适当地更新;即,可以清除表明对象对于该逻辑处理器被入队的发送队列的逻辑处理器的元数据,并且可以设置表明对象对于接收队列的逻辑处理器被入队的元数据。此处注意的是,对于某些能力对于共享存储器中的对象是永久的情况,为了将该对象转移到另一个PD,则可以生成附加能力,要么永久要么暂态,来指代当前由永久能力引用的对象。接下来描述的是可以根据各个实施例使用的示例性软件运行时环境的细节。作为示例,基于VM的运行时可被开发以高效地托管微服务。然而,应当理解,类似的实现方式可应用于其它基础运行时环境。在实施例中,PD0中的运行时库可以提供多个服务,包括能力创建、垃圾收集、调度和纪元维护以及在PD之间和通过网络的消息传递。在实施例中,为了方便,一些服务可以在VM用户空间监视器中实现,而不是作为访客VM。在这样的实现方式中,可以提供对现有函数的某些增强。首先,例如,VM用户空间监视器中的运行时动态加载器可以扩展以将包装作为可重定位ELF文件的新PD在对其扫描验证基本可信性后安装到现有访客VM中。其次,例如,EPT违反处理程序或页错误处理程序可以监视出错恶意访问尝试并且必要时终止PD。第三,例如,可以使用VT-x抢先定时器处理程序来中止超过其时间切片的任何PD。此处注意到,在非抢先事件驱动的执行模型中的PD可以不挂起和继续,因为它可以对共享堆中已经过期且在PD继续之时已经被“垃圾收集”的对象保持能力。然而,注意的是,抢先还可以通过保存且然后随后恢复抢先服务的当前纪元密钥和运行时状态来支持。结果,在一些实施例中,根PD可以不允许任何其它服务访问抢先纪元保持能力的共享对象。然而,此处注意,其它PD也可以具有授予对对象的访问权的能力。在该情况下,其它那些PD可以继续访问对象,即使在第一PD被抢先的同时。这将需要关于每个对象的更多信息被存储在管理垃圾收集的表中。例如,每个纪元可以被分派单调增加的数值ID,并且可使用对象的最新纪元的ID可存储在垃圾收集元数据表中。这将允许借助暂态能力对于其所指向的每个对象的抢先纪元分派极大的纪元ID,使得其所指向的对象不会被进行垃圾收集。在该方法中,当PD被授予对对象的访问权时,在实施例中,仅在PD被授予新访问权的PD的纪元ID大于用于该对象的垃圾收集元数据表中的当前纪元ID的情况下,才可以更新垃圾收集元数据表中的存储的纪元ID。可替代地,对于被指示引用对象的抢先纪元的数量的抢先纪元中的暂态能力引用的每个对象,指示符可附到垃圾收集元数据表条目。在实施例中,单独的数据结构可以附到利用暂态能力指示其指代哪些对象的每个抢先纪元。当抢先纪元最终继续时,利用暂停能力由该纪元引用的对象的集中的垃圾收集元数据将被更新以减少引用对象的抢先纪元的数量的指示符并且更新指示当前纪元引用对象的活动元数据。第四,例如,可以增强系统调用和超调用处理程序以接收和检查能力而不是指针。根PD可以为OS内核或VMM配置用于当前PD的能力加密密钥以使能通过系统调用和超调用处理程序来检查和使用能力。可替代地,OS可以执行对根PD的向上调用以请求当前能力加密密钥。可替代地,OS可以依赖于处理器已配置有适当的能力加密密钥以使其能够使用加密和解密指令例如,ENCCAP和DECDCAP指令来处理能力。在实施例中,根PD可以向其它服务提供API,例如:senddest.PDID,来自共享堆的消息能力。该服务可以检查消息能力尚未被入队以强制执行能力的排他所有权,并且可以将消息排队到当前逻辑处理器的队列中以便在下一次机会发出。在实施例中,根PD还可以向API提供yield服务,其可以完成当前纪元并且调用调度器或使得当前纪元被抢先。在实施例中,调度器可以创建新能力并且协同安全垃圾收集。因此,如果没有消息在队列中等待当前的逻辑处理器,则调度器可以利用适当的同步从其它逻辑处理器窃取一些。在实施例中,调度程序可以进一步复制消息能力,使得目的地PD能够访问它,并且最终,调度程序可以跳到目的地PD的入口点例如,如ELF文件中可能指定的并且由运行时环境存储在PD信息结构中,在栈上传递消息能力。注意到,在实施例中,运行时环境可以使用支持位置透明性的服务寻址机制,诸如例如IP寻址或全局唯一标识符GUID,以允许服务向同一运行时环境实例内以及其它实例其可以例如远程定位内的其它服务发送消息。在实施例中,运行时环境可以自动检测消息何时需要指向不同的运行时实例,并且可以执行必要的串行化和网络通信以实现该转移。接下来描述的是根据各个实施例在运行时环境中生成和使用加密的指针来调节对共享存储器区域的访问的若干示例。为了易于说明,假设具有两个保护域的简化的示例存储器布局,每个保护域具有专用存储器区域,一个或多个函数可驻留在其中。还假设两个保护域对共享存储器区域具有访问权。图8示出了示例性的存储器布局,并且图9A和图9B示出了由驻留在保护域中的函数生成和或使用的若干示例指针以及它们如何由运行时环境处理。注意到,图8示出了与上述的图1所示的类似但更详细的存储器布局。参考图8,示出了存储器区域800。存储器区域800包括用于保护域A805和保护域B810的专用存储器区域以及可由运行于任一PD中的函数访问的共享堆840。PDA805被分派了存储器的专用区域,范围从存储器地址0x0010到0x00FF。在该存储器区域内,存储有函数A.0801,专用对象A.180316字节和专用对象A.2807128字节。继续参考图8,还示出了PDB810,该PDB810还被分派了存储器区域800中的其自己的专用区域,范围从存储器地址0x0100至0x0200。在该存储器区域内,存储有函数B.0811、函数B.1813以及专用对象B.281764字节。最后,存储器区域800具有在PDA805和PDB810中的功能可以访问的存储器区域。这是共享堆820,其开始于存储器地址0x1000。在共享堆820中示出了两个共享对象,即共享对象04个字节821和共享对象14个字节823。给定图8的存储器区域800及其构成PD,接下来描述的是根据各个实施例的该示例性环境中的加密的指针的使用的十个示例。这些示例呈现在图9A和图9B中。图9A示出了示例1-8中所描述的加密的指针,图9B示出了示例9和10中所描述的加密的指针。注意到,在下面的说明中,术语“加密的指针”和“能力”可互换使用。还注意到,在图9A和图9B所示的各能力的指针字段中,为了说明方便,仅示出了存储器地址的未加密部分。第一示例,示例1,涉及图9A的加密的指针930。此处,PDA的功能A.0使用ENCCAP指令来生成用于DECCCAP指令后的间接分支的加密的代码能力。此处可以回顾,代表了“加密能力”的示例ENCCAP指令可用于对用于控制对对象的存储器访问的数据能力以及用于控制对代码的分支的代码能力进行加密。在解密侧,如图3所示,DECCCAP函数可用于对编码的代码能力诸如加密的指针930进行解密。如上文参考图2所描述的,图9A和图9B的示例指针各自具有永久字段、对象大小字段和指针字段。加密的指针930可以是永久的或临时的,如永久字段的“0或1”值所指示的。因为加密的指针930是代码能力,所以其对象大小字段是1,回顾对象大小字段提供了对象的实际大小的log2。指针字段包含了基址0x0027,其落入函数A.0内,并且该地址在图8中示为“目的地”。因此,指针指向在其专用代码区域内的PDA的授权存储器地址。示例2涉及加密的数据指针935。此处,PDA805的函数A.0使用ENCCAP来生成用于专用对象A.1803的加密的数据能力。因此,能力935的对象大小字段指示对象16字节长log216=4,并且由该能力指定的对象的基址为0x0040,其是专用对象A.1803的起始地址,如图8中所示。示例3涉及当PDA的函数A.0801向来自示例2的能力添加7时所生成的修订后的数据能力940。因此,能力940与能力935相同,除了指针字段中的地址为0x0047,确切地比能力935中使用的基址大7个字节。因为专用对象A.1803的大小是16字节,所以0x0047正确地指向专用对象A.1803内的位置。示例4涉及对示例3的加密的数据能力的进一步改变。此处,函数A.0向来自示例3的能力添加12,得到能力945。然而,现在地址在边界外,已经超过了专用对象A.1803的大小其为16字节。能力945现在指向地址0x0053,其超过了专用对象A.1803的结束地址其为0x0050。因此,示例5涉及在一个受约束位位4被修改的情况下该界外能力由函数A.0传递到DECDCAP指令,该DECDCAP指令生成错误。回顾图2和图3的描述,在实施例中,DECDCAP解密指令利用调整信息作为解密的部分。调整信息指定受约束的较低地址位,该受约束的较低地址位被计算为[25-log2obj.size]230,如图2中所示。因为专用对象A.1803的大小是16字节,所以受约束的位被计算为[25:log216]=[25:4],这意味着加密的指针的位25:4被约束且包含在调整信息中。因为位4现在在示例4中已修改,使用DECDCAP对能力950进行解密导致错误,并且在实施例中,引起错误的微服务,此处为函数A.0,可由运行时终止。注意到,在示例1-5中,将各种能力的永久字段示为0或1。这是因为,由能力指向的数据对象或代码指令在PDA的专用存储器区域内,并且可以是永久的。该能力由PDA内的ENCCAP指令生成,并且它们的生存期可以全部设置为永久的,或者如果它们在任何未来的纪元中不被需要则它们可以被设置为暂态的即,仅对于一个纪元有效。在可能时使用暂态能力的益处在于,未检测到错误或损坏的存储器访问的风险较低,因为该存储器访问随后更可能尝试使用过期的能力,可能导致可检测的错误。其余的示例,即示例6-10在永久字段中全部具有0值,因为所描述的能力涉及对驻留在共享堆820中的共享对象的访问,并且运行时环境因此仅授权其在定义时间内使用。应理解,可替代地,在实施例中,运行时环境可以授权其永久使用。示例6涉及来自PDA的函数A.0的根PD使用ENCCAP来生成图8的共享对象0821的数据能力955的请求。因此,作为共享对象,对于仅针对单个纪元有效的能力,永久字段被设定为0。对于32字节的对象大小,数据能力955的大小字段为5,并且指针字段指示0x1000的地址,所有这些都对于共享对象0821是精确的,如图8中所示。根PD将执行ENCCAP,利用PDA的PDID对能力进行加密。示例7涉及函数A.0,现在请求根PD将在示例6中描述的能力转移到PDB,PDB在函数B.0811的起始处具有其入口点。此处注意到,虽然如图8所示对PDB没有访问权,但是函数A.0仍可以知道PDB。这是因为,对于微服务常见的是使用服务发现组件来定位它们可能需要进行通信的某些类型的服务。可替代地,预定义服务标识符例如,IP地址和端口号、GUID、本地PDID、或本地服务名称可以嵌入在服务内作为某些类型的消息的目的地。继续示例7,根据图5所示的过程,函数A.0的请求导致根PD使用解密指令对输入能力进行解密,诸如DECDCAP,使用上述加密密钥,然后执行新密钥生成指令,例如INCEPOCH,如上所述,以便创建新的加密密钥,并且最后,使用加密指令,例如ENCCAP,来生成可传递到函数B.0的能力960。除了现在利用INCEPOCH生成的新密钥对指针字段能力960中没有示出的加密的切片进行加密之外,能力960与来自示例6的能力955相同。可替代地,如果PDA在其发出转移能力到PDB的请求之时尚未完成当前纪元中的执行,则该能力可入队以便后来传输给PDB。接下来的两个示例是示例7的变型,因此,分别编号为7.5和7.6。如所提到的,示例7.5涉及示例7的变型。在示例7.5中,函数A.0现在请求根PD将从示例6的能力导出的能力转移给PDB,PDB在函数B.0811的起始处具有其入口点。在该示例中,函数A.0希望仅将对共享对象1823的前四个字节的访问权授予PDB,因此它使用缩小给定能力的对象的大小的指令。在实施例中,这可以是新的NARROWCAP指令,如下文详述的。执行NARROWCAP指令利用与原始能力相同的基址来生成新的能力,但是现在利用缩减后的大小。能力961是所得的缩小后的能力,示出了与指针955相同的基址,但是具有缩减为2的大小字段,表示4个字节。在如示例7的后面部分中所述的处理之后,根PD然后将能力961转移到PDB即,解密,新密钥的生成,使用新密钥重新加密,然后要么传递到PDB要么入队以便随后发送给PDB。示例7.6,在示例7的又一变型中,涉及函数A.0缩小能力以便传递给其内部基本块之一,从而将访问限制到对象的来自该基本块的部分。此处,函数A.0仅希望将对共享对象1823的前四个字节的访问权授予该基本块,因此其可以使用能力缩小指令例如,NARROWCAP来利用与原始能力中相同但具有缩减的大小的基址来生成新能力。能力963是所得的缩小的能力,并且函数A.0的基本块然后可以使用能力963用于对该基本块内的共享对象1的相关部分的存储器访问。图8和图10示出于图9B中。参考于此,示例8涉及在函数B.0完成之后函数A.0801再次被根PD调用。其将能力955从示例6传递给DECDCAP指令。因为根PD在该能力生成后已经调用了INCEPOCH,所以来自DECDCAP的结果具有错乱的加密切片,导致了可能导致页错误的后续存储器访问。换言之,即使能力955的始发者是PDA,一旦能力已经转移到PDB,并且新密钥生成以与ENCCAP指令一起使用,能力955不再能由PDA使用,除非PDB请求将能力转移回PDA,这将是示例7的逆。示例8因此说明了,在实施例中,在没有该检测的高概率的情况下,无法成功地重新使用过期的能力。示例9涉及通过网络向运行函数B.0811的机器发送消息而使得由函数B.0811使用的指针比如指针P.0被破坏的远程对手。被破坏的指针,为便于说明称为“P.0X”使得指针P.0的原始内容被对手所控制或指定的新内容覆写。在尝试从共享对象1823泄漏数据时,对手的指针P.0X指向共享对象1823,因为对手具有先验知识,即函数B.0最终读取P.0所指向的数据并且通过网络发送读取的数据。然而,因为程序中的指针的所有使用之前有DECDCAP指令,所以对手的尝试失败。因为P.0已经被用普通指针P.0X覆写,所以尝试使用P.0X将非常可能导致异常——要么是由于未通过在DECDCAP中的检查,诸如图5中的540处所示的检查,要么是由于指向未映射存储器地址的DECDCAP的输出的结果。换言之,因为在实施例中,所有指针被加密,通过尝试创建指向存储器中的对象的常规指针,对手使得DECDCAP在创建的常规指针上运行,该常规指针不会被解密,或者如果其以某种方式可以,也不会指向对手所期望的实际存储器位置。接着描述示例10。参考于此,在示例10中,假设远程对手以某种方式获得指针P.0970的原始内容。例如,这可以是错误地向网络发送P.0970的内容的函数B.0811图8中的缺陷的结果。对手尝试使用其对P.0的原始内容的知识不可检测地破坏P.0970,使得破坏不会被检测到。为了说明的目的,假设P.0970的原始内容指向图8的共享对象0821,因此能力970的指针字段具有0x1000的地址。进一步假设对手用破坏的指针值975覆写P.0,以尝试重新引导后续访问远离共享对象0而到共享对象1823图8。然而,因为破坏的指针975中的受约束位与原始指针970中的那些不同,并且因为对手无法不可检测地修改能力975中的密文切片,所以该破坏能力最终将解密为可能指向未映射存储器地址的指针,导致在函数B.0811尝试访问地址时发生异常。接着描述的是替代方法,根据一些实施例,用于确保代码能力而无需加密。在该上下文中,注意到,不是如上所述需要加密的代码能力,在替代实施例中,可以在每个分支的目的地处进行检查以验证分支操作已被授权。这些替代方法在实施例中可以实现在使用公司的控制流强制执行技术CET并且使用公司的存储器保护扩展MPX的计算设备上。MPX是用于检查存储器边界的机制,并且除了其它别的之外,CET是用于限制间接分支目标以强制执行控制流完整性的机制。MPX引入了新边界寄存器,以及操作于这些寄存器上的新指令集扩展。另外,MPX提供了一组新的“边界表”,其存储边界,超过该边界可适合边界寄存器。在实施例中,可使用两种机制来实现该功能。可替代地,这些方法还可以实现在其它计算设备上,具有检查或验证存储器边界的等同或相似的机制,以及用于将间接分支目标限制到所允许的那些的机制。在第一替代方法中,在实施例中,可启用CET或等同物而使得所有间接分支必须位于ENDBRANCH指令或它们的等同物上。此处注意到,ENDBRANCH或具体地ENDBR64,为64位模式是公司指令,该指令必须存在以将代码中的给定位置标记为对于间接分支是有效目标,即,分支到寄存器中包含的地址的那个。否则,如果间接分支位于某其它指令上,在ENDBRANCH检查被启用时将生成错误。进一步注意到,如本文所使用的,“ENDBRANCH”可以是指指令的64位和32位版本,具体地分别称为“ENDBR64”和“ENDBR32”。在实施例中,边界检查可以在每个ENDBRANCH指令之后执行以验证当前指令指针即,代码位置位于当前PD的代码区域的边界内。在实施例中,还可以提供特殊ENDBRANCH指令,其在根PD中缺少相关联的MPX边界检查,因为任何PD被授权在该入口点处调用根PD。在这样的实施例中,这将是用于调用根PD功能的入口点,诸如向其它PD发送消息以及产生对调度器的控制。接着描述的图10示出了在这样的实施例中CET和MPX或等同物的该示例性使用来控制间接分支。注意到,虽然图10是指CET和MPX,但是在替代实施例中,所示出的功能可以使用CET和MPX的等同物来实现。参考图10,示出了两个保护域,保护域#11010和保护域#21020。保护域#11010具有运行于其中的四个函数,即,函数1011、1013、1015和1017。函数1011具有两个间接分支,函数1013和1015中的每一个中一个。类似地,函数1013和1015各自具有到函数1017的间接分支。另外,函数1015还间接地分支到保护域#21030的函数1033。类似地,保护域#21030具有其自己的四个函数,函数1031、1033、1035和1037。函数1031具有到函数1033的间接分支,并且函数1033具有到每个函数1035和1037的间接分支。如上所述,每个保护域中的每个间接分支到达ENDBRANCH指令上,并且同样如上文所述,在实施例中,可以在指向了ENDBRANCH指令之后执行MPX边界检查。如图所示,在1020处,从保护域#11010的函数1015到保护域#21030的函数1033的间接分支被MPX和CET阻挡。因此,在使用MPX和CET的实施例中,可以在每个ENDBRANCH指令之后添加粗粒度MPX边界检查以确保新的RIP位于当前活跃的保护域的代码段的边界内。在这些替代实施例中,不需要对代码能力进行加密,因此图1B所示的过程,块150和160将被限于将所生成的指针的加密指令插入数据。因此,在这样的实施例中,加密指令例如,ENCCAP将简单地不被调用来生成代码能力。将仅调用其来生成数据能力。在实施例中,另一替代方法可以是扩展ENDBRANCH指令或等同物以接收立即操作数,指定其中ENDBRANCH指令可以成功地执行的PD的PDID。此处注意到,立即操作数按定义是嵌入代码中的数值,因此,它们将在PD被编译时或某稍后的点例如,当加载PD时被嵌入。因此,如果间接分支到达ENDBRANCH指令上指定与当前PDID不同的PDID,其可以包含在例如内部CPU寄存器中,则可能会生成错误。在这样的实施例中,PDID值0可用于指定允许任何间接分支到达该ENDBRANCHI指令上例如,在进入根PD的已授权入口点处使用。类似地,在这样的实施例中,可通过任何间接分支来针对不包含任何立即操作数的ENDBRANCH指令。如上所述,在一些实施例中,可以定义指令以缩小能力的边界。该指令例如可以称为“NARROWCAP”,并且可以具有以下接口:NARROWCAPr64,r64,并且可以操作如下。指令可以从第一寄存器读取输入能力并且从第二寄存器读取期望的缩小的大小。该指令随后可以对输入能力进行解密,用第二寄存器的内容取代其对象大小字段,并且然后利用新的对象大小对输入能力进行重新加密,其中对象大小必须小于原始输入能力中指定的对象大小,例如在如图3所示的对象大小字段310中。在实施例中,如果在NARROWCAP执行之后新对象大小不小于原始值,则可能生成错误。另外,在实施例中,NARROWCAP可以支持改变能力的基址,并且可以检查新能力的最终边界在任何方向上没有超出输入能力的边界。在实施例中,该扩展功能可以基于附加的操作数来指定新对象基数。以上描述的通过NARRWOCAP执行的检查用于防止指令被误用而对输入能力曾经授权的更多存储器授予访问权。还注意到,在将许可元数据嵌入能力的实施例中,例如通过包含指示存储器是否可读、可写、可执行等的位,在这样的实施例中,除了只是如上所述限制可访问存储器的范围之外,NARROWCAP指令还可以支持同样限制该元数据。因此,为了支持这些实施例,NARROWCAP可以被扩展以接受指定新许可的第三r64操作数,并且其执行还可以包括检查以便如果其比输入到NARROWCAP指令的原始能力中的现有许可更具限制性,则只接受许可规范。注意到,在实施例中,NARROWCAP指令可通过编译器来插桩,并且在运行时执行。最后,在如上文所述的加密指令例如,ENCCAP的上下文中,注意到为了在非根PD内使用ENCCAP,所指的存储器必须在该PD所拥有的专用区域内。在实施例中,这可以通过多种方式进行验证。在实施例中,编译器和运行时加载器可能能够通过检查代码来在统计上验证对象在那些边界内。可替代地,在ENCCAP指令执行之前,运行时可能要求MPX类型或算术边界检查。接着描述的是与使用上述的ENDBRANCH指令的实施例有关的三个示例。示例涉及图8的示例存储器布局。在第一示例中,作为使用ENCCAP和DECCCAP来限制控制流的替代方案,可作为替代使用ENDBRANCH指令和MPX。因此,假设图8的函数A.0801中的已标签“dest.”为目标的分支,可以使用普通的未加密指针来引导分支。如上所述,ENDBRANCH指令是标签“dest”处的第一个指令,因此,允许执行以继续到下一个指令。进一步,可使用两个MPX边界检查指令来将当前指令指针即,代码位置针对用于当前PD保护域A805的下限和上限代码边界来进行检查。如果任一检查失败,则生成异常。否则,执行继续进行。在第二示例中,假设保护域B810的函数B.1813可能是恶意的,并且可以尝试分支到函数A.0801中的“dest.”。这将是未授权分支,因为函数B.1和函数A.0处于不同的保护域中。在dest标签之后的MPX下限检查指令因此将生成异常,因为“dest.”的地址0x0027位于PDB的代码的下限0x0100之下。在第三示例中,作为使用MPX边界检查的替代,在实施例中,ENDBRANCH指令本身可以利用立即操作数来扩展,立即操作数可利用表示当前PD的经授权ENDBRANCHID的内部CPU寄存器的内容来检查相等。如果上述第二示例在该上下文中重放,则在“dest.”处的ENDBRANCHID检查将失败。在第四示例中,作为使用MPX边界检查的替代,在实施例中,ENDBRANCH指令随后可以是比较指令,该比较指令具有立即操作数,指定要与用于当前活动PDID的线程-本地存储器位置进行比较的PDID。如果两个PDID不匹配,则后续分支将控制转移到处理程序。在第五示例中,作为对在当前指令指针上使用MPX边界检查的替代,在实施例中,ENDBRANCH指令随后可以是读取当前的阴影栈指针和MPX边界检查或等同算术指令以验证当前阴影栈指针位于当前PD的阴影栈的边界内的指令。可替代地,当前栈指针可经验证位于当前PD的栈的边界内。最后,在第六示例中,作为对在当前指令指针上使用MPX边界检查的替代,在实施例中,ENDBRANCH指令随后可以是加载其所驻留的代码区域的PDID的指令和MPX边界检查以验证加载的PDID匹配当前PDID。当前PDID将存储在MPX边界寄存器中作为下限和上限边界,使得可使用一对BNDCN和BNDCL指令或其等同物来检查加载的PDID。BNDCL指令使用边界寄存器较低值来检查下限边界,并且BNDCN指令使用边界寄存器较高值来检查上限边界。现在参考图11,其中示出了根据各个实施例的适合于实践本公开的计算机设备的框图。如图所示,计算机设备1100可以包括一个或多个处理器1102、存储器控制器1103和系统存储器1104。每个处理器1102可以包括一个或多个处理器核心以及硬件加速器1105。硬件加速器1105的示例可以包括但不限于编程的现场可编程门阵列FPGA。在实施例中,处理器1102还可以包括存储器控制器未示出。在实施例中,处理器可以被配置成支持ISA,ISA支持指令ENCCAP、DECDCAP、DECCCAP、NARROWCAP、INCEPOCH、ENDBRANCH或其等同物。系统存储器1104可以包括任何已知的易失性或非易失性存储器。另外,计算机设备1100可以包括大容量存储设备1106诸如固态驱动器、输入输出设备接口1108以与各种输入输出设备,诸如鼠标、光标控件、显示设备包括触敏屏等进行接合和通信接口1110诸如网络接口卡、调制解调器等。在实施例中,通信接口1110可以支持有线或无线通信,包括近场通信。元件可以经由系统总线1112彼此耦合,系统总线1112可以表示一个或多个总线。在多个总线的情况下,它们可通过一个或多个总线桥未示出进行桥接。这些元件中的每个元件都可以执行本领域已知的其常规功能。特别地,系统存储器1104和大容量存储设备1106可被采用来存储操作系统、一个或多个应用和各种模块统称为计算逻辑1122,其可包括编译器,该编译器可被配置成具有架构100A并且实践如图1A和图1B所描述的过程100B的各方面,并且具有被配置成实践图6的过程600的运行时环境的编程指令的可执行代码的工作副本和永久副本。在实施例中,如之前所述,通过编译器为计算机程序生成的可执行代码可以包括如之前参考图1A和图1B所描述的加密指令和解密指令。在所生成的指令的执行期间,运行时环境可以提供用于计算机程序的一部分将授权发送给计算机程序的另一部分以访问某段存储器的机制。实现计算逻辑1122的编程指令可以包括由处理器1102或可编译成此类指令的高级语言例如C支持的汇编指令。在实施例中,一些计算逻辑可以实现在硬件加速器1105中。在实施例中,计算逻辑1122的部分,例如计算逻辑1122的与编译器的运行时环境相关联的部分,可以实现在硬件加速器1105中。用于配置硬件加速器1105的编程指令或位流的可执行代码的永久副本可以通过例如分布介质未示出诸如压缩盘CD,或通过通信接口1110来自分布服务器未示出而被放入工厂或现场的永久大容量存储设备1106和或硬件加速器1105中。虽然为了易于理解,示出了执行包含本公开的谓词计算教导以增强嵌套环的流水线化和或并行执行的所生成代码的编译器和硬件加速器为位于同一计算设备上,但在替代实施例中,编译器和硬件加速器可以位于不同的计算设备上。这些元件1110-1112的数量、能力和或容量可以不同,取决于示例计算设备1100的预期用途,例如示例的计算机设备1100是否是智能手机、平板设备、超极本、膝上型计算机、服务器、机顶盒、游戏控制台、照相机等。这些元件1110-1112的构成可通过其它方式获知,因此将不进一步描述。图12示出了根据各个实施例的示例的计算机可读存储介质,其中具有指令,所述指令被配置成实现和或实践分别在前面描述的图1A、图1B、图4、图5和图6的过程100A、100B、400、500和600的各方面。如图所示,计算机可读存储介质1202可以包括多个编程指令或位流1204的可执行代码。编程指令或位流1204的可执行代码可以被配置成,响应于可执行代码编程指令或编码硬件加速器1205的操作的执行而使得设备如计算机设备1100尤其是硬件加速器1105能够执行分别在图1A、图1B、图4、图5和图6的过程100A、100B、400、500和600的各方面。在替代实施例中,可执行代码编程指令位流1204可以安排在多个非暂时性计算机可读存储介质1202上。在实施例中,计算机可读存储介质1202可以是非暂时性的。在其它实施例中,可执行代码编程指令1204可以编码在暂时性计算机可读介质中,如信号。返回参考图11,对于一个实施例,至少一个处理器1102可以与计算机可读存储介质一起封装,计算机可读存储介质具有计算逻辑1122的一些或全部的编译器或运行时环境代替存储在系统存储器1104和或大容量存储设备1106中,其被配置成实践之前参考图3、图4、图5和图6所描述的操作中的全部或选定的操作。对于一个实施例,至少一个处理器1102可以与具有计算逻辑1122的一些或全部的编译器或运行时环境的计算机可读存储介质封装在一起以形成系统级封装SiP。对于一个实施例,至少一个处理器1102可以与具有计算逻辑1122的一些或全部编译器或运行时环境的计算机可读存储介质集成在同一管芯上。对于一个实施例,至少一个处理器1102可以与具有计算逻辑1122的一些或全部编译器或运行时环境的计算机可读存储介质封装在一起以形成片上系统SoC。对于至少一个实施例,SoC可以在例如但不限于混合计算平板设备膝上型计算机中使用。下面提供了本文公开的技术的说明性示例。技术的实施例可以包括下面描述的示例中的任何一个或多个及其任意组合。示例示例1可以包括用于计算的装置,包括:一个或多个处理器;存储器;以及由所述一个或多个处理器操作以编译计算机程序的编译器,其中所述编译器包括:一个或多个分析器,用于解析和分析计算机程序的生成指针或取消引用指针的源代码。编译器还可以包括代码生成器,代码生成器耦合到所述一个或多个分析器,以生成针对所述计算机程序的源代码的可执行指令,包括至少部分地基于所述分析的结果将附加的加密或解密可执行指令插入到所述计算机程序中,以对所述源代码的存储器访问操作进行认证。示例2可以包括示例1和或本文其它示例的装置,其中:附加的可执行指令包括:要在计算机程序的生成指针的任何源代码之后插入的加密指令;以及要在计算机程序的取消引用指针的任何源代码之前插入的解密指令。示例3可以包括示例2和或本文其它示例的装置,其中,所述加密指令和所述解密指令各自将保护域标识符PDID作为输入,其表示要加载到一个或多个处理器的运行时环境中以便执行生成的指令的保护域PD。示例4可以包括示例2或3中的任一个和或本文其它示例的装置,其中,将分别的PD分派给要加载到运行时环境中的一个或多个应用中的每一个,所述一个或多个应用具有对共享的存储器区域的访问权。示例5可以包括示例2和或本文其它示例的装置,其中,当执行时,所述加密指令的输出包括至少部分加密的指针,并且指针包括授予对存储器位置的访问权的嵌入的元数据,并且其中,当所述至少部分加密的指针输入到解密指令并且成功执行所述解密指令时,获得由所述计算机程序的源代码生成的对应指针。示例6可以包括示例5和或本文其它示例的装置,其中,所述解密指令的执行还需要密钥,所述密钥被分派给PD,其中执行所述解密指令的应用由一个或多个处理器的运行时环境的根PD运行以执行生成的指令。示例7可以包括示例6和或本文其它示例的装置,其中,所述密钥是以下中的选定的一个:用于加密跨多个预定义的时间间隔而持续的指针的第一密钥,或用于加密仅对单个预定义的时间间隔有效的指针的第二密钥。示例8可以包括示例7和或本文其它示例的装置,其中,所述密钥是所述第二密钥,并且其中通过改变对于对至少部分加密的指针执行解密指令所需的密钥,在单个预定义的时间间隔过期时撤销对由所述加密的指针指示的存储器位置的访问权。示例9可以包括示例5-7中的任一示例和或本文其它示例的装置,其中,至少部分加密的指针具有等于要由计算机程序的源代码生成的对应指针的大小的大小。示例10可以包括示例5和或本文其它示例的装置,其中,所述至少部分加密的指针包括三个字段:永久字段、对象大小字段和指针字段,并且其中:所述永久字段用于指示所述加密的指针是不会过期还是仅在单个预定义的时间间隔内有效,所述对象大小字段指定所述加密的指针授予访问权限的所述存储器中对象的大小,以及所述指针字段指定所述对象在所述存储器中的地址。示例11可以包括示例10和或本文其它示例的装置,其中,所述加密指令规定所述指针字段的只有一部分要被加密,该部分包括所述指针字段的多个最高有效位。示例12可以包括示例11和或本文其它示例的装置,其中,所述对象大小字段和所述指针字段中的多个未加密位被合并到用于解密所述至少部分加密的指针的调整信息中。示例13可以包括示例5-7中的任一示例和或本文其它示例的装置,还包括固定块大小密码,用于至少部分地加密所述至少部分加密的指针。示例14可以包括示例5-7中的任一示例和或本文其它示例的装置,其中,所述解密指令将所述至少部分加密的指针、生成所述指针的PD的PDID和调整信息作为输入,所述调整信息包括:所述PDID,所述对象大小字段,以及至少部分加密的指针的指针字段的未加密的预定数量的最低有效位。示例15可以包括示例2和或本文其它示例的装置,还包括:编译器的相关联的运行时管理器,用于在执行之前检查编译的计算机程序的每个可执行指令,其生成指针或取消引用指针,以确认相关联的加密指令或者相关联的解密指令由所述编译器插入,并防止响应于确认失败而执行编译的源代码。示例16可以包括示例1和或本文其它示例的装置,其中,附加的解密指令包括针对用于数据访问的指针的解密指令,或者针对用于分支指令中的指针的解密指令。示例17可以包括一种或多种非暂时性计算机可读存储介质,包括多个指令,所述多个指令响应于被执行而使计算设备提供编译器以编译计算机程序,用于:解析和分析计算机程序的生成指针或取消引用指针的源代码;以及生成针对所述计算机程序的源代码的可执行指令,包括至少部分地基于所述分析的结果将附加的加密或解密可执行指令插入到所述计算机程序中,以将处理器的存储器访问操作限制到已授权进程。示例18可以包括示例17和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中:所述附加的可执行指令包括:要在计算机程序的生成指针的任何源代码之后插入的加密指令;以及要在计算机程序的取消引用指针的任何源代码之前插入的解密指令。示例19可以包括示例17和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,所述加密指令和所述解密指令各自将保护域标识符PDID作为输入,其表示要加载到所述计算设备的运行时环境以便执行所生成的指令的保护域PD。示例20可以包括示例17或18和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,当执行时,所述加密指令的输出包括至少部分加密的指针,并且指针包括授予对存储器位置的访问权的嵌入的元数据。示例21可以包括示例20和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,当至少部分加密的指针被输入到解密指令中并且成功执行所述解密指令时,获得由计算机程序的源代码生成的对应指针。示例22可以包括示例21和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,所述解密指令的执行还需要密钥,所述密钥被分派给PD,其中执行所述解密指令的应用由一个或多个处理器的运行时环境的根PD运行以执行生成的指令。示例23可以包括示例22和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,所述密钥是以下中的选定的一个:用于加密跨多个预定义的时间间隔而持续的指针的第一密钥,或用于加密仅对单个预定义的时间间隔有效的指针的第二密钥。示例24可以包括示例23和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,所述密钥是所述第二密钥,并且其中通过改变对于至少部分加密的指针执行解密指令所需的密钥,在单个预定义的时间间隔过期时撤销对由所述加密的指针指示的存储器位置的访问权。示例25可以包括示例20和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,所述至少部分加密的指针包括三个字段:永久字段、对象大小字段和指针字段,并且其中:所述永久字段用于指示所述加密的指针是不会过期还是仅在单个预定义的时间间隔内有效,所述对象大小字段指定所述加密的指针授予访问权的所述计算设备的存储器中对象的大小,以及所述指针字段指定所述对象在所述计算设备的存储器中的地址。示例26可以包括示例25和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,所述加密指令规定所述指针字段的只有一部分要被加密,该部分包括所述指针字段的多个最高有效位。示例27可以包括示例26和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,所述对象大小字段和所述指针字段中的多个未加密位被合并到用于解密所述至少部分加密的指针的调整信息中。示例28可以包括示例20和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,加密指令的执行还需要用于对至少部分加密的指针进行至少部分地加密的固定块大小密码。示例29可以包括示例20和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,所述解密指令以至少部分加密的指针、生成指针的PD的PDID和调整信息作为输入。示例30可以包括示例29和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,其中,所述调整信息包括:所述PDID,所述对象大小字段,以及至少部分加密的指针的指针字段的未加密的预定数量的最低有效位。示例31可以包括示例17和或本文的其它示例的一种或多种非暂时性计算机可读存储介质,还在执行所述多个指令时使所述计算设备提供所述编译器的相关联的运行时管理器,以在执行之前检查经编译的计算机程序的生成指针或取消引用指针的每个可执行指令,以确认编译器插入了相关联的加密指令或相关联的解密指令,并防止响应于确认失败而执行编译的源代码。示例32可以包括一种认证对由在计算设备上运行的一个或多个应用所共享的存储器区域的访问权的方法,包括:从在运行时环境的保护域PD中运行的函数接收针对在共享存储器中分配对象并生成访问它的能力的第一请求;将密钥分派给所述PD并使用所述PD的标识符PDID和密钥生成指向所述对象的存储器位置的加密的指针;从所述PD中运行的函数接收针对使用该能力第二请求;以及解密所述能力并将到所述对象的未加密的指针传递给所述函数。示例33可以包括示例32和或本文的其它示例的方法,其中,所述加密的指针包括指示以下信息的元数据:所述对象大小、以及所述加密的指针是否在所述运行时环境的若干预定义的时间间隔中持续、或者其是否在所述运行时环境的一个预定义时间间隔之后过期。示例34可以包括示例32和或本文的其它示例的方法,其中,由所述运行时环境的根PD分派到所述PD的密钥。示例35可以包括示例32和或本文的其它示例的方法,其中,向PD分派密钥包括向在PD运行时活动的纪元分派密钥。示例36可以包括示例32和或本文的其它示例的方法,其中,密钥在运行时环境的一个预定义时间间隔后过期,并且还包括通过改变分派给PD的密钥而使密钥过期。示例37可以包括示例32和或本文的其它示例的方法,还包括:确定第二请求是否包括将访问对象的能力转移到运行时环境的另一PD中的函数。示例38可以包括示例37和或本文的其它示例的方法,还包括:响应于所述确定,使用所述PD的当前密钥来解密所述加密的指针,为另一个PD生成并分派新密钥,并使用另一个PD的PDID和分派给所述另一个PD的新密钥重新加密解密的指针。示例39可以包括示例37和或本文的其它示例的方法,还包括:确定另一个PD是否不在运行中,或者未准备好传入的能力,并且响应于该确定,利用指定另一个PD的身份的信息将解密的指针入队。示例40可以包括示例39和或本文的其它示例的方法,还包括,在接收到另一个PD准备好接受传入能力时,使用用于另一个PD的密钥对解密的能力进行加密并且将该能力转移到另一个PD。示例41可以包括示例32和或本文的其它示例的方法,其中,第二请求包括缩小要利用所述能力访问的对象的大小的请求。示例42可以包括示例41和或本文的其它示例的方法,还包括解密所述能力,用所述缩小的大小来替换所述能力的对象大小字段,并重新加密所述能力。示例43可以包括一种或多种非暂时性计算机可读存储介质,包括多个指令,响应于被执行,所述指令使得计算设备执行示例32-42中的任一示例所述的方法。示例44可以包括用于计算的装置,包括:用于从在运行时环境的保护域PD中运行的函数接收针对在共享存储器中分配对象并生成访问它的能力的第一请求的单元;用于将密钥分派给所述PD并使用所述PD的标识符PDID和密钥生成指向所述对象的存储器位置的加密的指针的单元;用于从所述PD中运行的函数接收针对使用能力的第二请求的单元;以及用于解密所述能力并将到所述对象的未加密的指针传递给所述函数的单元。示例45可以包括示例44和或本文的其它示例的用于计算的装置,其中,所述加密的指针包括指示以下信息的元数据:所述对象大小、以及所述加密的指针是否在所述运行时环境的若干预定义的时间间隔中持续、或者其是否在所述运行时环境的一个预定义时间间隔之后过期。示例46可以包括示例44和或本文的其它示例的用于计算的装置,其中,用于分派的单元包括运行时环境的根PD。示例47可以包括示例44和或本文的其它示例的用于计算的装置,其中,所述用于分派的单元包括用于向在PD运行时活动的纪元分派密钥的单元。示例48可以包括示例44和或本文的其它示例的用于计算的装置,其中,所述密钥在运行时环境的一个预定义时间间隔后过期,并且还包括用于使密钥过期的单元包括用于改变分派给PD的密钥的单元。示例49可以包括示例44和或本文的其它示例的用于计算的装置,还包括用于确定第二请求是否包括将访问对象的能力转移到运行时环境的另一个PD中的函数的单元。示例50可以包括示例49和或本文的其它示例的用于计算的装置,其中,用于解密的单元还用于使用PD的当前密钥对加密的指针进行解密,用于分派的单元还用于生成并分派针对另一个PD的新密钥,并且用于加密的单元还用于使用另一个PD的PDID和分派给另一个PD的新密钥来对解密的指针进行重新加密。示例51可以包括示例49和或本文的其它示例的用于计算的装置,还包括:用于确定另一个PD是否不在运行中或未准备好用于传入能力的单元,以及用于利用指定另一个PD的身份的信息将解密的指针入队的单元。示例52可以包括示例49和或本文的其它示例的用于计算的装置,还包括:用于接收另一个PD准备好接受传入能力的指示的单元,用于使用另一个PD的密钥对解密的能力进行加密的单元,以及用于将能力转移到另一个PD的单元。示例53可以包括示例44和或本文的其它示例的用于计算的装置,其中,用于接收第二请求的单元还用于接收缩小要利用所述能力访问的对象的大小的请求。示例54可以包括示例53和或本文的其它示例的用于计算的装置,其中,用于解密的单元还用于对所述能力进行解密,并且还包括用于利用缩小的大小来替代所述能力的对象大小字段的单元,以及用于对所述能力进行重新加密的单元。前面的对一个或多个实现方式的说明提供了示例和描述,但不意在穷尽或将实施例的范围限于所公开的确切形式。根据上述教导可能有修改和变型,或者可以从各个实施例的实践中获取修改和变型。
权利要求:1.一种用于计算的装置,包括:一个或多个处理器;存储器;以及由所述一个或多个处理器操作以编译计算机程序的编译器,其中,所述编译器包括:一个或多个分析器,用于解析和分析计算机程序的生成指针或取消引用指针的源代码;以及代码生成器,其耦合到所述一个或多个分析器,以生成针对所述计算机程序的源代码的可执行指令,包括至少部分地基于所述分析的结果,将附加的加密或解密可执行指令插入到所述计算机程序中,以对所述源代码的存储器访问操作进行认证。2.如权利要求1所述的装置,其中:附加的可执行指令包括:要在所述计算机程序的生成指针的任何源代码之后插入的加密指令;以及要在所述计算机程序的取消引用指针的任何源代码之前插入的解密指令。3.如权利要求2所述的装置,其中,所述加密指令和所述解密指令各自将保护域标识符PDID作为输入,所述保护域标识符PDID表示要加载到一个或多个处理器的运行时环境中以便执行所生成的指令的保护域PD。4.如权利要求2或3中的任一项所述的装置,其中,将分别的PD分派给要加载到所述运行时环境中的一个或多个应用中的每一个,所述一个或多个应用具有对共享的存储器区域的访问权。5.如权利要求2所述的装置,其中,当执行时,所述加密指令的输出包括至少部分加密的指针,并且所述指针包括授予对存储器位置的访问权的嵌入的元数据,并且其中,当所述至少部分加密的指针被输入到解密指令中并且成功执行所述解密指令时,获得要由所述计算机程序的源代码生成的对应指针。6.如权利要求5所述的装置,其中,所述解密指令的执行还需要密钥,所述密钥被分派给PD,其中,执行所述解密指令的应用由一个或多个处理器的运行时环境的根PD运行以执行所生成的指令。7.如权利要求6所述的装置,其中,所述密钥是以下中的选定的一个:用于加密跨多个预定义的时间间隔而持续的指针的第一密钥,或用于加密仅对单个预定义的时间间隔有效的指针的第二密钥。8.如权利要求7所述的装置,其中,所述密钥是所述第二密钥,并且其中,通过改变对于对所述至少部分加密的指针执行解密指令所需的所述密钥,在所述单个预定义的时间间隔过期时撤销对由所述加密的指针指示的所述存储器位置的访问权。9.如权利要求5-7中任一项所述的装置,其中,所述至少部分加密的指针包括三个字段:永久字段、对象大小字段、以及指针字段,并且其中:所述永久字段用于指示所述加密的指针是不会过期还是仅在单个预定义的时间间隔内有效,所述对象大小字段指定所述加密的指针授予访问权的所述存储器中的对象的大小,以及所述指针字段指定所述对象在所述存储器中的地址。10.如权利要求9所述的装置,其中,所述加密指令规定所述指针字段的只有一部分要被加密,所述部分包括所述指针字段的多个最高有效位。11.如权利要求10所述的装置,其中,所述对象大小字段和所述指针字段中的多个未加密位被合并到要用于解密所述至少部分加密的指针的调整信息中。12.如权利要求5-7中任一项所述的装置,还包括固定块大小密码,用于至少部分地加密所述至少部分加密的指针。13.如权利要求5-7中任一项所述的装置,其中,所述解密指令将所述至少部分加密的指针、生成所述指针的所述PD的PDID、以及调整信息作为输入,所述调整信息包括:所述PDID、所述对象大小字段、以及所述至少部分加密的指针的所述指针字段的未加密的预定义的数量的最低有效位。14.如权利要求2所述的装置,还包括:所述编译器的相关联的运行时管理器,用于在执行之前检查经编译的计算机程序的生成指针或取消引用指针的每个可执行指令,以确认相关联的加密指令或者相关联的解密指令由所述编译器插入,并且防止响应于确认失败而执行经编译的源代码。15.如权利要求1所述的装置,其中,附加的解密指令包括针对用于数据访问的指针的解密指令,或者针对用于分支指令中的指针的解密指令。16.一种或多种非暂时性计算机可读存储介质,其包括多个指令,所述多个指令响应于被执行而使计算设备提供编译器以编译计算机程序,所述指令包括:解析和分析计算机程序的生成指针或取消引用指针的源代码;以及生成针对所述计算机程序的源代码的可执行指令,包括至少部分地基于所述分析的结果,将附加的加密或解密可执行指令插入到所述计算机程序中,以将处理器的存储器访问操作限制到已授权的进程。17.如权利要求16所述的一种或多种非暂时性计算机可读存储介质,其中:附加的可执行指令包括:要在所述计算机程序的生成指针的任何源代码之后插入的加密指令;以及要在所述计算机程序的取消引用指针的任何源代码之前插入的解密指令。18.如权利要求17所述的一种或多种非暂时性计算机可读存储介质,其中,所述加密指令和所述解密指令各自将保护域标识符PDID作为输入,所述保护域标识符PDID表示要加载到所述计算设备的运行时环境中以便执行所生成的指令的保护域PD。19.如权利要求17或18中的一项所述的一种或多种非暂时性计算机可读存储介质,其中,当执行时,所述加密指令的输出包括至少部分加密的指针,并且所述指针包括授予对存储器位置的访问权的嵌入的元数据,并且其中,当所述至少部分加密的指针被输入到解密指令中并且成功执行所述解密指令时,获得要由所述计算机程序的源代码生成的对应指针。20.如权利要求17所述的一种或多种非暂时性计算机可读存储介质,还使得在执行所述多个指令时,所述计算设备提供所述编译器的相关联的运行时管理器,以在执行之前检查经编译的计算机程序的生成指针或取消引用指针的每个可执行指令,以确认相关联的加密指令、或相关联的解密指令由所述编译器插入,并防止响应于确认失败而执行经编译的源代码。21.一种用于认证对由在计算设备上运行的一个或多个应用共享的存储器区域的访问权的方法,包括:从在运行时环境的保护域PD中运行的函数接收针对在共享存储器中分配对象并生成访问它的能力的第一请求;将密钥分派给所述PD并使用所述PD的标识符PDID和所述密钥生成到所述对象的存储器位置的加密的指针;从在所述PD中运行的函数接收针对使用所述能力的第二请求;以及解密所述能力并将到所述对象的未加密的指针传递给所述函数。22.如权利要求21所述的方法,其中,所述加密的指针包括指示以下信息的元数据:所述对象的大小、以及所述加密的指针是否在所述运行时环境的若干预定义的时间间隔中持续、或者其是否在所述运行时环境的一个预定义的时间间隔之后过期。23.如权利要求21或22中的任一项所述的方法,其中,所述PD的所述密钥由所述运行时环境的根PD分派,并且还包括通过改变分派给所述PD的所述密钥而使所述密钥过期。24.如权利要求21或22中的任一项所述的方法,还包括确定所述第二请求是否包括将访问所述对象的所述能力转移到所述运行时环境的另一个PD中的函数,并且响应于所述确定,使用所述PD的当前密钥来解密所述加密的指针,为所述另一个PD生成并分派新密钥,并使用所述另一个PD的所述PDID和分派给所述另一个PD的所述新密钥重新加密经解密的指针。25.根据权利要求21或22中的任一项所述的方法,其中,所述第二请求包括缩小要利用所述能力访问的所述对象的大小的请求,并且还包括解密所述能力、用缩小的大小来替换所述能力的对象大小字段、并重新加密所述能力。
百度查询: 英特尔公司 用于隔离的密码强制执行能力
免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。