用于运行时例程冗余跟踪的编译器高速缓存的制作方法

文档序号:12071199阅读:221来源:国知局
用于运行时例程冗余跟踪的编译器高速缓存的制作方法与工艺

一些计算机编程环境支持函数指针,其在一些情况下还被称为例程指针、子例程指针或程序指针。函数指针是到包含函数地址的存储器中的单元的指针。大多数现代指令集考虑了进行间接调用(除正常直接调用外)的指令,间接调用将把函数指针直接用作操作数。函数指针操作数包含其中控制流将继续的函数地址。间接调用指令将首先加载被存储在函数指针处的函数地址,并且然后调用应该是计算机系统的存储器内的可执行代码(用户故意授权的)的开始的该位置处的第一机器指令。通过函数指针做出的例程调用(亦称“调取”)还被称为“间接”调用,这是因为函数通过被存储在指针变量中的地址间接地被调用,而不是通过在编译时间已知的固定名称或者固定地址直接地被调用。与直接函数调用一样,系统可以将参数传递到间接地调用的例程,可以经历来自例程的执行的副作用,并且可以从例程接收返回值。



技术实现要素:

一些实施例或者示例发出将间接调用站点目标地址与编译器管理的高速缓存条目相比较以避免目标地址处的目标代码的至少一次冗余执行的代码。一些实施例或者示例发出将间接调用站点目标地址与编译器管理的高速缓存条目相比较以避免对目标地址处的目标代码执行安全性检查的介入代码的至少一次冗余执行的代码。在一些实施例或者示例中,正被编译的代码中的不同的间接调用站点中的至少一些由编译器分配不同的相应序数,并且那些序数中的至少一些被用于计算到高速缓存条目的阵列的偏移,并且在将间接调用站点目标地址与编译器管理的高速缓存条目相比较的发出的机器代码指令中,由编译器对偏移进行硬编码。

给定示例仅是说明性的。该概述不旨在标识所要求保护的主题的关键特征或基本特征,其也不旨在被用于限制所要求保护的主题的范围。相反,提供该概述以简化形式引入在详细描述中下文进一步描述的一些技术概念。本创新利用权利要求被限定,并且在该概述与权利要求冲突的程度上,应当以权利要求为准。

附图说明

将参考附图给出更特定的描述。这些附图仅图示了所选择的方面并且因此未充分地确定任何示例的覆盖或者范围。

图1是图示计算机系统、以及图示可以在多个网络节点上延伸的操作环境中的其他项、以及还图示一些配置的存储介质的各方面的框图,该计算机系统具有在用于建造应用的可执行版本的软件控制下和/或在可执行应用软件的控制下彼此相互作用的至少一个处理器和至少一个存储器;

图2是进一步图示在一些架构中的用于运行时例程冗余跟踪的编译器高速缓存的各方面的框图;以及

图3是图示一些过程的步骤和用于运行时例程冗余跟踪的编译器管理的高速缓存中的一些配置的存储介质的流程图。

具体实施方式

缩略词

下面定义一些缩略词,但是在本文中其他地方可以定义其他或者不要求定义由技术人员理解。

ALU:算术和逻辑单元

AOT:提前

API:应用程序接口

CD:压缩光盘

CPU:中央处理单元

DLL:动态链接库

DOM:文档对象模型

DVD:数字多用光盘或者数字视频光盘

ECMA:欧洲计算机制造商协会(现在Ecma国际)

ESP:x86处理器中的栈指针寄存器

FPGA:现场可编程门阵列

FPU:浮点处理单元

GPU:图形处理单元

GUI:图形用户接口

IDE:集成开发环境(有时还被称为“交互开发环境”)

IoT:物联网

ISO/IEC:国际标准化组织/国际电工委员会

JIT:即时

RAM:随机访问存储器

ROM:只读存储器

概述

给定示例仅是说明性的。该概述不旨在标识所要求保护的主题的关键特征或基本特征,其也不旨在被用于限制所要求保护的主题的范围。

在本文所描述的某些情况下,在不改变包含发出的代码的应用的语义(亦称黑盒功能)的情况下,代码生成器可以发出减少使用虚拟调用或者其他间接调用的编程语言中的例程调用的数目。特别地,在无需降低应用的安全性的情况下,一些示例发出减少应用的执行期间的安全性例程的调用的数目的代码。该减少具有对应的效果(诸如针对一些调用链中的所生成的代码的减小的执行时间和减小的存储器使用),其进而降低处理器负载、能量使用和硬件容量要求。

使用间接调用的编程语言中的一些编程是动态类型编程语言。动态类型编程语言的示例是许多的并且通常为本领域的技术人员所熟悉。也许目前最广泛使用的示例是使用在web浏览器和其他地方中的JavaScript语言;其是在ECMA-262规格和ISO/IEC 16262中标准化的ECMAScript的实现。使用间接调用的一些编程语言是面向对象语言。C++、Objective-C、Smalltalk、Delphi、Java、JavaScript、C#、Perl、Python、Ruby和PHP是面向对象编程语言的一些示例。使用间接调用的一些编程语言支持函数指针。支持函数指针的编程语言中的一些编程语言是PL/I、COBOL、Fortran、dBASE dBL、C、C++和D。

由于间接调用将控制流传送到在运行时被确定的地址,因而其有时是其中包含有效函数的位置利用攻击者的函数地址被重写的恶意攻击的目标。在一些实施例中,当正被编译的间接调用将控制传递给出现在编译器的审查目标的列表中的目标时,编译器发出将控制传递到该目标的代码。但是当正被编译的间接调用将向编译器尚未审查的目标传递控制时,那么编译器发出(a)进行重量级安全性检查、(b)如果目标由重量级安全性检查批准,则将控制传递给目标和(c)将目标添加到审查目标的列表的代码。审查目标的列表编译器维持由高速缓存中。

可以在较宽的上下文中查看本文所描述的一些示例。例如,概念(诸如高速缓存、编译、硬编码、间接、偏移、多形性、冗余、序列、类型检查和/或安全性)可以与特定实施例相关。然而,其不由针对抽象想法在本文中寻求专有权的宽泛的上下文的可用性产生;其不是。相反,本公开集中于提供其技术效果完全或者部分地解决特定技术问题并且改进计算机系统的功能的适当地特定实施例。涉及高速缓存、编译、硬编码、间接、偏移、多形性、冗余、序列、类型检查和/或安全性的其他介质、其他系统和其他方法在本范围之外。因此,在本公开的适当理解下,还避免了技术特征的模糊、仅抽象性、缺少以及伴随的证明问题。

本文所描述的示例的技术特征对于本领域的普通技术人员而言将是明显的,并且对于各种各样的关心读者而言的数个方式还将是明显的。第一,不管降低的安全性检查,一些实施例解决技术问题,诸如安全性检查的执行性能成本、每调用站点安全性检查机制的缺点和保留安全性和性能二者。第二,一些实施例包括技术部件,诸如以超过通用计算机内的典型的交互的方式与软件相互作用的计算硬件。例如,除了正常交互(诸如通常的存储器分配、通常的存储器读和写、通常的指令执行和某种I/O)之外,本文所描述的一些实施例利用单个初始安全性检查加上一些非常高效的高速缓存测试来保护一系列间接例程调用。第三,由一些实施例所提供的技术效果包括:在没有应用安全性中的对应的降低、降低的可执行代码存储器使用和/或ECMAScript服从语言的增加的执行速度和支持间接例程调用的其他语言的情况下安全性检查的数目中的降低。第四,一些实施例包括技术适配,诸如编译器管理的高速缓存、利用硬编码的偏移针对高速缓存的测试、和发出测试针对高速缓存条目的跳跃目标的代码并且避免被确定为由于跳跃目标测试的结果而冗余的检查例程调用的代码生成器。

一些术语

现在将对示例性实施例(诸如附图中所图示的那些实施例)进行参考,并且特定语言在本文中将被用于描述相同内容。但是(一个或多个)相关领域的技术人员将做出并且具有本公开的所有权的本文所图示的特征的变更和进一步的修改和由特定实施例所说明的抽象原理的技术应用应当被认为是在权利要求的范围内。

在本公开中澄清术语的意义,因此权利要求应当在仔细关注这些澄清的情况下进行阅读。给定特定示例,但是(一个或多个)相关领域的技术人员将理解到,其他示例还可以落在所使用的术语的意义内和一个或多个权利要求的范围内。此处,术语不必具有其在通常用法(特别地在非技术用法中)或者在特定工业的用法中或者在特定词典或者词典集中具有的相同意义。参考数字可以与各种短语一起使用以帮助示出术语的宽度。来自给定文本段的参考数字的省略不必意味着附图的内容将不由该文本讨论。发明人声明并且行使他自身的词典编辑的他的权利,包括将语言复制到权利要求中和来自本文中的任何位置的子申请中的权利。引用术语被明确地定义,但是当术语被隐含地定义时,未使用引用标记。此处,可以在详细描述中和/或申请文件中的其他地方明确地或者隐含地定义术语。

如本文所使用的,“计算机系统”可以包括例如一个或多个服务器、主板、处理节点、个人计算机(便携式或非便携式)、个人数字助理、智能电话、手机或者移动电话、具有至少处理器和存储器的其他移动设备、和/或提供至少部分由指令控制的一个或多个处理器的其他(一个或多个)设备。指令可以以存储器和/或专用电路中的固件或者其他软件的形式。特别地,虽然可能发生许多实施例在工作站或者膝上型计算机上运行,但是其他实施例可以在其他计算设备上运行,并且任何一个或多个这样的设备可以是给定实施例的一部分。

“多线程”计算机系统是支持多个执行线程的计算机系统。术语“线程”应当被理解为包括能够或者经受调度(并且可能地同步)的任何代码,并且还可以由另一名称(诸如例如“任务”、“处理”或者“协同例程”)所熟悉。线程可以并行、顺序或者组合并行执行(例如,多处理)和顺序执行(例如,时间片的)运行。多线程环境已经被设计在各种配置中。执行线程可以并行运行或者线程可以被组织用于并行执行但是实际上按顺序轮流执行。可以例如通过运行多处理环境中的不同的核心上的不同的线程、通过对单处理核心上的不同的线程进行时间分片或者、通过时间片和多处理器线程的某种组合实现多线程。可以例如通过内核的线程调度器、通过用户空间信号或者通过用户空间和内核操作的组合发起线程上下文切换。线程可以轮流对共享数据进行操作,或者每个线程可以对例如其自身的数据进行操作。

“逻辑处理器”或者“处理器”是单个独立硬件线程处理单元,诸如同时多线程实施方式中的核心。作为另一示例,运行每核心两个线程的超线程四核芯片具有八个逻辑处理。逻辑处理器包括硬件。术语“逻辑”被用于防止给定芯片具有至多一个处理器的错误结论;“逻辑处理器”和“处理器”在本文中可交换地使用。处理器可以是通用的,或者其可以被定制用于特定使用,诸如图形处理、信号处理、浮点算术处理、加密、I/O处理等。

“多处理器”计算机系统是具有多个逻辑处理器的计算机系统。多处理器环境发生在各种配置中。在给定配置中,所有处理器可以是功能相等的,然而在另一配置中,一些处理器可以借助于具有不同的硬件能力、不同的软件能力或者二者而与其他处理器不同。取决于配置,处理器可以在单个总线上被紧密耦合到彼此,或者其可以被松散耦合。在一些配置中,处理器共享中央存储器;在一些配置中,其各自具有其自身的本地存储器;以及在一些配置中,共享存储器和本地存储器二者存在。

“内核”包括操作系统、管理程序、虚拟机、BIOS代码和类似的硬件接口软件。

“代码”意味着处理器指令、数据(其包括常量、变量和数据结构)或者指令和数据二者。

“程序”在本文中宽泛地被用于包括应用、内核、驱动器、中断处理程序、库和由程序员(其还被称为开发者)编写的其他代码。

“例程”意味着函数、程序、异常处理程序、中断处理程序或者经由跳跃和上下文保存而接收控制的另一指令块。上下文保存将返回地址推送在堆栈上或者保存返回地址,并且还可以保存寄存器内容以在来自例程的返回时被恢复。

在一些情况下,编译器可以生成包括偏移作为恒定数值的代码,而不是当所生成的程序代码正执行时生成用于稍后计算偏移值的指令。在编译时间嵌入所生成的代码中作为常量的偏移和其他值据称是“被硬编码”。

“IoT”或者“物联网”意味着可寻址的嵌入式计算节点的任何联网集合。这样的节点是如本文所定义的计算机系统的示例,而且其以下特点中的至少两个:(a)没有本地人可读的显示器;(b)没有本地键盘;(c)输入的主要来源是跟踪非语言数据的来源的传感器;(d)没有本地旋转磁盘存储装置-RAM芯片或者ROM芯片,仅提供有本地存储器;(e)没有CD或DVD驱动;(f)家用电器中的嵌入件;(g)植入式医学设备中的嵌入件;(h)车辆中的嵌入件;(i)过程自动控制系统中的嵌入件;或者(j)集中于以下各项之一的设计:环境监测、市政基础设施监测、工业设备监测、能源使用监测、人类或者动物健康监测或者物理运输系统监测。

如本文所使用的,除非另外说明,否者“包括”允许附加元件(即,包括意味着包含)。“由……组成”意味着基本上由……组成或者完全地由……组成。当在不更改至今所要求保护的实施例的功能的情况下,可以自由地更改、移除和/或添加X的非Y部分(如果有的话)时,则X基本上由Y组成。

“过程”可以在本文中被用作计算科学领域中的术语,并且因为技术意义涵盖资源用户,也即,例如协同例程、线程、任务、中断处理程序、应用过程、内核过程、程序和对象方法。“过程”还可以在本文中被用作领域的专利法术语,例如,在描述与系统权利要求或者制造品(所配置的存储介质)权利要求相反的过程权利要求时。类似地,“方法”可以在本文中有时被用作计算科学领域中的技术术语(一种“例程”)以及有时领域的专利法术语(“过程”)。本领域技术人员将理解到,在特定实例中预期哪个意义,并且还将理解到,给定所要求保护的过程或者方法(在专利法意义上)可以有时使用一个或多个过程或者方法(在计算科学意义上)实现。

与在没有自动化的情况下相反,“自动地”意味着使用自动化(例如,由针对本文所讨论的特定操作和技术效果的软件所配置的通用计算硬件)。特别地,“自动地”执行的步骤名义上或者在人的头脑中未用手执行,但是其可以由人类发起或者由人类交互地引导。利用机器执行自动的步骤,以便获得在因此没有提供的技术交互的情况下将不被实现的一个或多个技术效果。

本领域技术人员将理解到技术效果是技术实施例的假定目的。例如计算被包含在实施例中并且在没有技术部件的情况下还可以执行一些计算(例如,通过纸和铅笔或者甚至作为精神步骤)的仅有事实并未移除技术效果的存在或者更改实施例的具体和技术性质。本领域技术人员将确认到,在一些情况下,不能简单地通过精神步骤或者通过纸和铅笔足够快速地并且足够可靠地执行计算以提供实施例的技术效果。

“计算地”同样地意味着计算设备(至少处理器加上存储器)将被使用,并且排除获得由单独仅有人类思想或者仅有人类动作造成的结果。例如,如在此所了解的,利用纸和铅笔做算术不是计算地做算术。计算结果是更快的、更宽的、更深的、更准确的、更一致的、更综合的,和/或以其他方式单独提供超过人类表现的范围的技术效果。“计算步骤”是计算地执行的步骤。“自动地”和“计算地”二者都不必要地意味着“立即地”。“计算地”和“自动地”在本文中可交换地使用。

“主动地”意味着没有来自用户的直接请求。实际上,用户可能甚至未认识到由实施例造成的主动步骤是可能的,直到步骤的结果已经被呈现给用户。除了如另外说明之外,本文所描述的任何计算和/或自动步骤也可以主动地完成。

“语言地”意味着通过使用自然语言或者常常采用在面对面人对人沟通的另一形式的沟通。语言地沟通包括例如说话、打字或者利用人的手指、手、脸和/或身体做姿势。

贯穿本文档,可选的复数“多个”的使用意味着存在所指示的特征中的一个或多个。例如,“(一个或多个)处理器”意味着“一个或多个处理器”或者相等地“至少一个处理器”。

贯穿本文档,除非明确说明,否则对过程中的步骤的任何引用假定步骤可以由感兴趣方直接执行和/或通过介入机构和/或介入实体由该方间接地执行,并且仍然位于步骤的范围内。也就是说,除非直接执行是明确说明的要求,否则不要求由感兴趣方造成的步骤的直接执行。例如,涉及由感兴趣方造成的动作的步骤(诸如关于目的地或者其他对象的分派、分配、避免、高速缓存、计算、调用、检查、比较、编译、确定、发出、执行、生成、硬编码、标识、初始化、调取、跳跃、传递、推送、弹出、测试、更新(和分派、经分派的、分配、被分配的等))可以包含由某个其他方造成的介入动作(诸如转发、复制、上载、下载、编码、解码、压缩、解压缩、加密、解密、验证、调取等),然而仍然被理解为将由感兴趣方直接地执行。

无论何时对数据或者指令进行引用,应理解到,这些项对计算机可读存储器和/或计算机可读存储介质进行配置,从而将其转换为特定制品(例如与简单地存在于纸上、人的头脑中或者作为仅有传播信号相反)。除非在权利要求中另外明确说明,否则权利要求不覆盖信号自身。出于美国的专利保护的目的,存储器、计算机可读存储介质和任何其他计算机可读介质不是传播信号或者载波,并且其不在In re Nuijten案例下的美国专利商标局(USPTO)解释的可专利的主题的范围之外。

此外,尽管明显地与本文中的其他地方相反的任何东西,但是在一方面(a)计算机可读存储介质、计算机可读介质和计算机可读存储器与另一方面(b)传输介质(还被称为信号介质或者传播信号)之间将理解清楚的区别。传输介质是传播信号或者载波介质。相比之下,计算机可读介质、计算机可读存储介质和计算机可读存储器不是传播信号或者载波介质。除非另外明确说明,否者“计算机可读介质”意味着计算机可读存储机制,不是传播信号自身。

本文中的“实施例”是示例。术语“实施例”不是与“本发明”可交换的;术语“示例”也不是。即使结果的方面组合自身在本文中未明确地描述,实施例也可以自由地共享或者借用用于创建其他实施例的各方面(假如结果是可操作的)。要求每一个许可的组合被明确地描述对于本领域的技术人员是不必要的,并且将是与识别针对本领域中的技术读者书写的专利说明书的策略相反的。关于起因于甚至少量的可组合的特征的可能的组合的数目的正式组合计算和信息共同直觉还将指示针对本文所描述的各方面存在大量的方面组合。因此,要求每个组合的明确记载将与要求专利说明书是简明的和读者在所涉及的技术领域中有可知的策略相反。

操作环境

参考图1,实施例的操作系统100可以包括计算机系统102。计算机系统102可以是多处理器计算机系统或者不是多处理器计算机系统。操作环境可以包括给定计算机系统中的一个或多个机器,其可以是集群的、客户端服务器联网的和/或对等联网的。个体机器是计算机系统,并且协作机器组也是计算机系统。给定计算机系统102可以被配置用于终端用户(例如,利用应用)、管理员(作为服务器、作为分布式处理节点、作为IoT节点和或以其他方式)。

人类用户104可以通过经由键入文本、触摸、语音、运动、计算机视觉、姿态和/或其他形式的I/O并使用显示器、键盘和其他外围106与计算机系统102交互。用户接口可以支持实施例与一个或多个人类用户之间的相互交互。用户接口可以包括命令行接口、图形用户接口(GUI)、自然用户接口(NUI)、语音命令接口和/或其他接口演示。用户接口可以例如在本地台式计算机上或者智能电话上被生成,或者其可以从web服务器被生成并且被发送到客户端。用户接口可以生成作为服务的一部分并且其可以与其他服务(诸如社交网络服务)集成。给定操作环境包括支持这些不同的用户接口生成选项和使用的设备和基础设施。

自然用户接口(NUI)操作可以使用语言识别、触摸和光笔识别、在屏幕上和在屏幕附近二者的姿态识别、空中姿态、头部和眼部跟踪、语音和语言、视觉、触摸、姿态和/或机器智能。NUI技术的一些示例包括触敏显示器、语音和语音识别、意图和目标理解、使用深度照相机(诸如立体照相机系统、红外照相机系统、RBG照相机系统以及这些的组合)的运动姿态检测、使用加速器/陀螺仪的运动姿态检测、面部识别、3D显示器、头部、眼部和视线跟踪、沉浸式增强现实和虚拟现实系统,其全部提供更多自然接口以及用于使用电场感测电极(脑电描记器和相关工具)感测大脑活动的技术。

作为另一示例,游戏可以驻留在Microsoft XBOX服务器(微软公司的标志)或者其他游戏服务器上。游戏可以从控制台被购买并且其可以全部或者部分在服务器上、在控制台上或者二者上被执行。多个用户可以使用标准控制器、空中姿态、语音或者使用配套设备(诸如智能电话或者平板电脑)与游戏交互。给定操作环境包括支持这些不同的使用场景的设备和基础设施。

系统管理员、开发者、工程师和终端用户各自是特定类型的用户104。代表一个或多个人而动作的自动化代理、脚本、回放软件等还可以是用户104。在一些实施例中,存储设备和/或网络设备可以被认为是外围设备。未示出图1中的其他计算机系统可以经由例如网络接口设备使用对网络108的一个或多个连接以技术的方式与计算机系统102或者另一系统实施例进行交互。

计算机系统102包括至少一个逻辑处理器110。计算机系统102(如其他适合的系统)还包括一个或多个计算机可读存储介质112。介质112可以具有不同的物理类型。介质112可以是易失性存储器、非易失性存储器、被固定就位的介质、可移除的介质、磁性介质、光学介质、固态介质和/或其他类型的物理耐久存储介质(与仅传播信号相反)。特别地,当被插入或者被安装时,配置的介质114(诸如便携式(即,外部的)硬驱动、CD、DVD、记忆棒或者其他可移除的非易失性存储器介质)在功能上可以变为计算机系统的技术部分,这使其内容对于与处理器110相互作用并且由处理器110使用可达的。可移除的配置的介质114是计算机可读存储介质112的示例。计算机可读存储介质112的一些其他示例包括内置RAM、ROM、硬盘和未由用户104容易地可移除的其他存储器存储设备。为了符合当前美国专利要求,计算机可读介质和计算机可读存储介质和计算机可读存储器都不是信号自身。

介质114被配置有由处理器110可执行的指令116;“可执行的”在宽泛的意义上在本文中被用于包括例如机器代码、可解译的代码、字节码和/或在虚拟机上运行的代码。介质114还被配置有数据118,其被创建、修改、引用和/或以其他方式被用于由指令116的执行造成的技术效果。指令116和数据118对其驻留在其中的存储器或者其他存储介质114进行配置;当该存储器或者其他计算机可读存储介质是给定计算机系统的功能部分时,指令116和数据118还对该计算机系统进行配置。在一些实施例中,数据118的一部分代表现实世界的项(诸如产品特性、库存、物理测量结果、设置、图像、读数、目标、体积,等等)。这样的数据还由备份、恢复、提交、停止、重定格式和/或其他技术操作转换。

虽然实施例可以被描述为被实现为由计算设备(例如,通用计算机、手机或者游戏控制台)中的一个或多个处理器所执行的软件指令,但是这样的描述不旨在详述所有可能的实施例。本领域的技术人员将理解到,还可以常常直接地以硬件逻辑全部或者部分实现相同或者类似的功能性以提供相同或者类似的技术效果。备选地,或者除了软件实施方式之外,可以至少部分通过一个或多个硬件逻辑部件执行本文所描述的技术功能。例如,并且在不排除其他实施方式的情况下,实施例可以包括硬件逻辑部件(诸如现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统部件(SOC)、复杂可编程逻辑设备(CPLD)和类似的部件)。基于例如其输入、输出和/或其技术效果,实施例的部件可以被分组为交互的功能模块。

在所图示的环境100中,一个或多个应用120具有代码(诸如源代码122和可执行代码124),其包括对例程128的调用126,以及数据结构(诸如对象、列表、树、其他链接结构)和/或其他构建(有时被称为“制品”)。术语“应用”宽泛地被使用在本文中。应用的一些示例包括商业软件、工业软件、医学应用、协同软件、提供对数据库的访问权的软件、显示可编辑的信息、游戏、应用商店购买的软件、软件即服务代码、中间件、内核、服务器代码和其他后端应用和web浏览器和脚本或由他们运行为插件的其他代码。

以一个或多个编程语言130编写源122。从以给定编程语言130的源创建的可执行代码有时还被称为该语言130,但是可执行代码被配置为包括机器代码。如本文所使用的,“机器代码”意味着底层代码或者计算机代码,其被定制到特定硬件架构或者被定制到特定虚拟机架构。机器代码的一些类似示例包括编译代码、微代码、固件代码、二进制代码、本地代码、目标代码、汇编语言代码、p代码、字节码、动态链路库代码和共同中间语言代码。

如所指示的,一些环境100包括软件开发工具132(诸如通过产生和/转换代码122、124来辅助软件开发的编译器134、解译器136和调试器138)。在附图中所示和/或在文本中所讨论的代码122、124、工具132和其他项可以各自部分或者完全地驻留在一个或多个硬件介质112内,从而对针对超过所有硬件-软件协作操作中固有的“正常”(即,最小公分母)交互的技术效果配置那些介质。除了处理器110(CPU、ALU、FPU和/或GPU)、存储器/存储介质112、(一个或多个)显示器140和(一个或多个)电池之外,操作环境还可以包括其他硬件(诸如例如总线、电源、有线和无线网络接口卡和加速度器),其在技术人员已经不是明显的程度上,在本文中描述相应的操作。

给定操作环境100可以包括集成开发环境(IDE)142,其向开发者提供协调的软件开发工具132集(诸如AOT编译器、JIT编译器、源代码编辑器、剖析工具、调试器等)。特别地,针对一些实施例的适合的操作环境中的一些操作环境包括或者帮助创建被配置为支持程序开发的Visual开发环境(微软公司的标志)。一些适合的操作环境包括环境(甲骨文美国公司的标志),并且一些包括利用语言(诸如C++或C#(“C-Sharp”))的环境,但是本文中的教导适用于各种各样的编程语言130、编程模型和程序120以及软件开发的领域自身之外的技术尝试。

一个或多个项以概括的形式被示出在附图中以强调其不必是所图示的操作环境或者所有实施例的一部分,但是可以与操作环境或者如本文所讨论的一些实施例中的项相互操作。其不跟随在任何附图或者任何实施例中必要地要求不以概括的形式的项。特别地,为了方便起见,提供了图1;图1中的项的包括不隐含项或者项的描述使用在本创新之前是已知的。

本领域的技术人员将理解到,在“操作环境”下本文所呈现的前述方面和其他方面还可以形成给定实施例的一部分。该文档的标题不旨在提供严格特征分类作为实施例特征种类和非实施例特征种类。

系统

图2图示了适于与一些实施例一起使用的架构的方面。代码生成器202通常地被定位在编译器134内。编译器可以是一个机器,而代码生成器的输出形成不同的机器上的应用120的一部分。代码生成器202输出包括特别地用于跟踪例程调用(诸如在没有副作用的情况下返回相同结果的调用和测试已经更早地通过相同安全性测试的另一例程的安全性的调用)中的冗余的至少一些的可执行代码124的片段。本领域的技术人员将理解到,例程的“副作用”是由例程产生的作用,其更改例程外的状态并且其除了经由通过堆栈被传递到例程的参数由堆栈上的例程所返回或者由例程所返回的任何值。

在一些实施例中,编译器将序数204分配到调用站点206。序数204是单个数字或数字序列或数字集,其唯一地标识编译期间的调用站点。当编译器的焦点移动通过被编译的代码122时,序数204可以基于由编译器所维持的一个或多个计数器242而被分配。调用站点206可以是直接或间接调用,但是一些实施例集中于间接调用,这是因为添加的间接水平(例如,函数指针的使用)往往使间接调用更不高效和/或更不安全,从而为优化提供机会。直接调用站点在运行时指定控制将被传递到的地址210。地址210推测地标记期望目标212的开始,但是如果安全性已经折衷,那么地址210相反指向注入的恶意软件。因此,可以在地址210与驻留在该地址处的目标212之间做出区分,但是为了方便起见,人们还可以可交换地使用“目标”和“地址”来意指例程的位置或者例程的指令,并且本领域的技术人员从上下文和其技术知识将理解到预期哪个意义。

在一些实施例中,编译器134创建和/或管理其条目是空或者在应用的执行期间先前遇到的地址210的调用站点高速缓存214。调用站点高速缓存214可以例如被实现为固定大小邻接条目的阵列、函数指针的大小的每个条目、以及对应于不同的调用站点的每个条目。阵列或者其他高速缓存实现可以根据调用站点序数被索引(例如,对应于调用站点数目1的条目1、对应于调用站点数目2的条目2等)。序数204和高速缓存索引218可以在不同的值处开始(例如,其中一个可以具有在其中条目0对应于调用站点数目1,条目1对应于调用站点数目2等的实施方式)。到高速缓存214中的偏移220是索引218的倍数,其使最小的可寻址的存储器单元(例如,字节)与用于保持函数指针的这样的最小的可寻址的存储器单元的数目(例如,4字节每32位函数指针)关联。

代码生成器202可以通过将其与调用站点的高速缓存条目相比较在运行时处发出测试调用站点的目标的代码222。如果其匹配,那么发出的代码224避免调用检查226(诸如安全性检查228),这是因为匹配指示检查先前地被调用用于该调用站点处的该目标。另一方面,如果测试确定当前目标不匹配当前高速缓存条目但是相反是新颖的(只要涉及高速缓存条目),那么发出的代码230通过将目标(即,目标地址)放置在针对讨论的调用站点的高速缓存条目中来更新高速缓存214,并且其他发出的代码232调用检查226。在一些情况下,高速缓存更新和检查的相对顺序可以发生变化,虽然预期到高速缓存更新将常常首先完成。然而,一些实施例首先进行检查226,并且一些实施例即使检查完成也不必更新高速缓存条目。

一些实施例向计算机系统102提供逻辑处理器110和存储器介质112,其由电路、固件和/或软件被配置以提供技术效果(诸如调用站点目标新颖测试),如本文所描述的。在一个示例中,被配置用于动态类型编程语言中的特性访问的机器代码的生成和执行的系统102包括至少一个处理器110和与处理器可操作通信的存储器112。

一些实施例包括用于针对编程语言中的动态调用的机器代码的生成和执行的系统102。系统包括至少一个处理器110和与处理器可操作通信的存储器112。系统102还包括编译器创建的高速缓存214,其在运行时期间被更新以包含多个间接例程调用站点206的目标地址210。不像与特定调用站点相关联的多形线型高速缓存那样,该编译器创建的高速缓存214仅包括每调用站点单个条目216并且还包括针对多个调用站点206的条目。

一些实施例包括用于针对编程语言中的动态调用的机器代码的生成和执行的系统102。系统包括至少一个处理器110和与处理器可操作通信的存储器112。系统102还包括编译器生成的代码124,其在运行时将间接例程调用站点的目标地址210与高速缓存214中的条目相比较,将被分配到编译时间处的调用站点的序数204作为索引218用到高速缓存中。

在一些实施例中,系统102包括代码生成器202,其将序数204分配到调用站点206,并且使用基于相应的调用站点序数在编译时间处计算322的偏移常量220来对编译器创建的高速缓存的访问进行硬编码320。

一些实施例包括用于编程语言中的动态调用的机器代码的生成和执行的系统102,其中系统包括至少一个处理器110、与处理器可操作通信的存储器112,以及以下各项中的至少一个:(a)存储器中的编译器创建的高速缓存214,高速缓存被配置为在运行时期间被更新以包含多个间接例程调用站点206的目标地址210;(b)相应的序数204向在系统102中正被编译的代码中的不同的间接例程调用站点206的分配;(c)编译器生成的机器代码222,其在由处理器运行时执行比较,所述比较用于比较间接例程调用站点206的目标地址20与包含多个间接例程调用站点206的目标地址的条目的编译器创建的高速缓存214中的条目216相比较,所执行的所述比较将被分配到编译时间的间接例程调用站点的序数204用作到编译器创建的高速缓存的索引218。

在一些示例或者实施例中,编译器创建的高速缓存214存在并且仅包括每间接例程调用站点206的单个条目216。

在一些示例或者实施例中,系统102包括代码生成器202,其将相应的序数204分配到不同的间接例程调用站点206,并且其使用基于相应的序数在编译时间处计算的偏移常量220来对编译器创建的高速缓存214的访问进行硬编码。

在一些示例或者实施例中,编译器生成的机器代码124包括指令序列116,其包括间接例程调用站点216的目标地址210与编译器创建的高速缓存214中的硬编码的偏移220处的编译器创建的高速缓存条目216之间的比较,并且当目标地址210等于编译器创建的高速缓存条目216时,指令序列116还包括避免调用介入例程226的跳跃224。

在一些示例或者实施例中,介入例程226被配置为执行以下各项中的至少一项:用于确定目标212是否包括恶意软件的安全性检查、或者在不执行任何副作用的情况下返回值240的计算。

在一些示例或者实施例中,编译器创建的高速缓存214包括固定大小邻接条目的阵列,每个条目216是函数指针的大小,并且每个条目216对应于不同的间接例程调用站点206。

在一些示例或者实施例中,编译器生成的机器代码124包括指令序列116,其包括间接例程调用站点216的目标地址210与编译器创建的高速缓存214中的硬编码的偏移220处的编译器创建的高速缓存条目216之间的比较222,并且当目标地址210不等于编译器创建的高速缓存条目216时,指令序列116还包括用于调用介入例程226的跳跃232,对介入例程226的调用在目标地址210处的目标代码212的调用之前。

在一些实施例中,外围设备106(诸如人类用户I/O设备(屏幕、键盘、鼠标、平板电脑、麦克风、扬声器、运动传感器等))将存在于与一个或多个处理器110和存储器可操作的通信中。然而,实施例还可以深度地被嵌入在技术系统(诸如物联网的一部分)中,使得没有人类用户104直接地和语言地与实施例交互。软件过程可以是用户104。

在一些实施例中,系统包括由网络连接的多个计算机或其他设备102。联网接口设备可以使用部件(诸如例如可以存在于给定计算机系统中的分组交换网络接口卡、无线收发器或者电话网络接口)提供对网络108的访问。然而,实施例还可以通过直接存储器访问、可移除的非易失性介质或者其他信息存储检索和/或传输方法来传递技术数据和/或技术指令,或者计算机系统可以在不与其他计算机系统通信的情况下操作实施例。

在其中计算服务未拥有但是按需提供的“云”计算环境和/或“云”存储环境中操作一些实施例。例如,代码生成器202可以在发出联网云中的一个设备/系统102上发出222、224、230、232,并且包含那些代码的应用120的副本可以被存储在云内的另外其他设备上。

过程

图3图示了流程图300中的一些过程实施例。附图中所示或者以其他方式所公开的技术过程可以自动地执行在一些实施例中,例如,通过在脚本的控制下或者要求很少或者没有同时的实况用户输入的编译器代码生成器。除非另外指示,否则还可以部分自动地并且部分手动地执行过程。在给定实施例中,也许在有操作的不同的参数或者数据的情况下,可以重复过程的零个或多个所图示的步骤。还可以以与图1中布局的从上到下顺序不同的顺序完成实施例中的步骤。可以串行地以部分地重叠的方式或者完全地并行执行步骤。流程图300被遍历以指示在过程期间所执行的步骤的顺序可以从过程的一个执行到过程的另一执行变化。流程图遍历顺序还可以从一个过程实施例到另一过程实施例变化。假如所执行的过程是可操作的并且符合至少一个权利要求,则步骤还可以被省略、被组合、被重新命名、被重新分组或者以其他方式脱离所图示的流程。

示例在本文中被提供以帮助图示技术的方面,但是在该文档内给定的示例未描述所有可能的实施例。实施例不限于本文所提供的特定实施方式、布置、显示、特征、方法或者场景。给定实施例可以包括例如附加或者不同的技术特征、机制和/或数据结构,并且可以以其他方式脱离本文所提供的示例。

在一些示例中,针对由间接调用检查的编译器造成的优化的算法过程进行如下。在编译期间,编译器将序数分配302到调用站点并且初始化304调用站点阵列或者其他高速缓存214。当编译器在正被编译306的代码122中遇到具有目标的间接调用时,则编译器310(或者发出308代码以检查310)正被编译的代码中的间接调用的目标是否与间接调用的经高速缓存的目标相同。虽然单个参考数字308被使用在针对所有代码发出步骤的该点处,但是分离的参考数字还可以被使用在备选的描述中,例如,用于发出代码222的308_222或308A、用于发出代码224的308_224或308B、用于发出代码230的308_230或308C和用于发出代码232的308_232或308D。当正被编译的代码中的间接调用的目标与间接调用的经高速缓存的目标相同时,则编译器在执行时发出在没有目标的介入检查226的情况下将向目标传递控制的机器代码224,从而避免312冗余检查226。当正被编译的代码中的间接调用的目标与间接调用的经高速缓存的目标不相同时,然后则编译器发出在执行时将向目标的介入检查传递控制并且然后在介入检查的结果的条件下有条件地向目标传递控制316的机器代码232,并且还将高速缓存的目标更新318为间接调用的目标。在一些情况下,介入检查226包括介入安全性检查228。

在一些示例或者实施例中,针对由间接调用检查的编译器造成的优化的算法过程包括以下各项:当编译器在正被编译306的代码中遇到352具有目标的间接调用时,则检查310正被编译的代码中的间接调用的目标是否与间接调用的经高速缓存的目标相同;当正被编译的代码中的间接调用的目标与间接调用的经高速缓存的目标相同时,发出308在执行时在没有目标的介入检查的情况下向目标传递316控制的机器代码;当正被编译的代码中的间接调用的目标与间接调用的经高速缓存的目标不相同时,发出308在执行时向目标的介入检查226传递316控制的机器代码,并且然后以介入检查的结果为条件有条件地向目标传递316控制,并且还发出308将高速缓存的目标更新318为间接调用的目标的机器代码。

在一些示例或者实施例中,介入检查226包括检测恶意软件的介入安全性检查228。

在一些示例或者实施例中,过程进一步包括将序数分配302到间接调用站点的编译器,并且间接调用目标被存储在根据所分配的序数而被计算322的高速缓存位置处。

在一些示例或者实施例中,间接调用目标被存储在使用例程计数器242和间接调用站点计数器242而计算322的高速缓存位置处,例程计数器跟踪350多少例程128由编译器在正被编译306的程序中遇到352,并且间接调用站点计数器跟踪350多少间接调用站点206由编译器在正被编译306的给定例程128中遇到352。

在一些示例或者实施例中,检查310正被编译306中的间接调用的目标是否与高速缓存的间接调用的目标相同包括:使用硬编码320的调用站点高速缓存偏移220。

一些示例或者实施例进一步包括以下各项中的至少一项:执行344尾部合并以减小代码大小,使用经由认证别限制对调用站点高速缓存214的访问的可信任的计算机制(TWC)244来增强调用站点高速缓存安全性。

一些示例或者实施例进一步包括发出308在执行时将检查328栈指针寄存器342的有效性的机器代码。

经配置的介质

一些实施例包括配置的计算机可读存储介质112。介质112可以包括磁盘(磁性、光学或者其他)、RAM、EEPROM或其他ROM和/或其他可配置的存储器(包括特别的计算机可读介质),与仅传播信号相反。被配置的存储介质可以特别地是可移除的存储介质114(诸如CD、DVD或闪速存储器)。可以是可移除或不可移除并且可以是易失性或非易失性的通用存储器可以被配置到使用从可移除的介质114和/或另一来源(诸如网络连接)读取的以数据118和指令116的形式的项(诸如调用站点序数204、调用站点高速缓存214、硬编码的调用站点高速缓存偏移220和代码序列222、224、230和/或232)形成经配置的介质的实施例中。

在一些示例中,计算机可读存储介质114被配置有数据和指令,其当由至少一个处理器110执行时使得处理器执行用于跟踪对编程语言130的动态指定例程的调用的机器代码的生成的算法过程。过程包括发出308在执行时将针对被存储在间接调用目标的高速缓存中的硬编码的位置处的地址而测试310对动态地指定的例程的间接调用地址的机器代码。当测试310确定324间接调用地址与被存储在间接调用目标的高速缓存中的硬编码的位置处的地址相匹配时,发出308在执行时避免312调用314预定检查例程226并且相反向动态指定的例程212传递控制316的机器代码。当测试310确定326间接调用地址与被存储在间接调用目标的高速缓存中的硬编码的位置处的地址不匹配时,发出308在执行时更新318间接调用目标的高速缓存中的硬编码的位置216以保持间接调用地址210并且调用314预定检查例程226以确定是否向动态指定的例程传递控制的机器代码230。一些示例利用间接调用目标的邻接的高速缓存214中的多个不同的硬编码的位置216中的每一个重复前述步骤中的一些或全部步骤。

在一些示例或者实施例中,一种非信号自身的计算机可读存储介质114,其被配置有数据118和指令116,其当由至少一个处理器110执行时使得处理器执行用于跟踪编程语言中的动态指定的例程的调用126的机器代码的生成的算法过程,过程包括以下步骤:发出308在执行时将针对被存储在间接调用目标的高速缓存214中的硬编码320的位置处的地址210而测试310到动态指定的例程128的间接调用地址210的机器代码222;当测试确定间接调用地址匹配被存储在间接调用目标的高速缓存中的硬编码的位置处的地址时,发出308在执行时做出避免312调用预定检查例程226的跳跃并且相反向动态指定的例程212传递316控制的机器代码224;并且当测试310确定间接调用地址不匹配被存储在间接调用目标的高速缓存中的硬编码的位置处的地址时,发出308在执行时更新318间接调用目标的高速缓存214中的硬编码的位置以保持间接调用地址的机器代码,并且发出308调用预定检查例程226以确定是否向动态指定的例程212传递控制的机器代码232。

在一些示例或者实施例中,过程包括利用间接调用目标210的邻接的高速缓存214中的多个不同的硬编码320的位置中的每一个来重复发出步骤308。

在一些示例或者实施例中,过程包括发出308利用高速缓存中的硬编码的位置来针对高速缓存条目而测试310目标的机器代码比较指令234、222,发出308用于更新318高速缓存条目的机器代码移动指令236、230,发出308用于避免对安全性检查做出冗余调用的第一机器代码跳跃指令238、224,并且发出用于对安全性检查228或其他例程226做出非冗余调用的第二机器代码跳跃指令238、232。

在一些示例或者实施例中,过程进一步包括发出308在执行时将检查328栈指针寄存器342的有效性的机器代码。

在一些示例或者实施例中,高速缓存214包括固定大小条目216的阵列,每个条目是函数指针210的大小。

在一些示例或者实施例中,过程进一步包括使用分配302到间接例程调用站点的序数来计算322高速缓存214中的硬编码320的位置。

所配置的介质112能够使得计算机系统执行针对属性访问代码优化的技术过程步骤,如本文所公开的。图1和图2因此帮助图示了所配置的存储介质实施例和过程实施例以及系统和过程实施例。特别地,在图3中所图示或者在本文中以其他方式教导的过程步骤中的任一个过程步骤可以被用于帮助将存储介质配置为形成所配置的介质实施例。为了公开目的的范围,在该“经配置的介质”标题下的讨论被认为被复制在“过程”标题下,并且在“过程”标题下的讨论被认为被复制在该“经配置的介质”标题下。此外,不在这两个标题下,在本公开的其他地方还讨论了过程。标题仅为了方便起见;其不限制本文中的教导的范围或内容。

附加示例

下面提供了附加细节和设计考虑因素。与本文中的其他示例一样,所描述的特征可以单独和/或组合或根本不使用在给定实施例中。

本领域的技术人员将理解到,实施方式细节可以关于特定代码(诸如特定API、特定存储器地址、特定属性和对象名称和特定样本程序),并且因此不需要出现在每个实施例中。本领域的技术人员还将理解到,在讨论的细节中使用的程序标识符和一些其他术语是实现特定的并且因此不需要关于每个实施例。但是,虽然此处其不必要求存在,但是提供了这些细节,这是因为其可以通过提供上下文帮助一些读者和/或可以说明本文所讨论的技术的许多可能的实施方式中的几个实施例。

本文中的一些讨论来源于一些Windows 9“Threshold”文档。Windows 9是由微软公司实现的软件,并且沿着“Threshold”一般地指代在市场化或其他材料(来自第三方以及Microsoft)到软件(微软公司的标志)的版本。该软件和/或文档的方面与本文所讨论的实施例中的一些实施例的方面一致或者以其他方式图示了本文所描述的实施例中的一些实施例的方面。然而,将理解到,这样的文档和/或实施方式选择不必约束本文所描述的任何示例或者实施例的范围,并且同样地“Windows 9Threshold”代码和/或其文档可以很好地包含位于这样的实施例和示例的范围外的特征。还将理解到,本文中的一些讨论部分地被提供为对不必是本领域的普通技术人员的读者的辅助,并且因此可以包含和/或省略其以下详述未严格地被要求支持本公开的细节。

通过上下文,C++的虚拟调用被实现为间接调用。为了执行间接调用,代码加载来自存储器的函数地址并且然后调用该经加载的地址。因此,编译器发出用于执行函数地址加载并且对经加载的地址做出调用的代码。间接调用与直接调用不同;为了实现直接调用,编译器生成对被解析到由链接程序造成的已知恒定地址的符号的调用。如果表示被调用的例程的符号不能由链接程序或者类似的预执行工具(诸如连结程序)被解析到实际地址,则针对直接调用发生链接错误。虽然间接调用提供有用的灵活性,但是间接调用还在许多利用发生处。例如,恶意黑客可能将一些恶意软件放到存储器中并且然后更改间接调用的目标,使得间接调用将向恶意软件代码传递控制。

一些IDE或者其他软件开发工具实现检查程序中的每个间接调用的技术,例如,通过向确定间接调用的目标是否有效的安全性检查228传递控制。如果目标不是有效的,那么控制不被传递到目标地址处的代码。如果目标是有效的,那么控制被传递到目标地址处的代码。这些检查提高了安全性,但是其可以基本上使包含许多间接调用(例如,C++虚拟调用)的程序120减速。以C++的虚拟调用支持多形性的计算机科学教导。间接调用有时被称为“i-calls”或“icalls”。

在本文教导的一些示例中,通过对目标高速缓存并且检查如所描述的高速缓存,延伸的编译器生成针对间接调用的新种类的安全性检查。如果其调用安全性检查或者将消耗处理器周期、存储器和/或其他资源以产生先前已经产生并且是可用的并且可以由编译器确定为仍然有效的结果的另一函数,则间接调用站点是“冗余的”。如果间接调用站点是冗余的(例如,当其在一些浏览器中时),那么本文所描述的高速缓存技术将通过避免做出冗余的安全性检查调用来加速执行。这可以通过实现检查间接调用站点是否与间接调用站点最后一次被检查时相同的代码222的顺序完成。如果其是相同的,那么不执行重量级安全性检查228;其是冗余的。如果间接调用站点不与其是最后一次相同,那么这是来自该站点的第一调用并且应当进行安全性检查(高速缓存条目是空的或者在一个比较中可标识为无效的另一值),或者其在不同的目标上做出时做出安全性检查,因此其应当对当前目标做出。

以下案例研究可能是有帮助的。内部开发任务被定义为重写针对冗余的i-calls的优化的保护代码生成。在Internet 网络浏览器的分析之后出现的任务导致脚本功能已经被虚拟化用于针对应用的Visual服务器端执行脚本或者其他基于脚本的部件(微软公司的标志)。在该浏览器实施方式中,在mshtml.dll连结到脚本引擎的实施方式之后,所有虚拟调用站点调用相同的间接函数指针,其/Guard检查以检测恶意软件利用。通过使初始地发出的每个i-call检查高速缓存单个函数目标来计算并且验证该观察。如果该函数目标从该调用站点处的该i-call检查再次被调用,则调用被计数为对高速缓存的命中,否则代码将高速缓存更新到新目标。该计算导致以下统计数字:

Mshtml-总计检查:775,353,998;总计命中高速缓存;739,033,269;效率;~95.3%

Jscript9-总计检查:424,137,653;总计命中高速缓存:399,552,911;效率:~94.2%

内部地实现管理私有运行时高速缓存214并且使用该高速缓存避免冗余地检查间接调用的编译器代码生成的版本。一个变型进行尾部合并在DLL水平处以保持代码大小降低。一个变型进行调用惯例检查(检查栈指针寄存器ESP的有效性,例如,其在针对该过程的正确地址范围内)和冷路径上的目标检查(目标在高速缓存条目中对比目标是新的地址210)二者。一些设计满足可信任的计算准则以改进高速缓存214安全性。一些设计包括剖面引导式优化以优化本文所描述的代码生成。

作为另一示例,考虑此处被指定为代码示例1的以下C++程序:

一些示例将生成308以下x86机器代码,使得每个间接或者虚拟调用针对作为调用目标的有效性由代码228检查326,并且检查328以确定ESP是否已经由调用惯例失配非法闯入。当其转变到示例中的__guard_jims_slow时,代码利用新/Guard库代码(以下还示出)工作。在针对安全性的两个检查的情况下,该代码被发出308用于x86(非x64)处理器110。一个检查通过在调用之前和之后检查ESP来寻找328调用惯例利用。另一检查使用针对表的存储器管理器来检查测试调用目标有效性。该代码此处被指定为代码示例2:

在代码示例2中,cmp指令是用于针对高速缓存条目而测试目标的代码222的示例。使用在该cmp指令中的偏移12是基于访问高速缓存214的第三条目216的4字节地址的硬编码的偏移220。基于注释“//存储”的mov指令是更新高速缓存214条目的代码230的示例。je指令是用于避免对安全性检查228做出冗余调用的代码224的示例,并且jmp指令是用于对安全性检查228做出非冗余调用的代码232的示例。代码示例2中的这些指令116仅是示例。代码222、224、230、232可以包括附加指令,并且还可以以其他汇编语言或者其他低级语言实现和/或被实现用于处理器,诸如ARM处理器和其他非x86处理器110。

在该示例中,新库代码出现在共同运行时中并且将静态地链接到针对高速缓存和类型库位置的每个DLL。这在本文中被指定为代码示例3:

在一个方法下,生成308默认不在用于由内部开发团队使用的交换机上而是相反被提供在其下。原型(在没有尾部合并堆栈检查但是高速缓存的情况下)导致在有限的测试下的web浏览器版本上的5%开销,其不管冗余是大约一半检查每个调用站点的开销。

现在转到将序数分配302到调用站点的特定步骤和相关工具和技术,将序数分配到函数中的特定调用站点的一个方法使用以下代码图示,其在本文中被指定为代码示例4:

特别关注代码示例4中所示的粗体代码部分,该方法使用编译器在编译应用时跟踪的两个计数器。一个计数器对编译的每个函数进行计数。另一个计数器对正被编译的当前函数中的每个间接调用站点进行计数。延长的编译器然后添加计数器并且得到作为N mod Number_Cache_Slots的数目。在代码示例4中,高速缓存214具有2048个高速缓存槽(即,高速缓存条目216)。因此,环绕式处理是可能的。如果当前函数数目加上当前间接调用站点的数目的和是2049,那么这将映射到高速缓存槽1。代码的粗体部分中的乘法器(“*MACH_REG_PTR)将从编译器管理的高速缓存的开始计算字节偏移。换句话说,该粗体代码正计算高速缓存中的逻辑槽(即,索引218)并且然后将其转换为可以使用在加载/存储机器指令中的存储器中的地址。

作为进一步的图示,以下代码示例5示出了包含间接函数调用连同指示在编译306代码时递增的两个数目intFunctionOrdinal+intICallsInFunction的注释的一些函数:

作为进一步的图示,以下代码示例5示出了包含间接函数调用连同指示在编译306代码时递增的两个数目intFunctionOrdinal+intICallsInFunction的注释的一些函数:在该代码示例5中,两个函数碰巧被分配有序数值337和338。如果在示例代码中示出一个或多个函数,则其将已经被分配有339等。

在编号337的函数中,存在以下示出为代码示例6的4个间接函数调用:

fScanner->setDocHandler(this);

fScanner->setDocTypeHandler(this);

fScanner->setURIStringPool(fURIStringPool);

this->reset();

应用用于确定实际高速缓存中的字节偏移的算法将包括像下面示出为代码示例7的那些的计算:

在由序数337所标识的函数中的第二间接调用站点处生成308的代码可能看起来像以下代码示例8:

本领域技术人员可以使用短语“编译器管理的”来表征高速缓存214,这是因为增强的编译器内部地拥有并且操作用于一致地将间接调用站点的编译时间实例映射到计算机的存储器112中的运行时位置的功能。示例示出:在运行时,由编译器产生的代码将能够检查自从最后一次其被检查以来特定调用站点处的函数指针是否已经改变。如果编译器管理的槽216包含先前被存储在那里的相同函数指针,那么不需要进行_guard_slow执行路径上的重量级检查228。

给定本文中的教导,本领域的技术人员将确认到,补充或者取代重量级安全性检查228,可以完成其他任务。特别地,该编译器管理的高速缓存方法可以使用在其他场景中、在针对冗余的运行时消除的安全性域之外。如果其通过使用由编译器管理的高速缓存被检测为冗余的,则可以避免计算地昂贵的任何运行时函数。这可以通过内部标签332与运行时函数128相关联330并且使增强的编译器将高速缓存槽分配334到该标签而被完成。这通过代码示例9图示:

compile_time_slot_number=F(compile time values)//代码示例4使用的函数数字和该函数内的间接调用站点数字

cache_offset=compile_time_slot_number*sizeof(pointer)

因此,例如人们可以将特定站点340处的处理器寄存器338的使用映射336到特定函数128中。如果该寄存器将包含来自返回EAX中的值(并且非副作用目标状态)的一些长运行函数的返回值,则本领域技术人员可以高速缓存由该函数所返回的值。这可以针对任何函数完成。在运行时,这将部分地降低或者消除长运行函数中的值的冗余重新计算。特别地,取代将间接函数调用映射为在代码示例4和相关代码示例中,本领域技术人员可以在运行时映射函数的返回值。在x86架构上,在寄存器EAX中传递该返回值。因此,在函数中的寄存器分配之后,本领域技术人员可以将简单的序数与已经由来自某个函数的返回值定义的EAX的每个外观相关联。然后,增强的编译器的代码生成器202可以因此在每个调用站点处生成代码并且避免冗余计算以计算348返回值。如果计算是至少有时冗余的,则这些调用站点可以是数据基础查询或搜索请求或长运行的任何东西。无论如何编译器具有运行时硬件缺少的上下文,这是因为编译器可以跟踪代码的大得多的部分中的活动和结构。

本领域技术人员还可以经由编译标示、源注释或者其他编译器指示或者指令来在每调用站点基础上使能或者禁能所描述的冗余移除优化中的任一个。本领域技术人员可以进行简档分析以确定在运行时处是否存在冗余和多少冗余。本领域技术人员可以添加度量以确定最有效的高速缓存大小。利用简单的环绕,在高速缓存槽中将有时存在冲突。

附加组合和变型

任何系统单独或组合可以被装备有用于跟踪运行时例程冗余的装置。适合的装置可以包括例如代码222、224、230和/或代码生成器202中的任何一个或多个,该代码生成器202被设计为发出被存储在存储器中并且由处理器可执行的这样的代码,该处理器操作使得例程冗余降低或者功能等同还可以是所陈述的装置的一部分。本文所讨论的任何算法或者本文中的任何代码示例或者用于发出本文中的任何代码示例或者另一代码序列中的功能等同或者另一机器代码或者用于另一处理器110家族的实施方式可以是所陈述的装置的一部分。

通过配置讨论中的系统的存储器112和/或配置讨论中的系统的可移除的介质114,代码和其功能等同的这些组合中的任一个可以与上文所描述的系统和其变型中的任一个进行组合。过程可以包括可操作的任何子集或者组合或者序列中的本文所描述的任何步骤。每个变型可以单独或者组合其他变型中的任何一个或多个发生。每个变型可以利用过程中的任一个发生并且每个过程可以与其他过程中的任何一个或多个进行组合。每个过程或者过程的组合(包括变型)可以与上文所描述的介质组合和变型的任一个进行组合。

在一些示例或者实施例中,用于将序数分配到间接调用站点的装置包括递增例程计数器242、递增间接调用站点计数器242和编译器代码,其使这些计数器递增并且基于编译期间的计数器的当前值计算序数204。在一些示例或者实施例中,用于降低冗余的装置包括发出的代码222、224、230和232。在一些示例或者实施例中,用于测试目标地址的装置包括与将硬编码的偏移220包括到高速缓存214中的操作数的比较指令。

结论

虽然特定实施例在本文中明确地图示并且描述为过程、配置的介质或者系统,但是将理解到,实施例的一个类型的讨论一般地还扩展到其他实施例类型。例如,结合图3和图12-15的过程的描述还帮助描述所配置的介质,并且帮助描述如结合其他附图所讨论的那些的系统和制造的技术效果和操作。其不跟随来自一个实施例的限制必然地被读取到另一个中。特别地,过程不必限于当讨论系统或者制造(诸如配置的存储器)时所呈现的数据结构和布置。

除非在本文中明确地陈述这样的排除,否则不从具有特征X和特征Y二者的该公开实施例中排除在本文中对具有某个特征X的实施例的引用和在本文中的其他地方对具有某个特征Y的实施例的引用。在即使该特定排除未给定在本文中的任何示例中也可以从另一实施例中的包括明确地移除被陈述为实施例的一部分的任何特征的意义上,所有可能的否定的权利要求限制在本公开的范围内。术语“实施例”在本文中仅被用作“过程、系统、制造品、配置的计算机可读介质和/或如以与适用法律一致的方式应用的本文中的教导的其他示例”的更方便的形式。因此,假定实施例与至少一个权利要求一致,则给定“实施例”可以包括本文所公开的特征的任何组合。

并非附图中所示的每个项需要存在于每个实施例中。相反,实施例可以包含在附图中未明确地示出的(一个或多个)项。虽然一些可能性此处被图示在由特定示例造成的文本和附图中,但是实施例可以脱离这些示例。例如,示例的特定技术效果或者技术特征可以被省略、被重新命名、被不同地分组、被重复、不同地以硬件和/或软件被实例化、或者是出现在示例中的两个或两个以上中的效果或者特征的混合。在一些实施例中,示出在一个位置处的功能还可以被提供在不同的位置处;本领域技术人员将认识到,在不必从被认为是整体的交互模块的集合省略期望的技术效果的情况下,可以以给定实施方式中的各种方式定义功能性模块。

已经通过参考数字自始至终对附图进行参考。与给定参考数字相关联的短语中、附图中或者文本中的任何明显的不一致应当理解为简单地使得由该参考数字引用的内容的范围变宽。即使使用相同参考数字,给定参考数字的不同的实例也可以指代不同的实施例。

如本文所使用的,术语(诸如“一”和“所述”)包括所指示的项或者步骤中的一个或多个。特别地,在权利要求中,对项的引用总体意味着至少一个这样的项存在并且对步骤的引用意味着步骤的至少一个实例被执行。

标题仅为了方便起见;可以在其标题指示该话题的章节外找到关于给定话题的信息。

所提交的所有权利要求和摘要是说明书的一部分。

虽然在附图中已经示出并且上文已经描述示例性实施例,但是对于本领域的普通技术人员而言将明显的是,在不脱离权利要求中阐述的原理和概念的情况下,可以做出许多修改,并且这样的修改不涵盖整个抽象概念。虽然已经以特定于结构特征和/或程序动作的语言描述了主题,但是将理解到,随附的权利要求中定义的主题不必限于权利要求的上文所描述的特定特征或者动作。对于给定定义或者示例中所标识的每个装置或者方面或者技术效果而言,其存在或者被利用在每个实施例中不是必要的。相反,所描述的特定特征和动作和效果被公开为在实现权利要求时的考虑的示例。

不符合形成整个抽象思想但是在权利要求的等价的意义和范围内的所有变化将在全部程度上被包含在由法律许可的其范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1