CN102483700B - 基于动态二进制重写器架构的轻量级服务 - Google Patents

基于动态二进制重写器架构的轻量级服务 Download PDF

Info

Publication number
CN102483700B
CN102483700B CN201080038984.2A CN201080038984A CN102483700B CN 102483700 B CN102483700 B CN 102483700B CN 201080038984 A CN201080038984 A CN 201080038984A CN 102483700 B CN102483700 B CN 102483700B
Authority
CN
China
Prior art keywords
code
basic block
instruction
binary rewriter
rewriter
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201080038984.2A
Other languages
English (en)
Other versions
CN102483700A (zh
Inventor
马克·赫德格
史蒂芬·T·泰
迈克尔·贝迪
安东·切诺夫
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Advanced Micro Devices Inc
Original Assignee
Advanced Micro Devices Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Advanced Micro Devices Inc filed Critical Advanced Micro Devices Inc
Publication of CN102483700A publication Critical patent/CN102483700A/zh
Application granted granted Critical
Publication of CN102483700B publication Critical patent/CN102483700B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • G06F9/45525Optimisation or modification within the same instruction set architecture, e.g. HP Dynamo
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3003Monitoring arrangements specially adapted to the computing system or computing system component being monitored
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/16Combinations of two or more digital computers each having at least an arithmetic unit, a program unit and a register, e.g. for a simultaneous processing of several programs
    • G06F15/163Interprocessor communication
    • G06F15/167Interprocessor communication using a common memory, e.g. mailbox

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Computing Systems (AREA)
  • Mathematical Physics (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

本发明涉及基于动态二进制重写器(DBR)架构的采样,该DBR架构为程序分析来平衡独立的内核。该架构包括硬件性能监控器,作为独立进程执行的DBR服务以及执行在客户进程内部的轻量级DBR代理。该DBR服务聚集来自硬件性能监控器的样本,通过推断热样本周边的程序结构来执行区域选择,在所选择的区域上执行转换(例如,优化),以及生成替换代码。然后该DBR代理补丁客户进程以使用该替换代码。

Description

基于动态二进制重写器架构的轻量级服务
技术领域
本发明涉及信息处理系统,尤其是涉及程序执行的监控以及动态二进制重写器(rewriter)。
背景技术
当监控在客户进程中执行的计算机应用程序时,监控程序需要分析该客户进程以确定较频繁执行的代码(即,热代码)的所处区域。当应用程序的初始源代码不易被修改或重新编辑时,这样的监控程序能存在于系统中。当对监控程序来说唯一可用的信息是运行时间信息时,定位以及构建这些区域则是有挑战的。
众所周知,利用动态二进制优化器(DBO:dynamicbinaryoptimizer),动态二进制重写器(DBR:dynamicbinaryrewriter)的一种特殊类型,来监控程序的执行并且优化频繁执行代码(即,热代码)以提高性能。公知的DBOs通常分为两种类型,基于DBOs的解释(Interpretation)和基于DBOs的采样(Sampling)。基于DBOs的解释平衡(leverage)解释程序(interpreter)或当时的(just-in-time)编译器以遵照程序的动态指令。基于DBOs的采样移除解释程序并利用基于技术的低成本采样来标识热代码。公知的DBOs为转换(transformation)选择热跟踪路径(hottrace)。该路径是执行单一入口、多出口的跨进程执行路径。
除了操作在本机二进制上而不需要任何静态程序信息之外,DBR与管理运行时间环境相类似。
发明内容
根据本发明,基于DBR架构的采样被说明,该DBR架构平衡(leverage)用于程序分析的独立的内核。该架构包括硬件性能监控器,作为独立进程执行的DBR服务和在客户进程内部执行的轻量级DBR代理。该DBR服务聚集(aggregate)来自硬件性能监控器的样本,通过推测热采样周围的程序结构来执行区域选择,在所选择的区域上执行转换(例如,优化),以及生成替换代码。然后该DBR代理补丁客户进程以使用该替换代码。
DBR在本机二进制上操作不需要之前的静态信息。因此,DBR能转换传统的二进制或资料库,对资料库来说,源代码是不可用的。同时,通过在运行时的操作,DBR调整在编译时不能用的转换时机。例如,DBR可基于当前程序的输入行为来执行转换,调整代码到特定下层结构以及执行跨动态链接库的转换。
附图说明
对本领域技术人员来说,通过参考附图本发明应该被更好的理解,其多个对象、特性和优势应该更加明显。在多个附图中使用相同的附图标记表示相同或类似的元件。
图1显示了具有动态二进制重写器的计算机系统的系统框图;
图2显示了基于动态二进制重写器架构的服务的框图;
图3显示了动态二进制重写器的区域选择操作的伪代码表示;
图4显示了在示例的客户程序上执行动态二进制重写器的热代码发现操作的结果的框图;
图5显示了在示例的客户程序上执行动态二进制重写器的代码分区操作的结果的框图;
图6显示了在示例的客户程序上执行动态二进制重写器的热代码调用内联操作的结果的框图;
图7显示了在示例的客户程序上执行动态二进制重写器的补丁点选择操作的结果的框图;
图8显示了在示例的客户程序上执行动态二进制重写器的代码精简操作的结果的框图;
图9显示了在示例的客户程序上执行动态二进制重写器的完整区域选择操作的结果的框图;
图10显示了热代码发现操作的伪代码表示;
图11显示了代码分区操作的伪代码表示;
图12显示了补丁点选择操作的伪代码表示;
具体实施方式
简要的参照图1,显示了计算机系统100的系统框图。计算机系统100包括处理器102;输入/输出(I/O)设备104,诸如显示器,键盘,鼠标以及相关的控制器(其中的每一个可远程的耦合到计算机系统100上);存储器106,其包括易失性存储器,例如随机访问存储器(RAM:randomaccessmemory),和非易失性存储器,例如硬盘和驱动器;以及其他存储设备108,例如光盘和驱动器和其他存储器设备;以及其他多个子系统110,所有这些设备通过一条或多条总线112互联。
该计算机系统进一步包括动态二进制重写器130,其存储在存储器106中并被处理器102(或被处理器内部的或者耦合到处理器上但与处理器分离(图中未示)的内核)执行。该动态二进制重写器130与包含在处理器102中的硬件性能监控器(HPM:hardwareperformancemonitor)132相互协同工作。在一个实施例中,该硬件性能监控器132支持基础指令采样(IBS:instructionbasedsampling)。基础指令采样是一种统计采样技术,其精确地将架构事件归类到特定指令中。在一些实施例中,IBS在每一个采样间隔的取指阶段(fetchstage)标记指令。任何发生在标记指令执行过程中的架构事件被汇报在HPM生成的样本中。其他实施例可使用其他方法来将架构事件归类到特定指令并汇报这些事件。
参考图2,显示了基于动态二进制重写器架构130的服务的框图。尤其是,该DBR架构130使用基础采样方法。基于动态二进制重写器架构130的服务包括硬件性能监控器(HPM:hardwareperformancemonitor)132,DBR服务进程212和轻量级DBR代理214。DBR服务进程212作为一个独立的进程来运行并且轻量级DBR代理运行在客户进程220中。HPM132提供低成本的配置文件(profiling)。DBR服务进程212聚集来自HPM132的样本并且分析该聚集的样本以执行区域选择和替换代码的生成。然后DBR代理214补丁(patch)221用户进程220以执行替换代码。通过将DBR服务进程211与客户进程执行的分离,该方法在执行实质分析的同时实现了对客户进程性能影响的最小化。
基于动态二进制重写器架构200的服务利用采样来收集关于客户进程执行的多种类型的信息。在一些实施例中,基础采样指令用来收集上述信息。其他实施例可使用其他采样方法。尤其是,多种类型的信息包括指令指针地址信息,分支定向信息,同时也可包括其他额外的信息,例如包括但不限于,装载目标地址信息。指令指针(IP:instructionpointer)地址信息包括与样本相关指令的地址。如果样本指令是条件分支指令的话,那么分支定向信息则包括分支条件的值。如果采样指令是装载指令的话,则装载目标地址信息包括读取存储器位置的地址。
DBR代理214是一个轻量级共享资料库(library),其在客户进程中执行。在系统启动时,DBR代理214自动地被装载入客户进程地址空间中并被初始化。初始化过程在客户进程220中生成新的线程,DBR代理214在客户进程220中操作。DBR代理214配置与DBR服务进程212的通信连接并且分配容纳替换代码232的共享的存储器空间230。当管理该连接时,DBR代理214响应于诸如请求执行替换代码的补丁操作和不补丁操作的消息,其中替换代码已经被DBR服务进程212有向(directly)放置在共享的存储器中。DBR代理214也执行一些其他类型的任务,这些任务包括挂起(hooking)可请求注意(attention)(例如,线程的生成和页面保护改变)的资料库调用和执行错误处理(例如,与DBR服务进程212之间的通信的丢失)。
DBR服务进程212操作在不同于客户进程220的独立的进程中,并且在一些实施例中,DBR服务进程212可在独立的处理器内核上(在多内核系统上)或独立的处理器上(在多处理器系统上)执行。通过将DBR服务进程212与客户进程相分离,该DBR服务进程212可与客户进程220并行地执行。同时,该分离最小化了存储器利用率并避免了与客户进程共享资料库。同时,该分离也使得单一的DBR服务进程能够支持多客户进程并在整个系统范围内管理资源。
DBR服务进程212包括控制线程240,其管理所有与DBR代理的通信并协调DBR服务的各个方面。当新的客户进程开始时,相应的DBR代理与DBR服务连接。在初始化连接中,控制线程获得与客户进程以及由DBR代理生成的共享存储区域232有关的信息。控制线程240匹配(map)共享存储器232的地址空间到DBR服务进程212的地址空间上。控制线程240可确定客户进程在执行这样一个程序,该程序不应被修改并能使得DBR130的后续处理变得无效。
控制线程240周期性地短期激活HPM132来收集配置文件的快照(snapshot)。控制线程240从HPM132处接收样本数据并基于客户进程和IP地址对这些样本进行合并。通过仅短期地激活HPT132,大部分时间客户进程用来根据样本采集开销无负担地执行。通过调整周期的长度,DBR132可在采样所需的开销和生成替换代码带来的效益之间进行权衡。通过间歇性地激活HPM132,DBR132可响应于在客户进程程序执行中可能产生的状态过渡。在某些实施例中,采样所需的开销可以低到能够允许连续使用HPM132而不仅仅是周期性地使用。
DBR服务进程212与包括由控制线程240生成的工作线程池242。在制作配置文件的快照后,控制线程240根据整个系统的负载来确定有多少个工作线程可并行调度。控制线程240也确定哪些客户进程应该被修改(如果有的话)以及应该以何种顺序来进行修改。然后控制线程240启动工作线程并等待这些线程在进入睡眠前完成直到下一个快照间隔。控制线程240也可评估替换代码的有效性并且如果合适的话则不进行替换代码的补丁操作。例如,控制线程240监控快照中的样本的比例,其中样本在替换代码中。
一旦工作线程242已被激活,该工作线程则为特定的客户进程执行区域选择以及替换代码的生成。工作线程242利用控制线程242提供的设备来访问聚集的样本,来读取客户进程地址空间,来将替换代码放置到客户进程的共享存储器中并通知DBR代理214来安装补丁。如果客户进程的地址匹配已经发生这样的变化,即与初始执行区域选择和替换代码生成时的状态不相兼容的话(例如,如果被引用的代码或数据被包括在资料库中,而这个资料库已经被卸载或页面保护已经更新因此上述代码或数据不再能被读取),则替换代码不可用。DBR服务进程212和DBR代理214协同工作以确保如果发生上面的不匹配情况时,替换代码不会被安装或不执行补丁操作。
参考图3,显示了动态二进制重写器130的区域选择操作的伪代码表示的示例。尤其是,DBR130结合区域选择操作300在没有程序的任何前期静态数据的情况下来标识热代码区域。DBR区域选择操作300将中间表示(IR:intermediaterepresentation)中的选择结果表示为超级区域(SRs:super-region)。超级区域可代表任意控制流,可包括来自多个嵌套循环的代码并能跨越多进程边界。在超级区域内,IR将控制流表示为单一入口、单一出口的定向非循环图。
上述非循环图的节点为基础程序块(BBs:basicblocks),图的边缘为控制流边缘(CFEs:controlflowedges)。每一个SR包括多个基础程序块。尤其是,每一个SR包括开始基础程序块,结尾基础程序块和零个或多个中间基础程序块。开始基础程序块是提供通用入口点的伪(pseudo)基础程序块。离开开始程序块的边缘被叫做入口边缘,该入口边缘是伪(pseudo)边缘,其代表进入来自原始客户代码的替换代码。结尾基础程序块是提供通用出口点的伪(pseudo)基础程序块。指向结尾块的边缘被叫做出口边缘,该出口边缘是伪(pseudo)边缘,其代表离开替换代码并且继续在原始客户代码中执行操作。中间(body)基础程序块表示真实的程序代码。转换中间基础程序块来生成替换代码。
在由区域选择操作300产生的最后的超级区域内,中间基础程序块形成单一的连接组件,其中入口边缘定义了补丁点(即,在客户程序中需要进行补丁操作以输入替换代码的地址)。超级区域的单一入口和出口使得超级区域能够遵循传统编译器的分析和优化。
通过执行热代码发现操作启动区域选择操作300。接下来,区域选择操作300执行代码分区操作。然后,区域选择操作执行仅导向(fallthroughonly)计算和热调用内联操作。接下来,区域选择操作300执行补丁点选择操作和代码精简(pruning)操作。
参考图4,显示了在示例的客户程序上执行二进制动态重写器130的热代码发现操作的结果的框图。热代码发现操作将聚集的HPM样本作为热样本基础程序块的种子地址。热代码发现操作分解向前(forward)跟踪控制流程的客户代码。通过冒险(venturing)远离热基础程序块的特定数量的条件跳转来限制发现操作。该结果是单一的超级区域,该超级区域包括成组的连接的基础程序块以表示在热指令周围的客户程序结构。
参考图5,显示了在示例客户程序上执行动态二进制重写器130的代码分区操作的结果的框图。代码分区操作将基础程序块和单一的超级区域控制流图的每个相连组件的控制流边缘移动到独立的超级区域中。代码分区操作也增加任何必须的入口和出口边缘以确保开始块和结尾块后支配该独立超级区域的所有基础程序块。
当热代码发现操作在分解指令时,热代码发现操作咨询样本聚合器并记录在基础程序块上的采样计数和生成的控制流边缘。因为仅导向其后继者的基础程序块没有明确的分支指令,因此没有样本可用于在控制流边缘上记录。相应地,计数的近似值通过仅导向计算操作来计算(参见例如图3),该计算操作来自非仅导向(nonfallthroughonly)控制流边缘的计数。
参考图6,显示了在示例客户程序上执行动态二进制重写器130的热代码内联操作的结果的框图。热调用内联操作确定任何热基础程序块是否包含调用指令以及是否有包括基础程序块的超级区域,该超级区域对应来自返回指令可到达的目标地址。如果这些条件满足,则热调用内联操作内联这些程序(routine)。
参考图7,显示了在示例客户程序上执行动态二进制重写器130的补丁点选择操作的结果的框图。不是所有被热代码发现操作所生成的位于超级区域中的基础程序块都可以被打补丁。DBR130的补丁点选择操作使用管理器和循环分析以确定每一个超级区域的好的补丁点组。
参考图8,显示了在示例客户程序上执行动态二进制重写器130的代码精简操作的结构的框图。通过代码精简操作,无循环的、被认为范围太小的或者无补丁点的超级区域被删除。任何仅仅退出超级区域的冷结尾基础程序块,与任何由于补丁点选择操作改变了入口边缘而导致的不可到达的基础程序块一起都被删除。
参考图9,显示了在示例客户程序上执行的动态二进制重写器130的完整区域选择操作300的结果的框图。生成的最终超级区域被显示。
参考图10,显示了热代码发现操作的伪代码表示的一个实施例。在DBR130中,客户进程可以以二进制方式执行,该二进制方式去除了该客户进程中所有的静态程序信息(例如,标记表和调试信息)。因此,热代码发现操作动态地发现没有这种静态程序信息的程序的结构。如果HPM132不提供足够信息的话,一些例如无向(indirect)调用,无向跳转和返回的控制流则难于跟踪。由于DBR130不确定它们是否能够返回,因此即使普通的调用也可能会出现困难(诸如调用类似退出的程序)。编译器可将这些调用放置在紧跟程序的数据的程序代码的尾部(诸如跳转表)。
可变长度指令组架构(ISAs:instructionsetarchitectures),(诸如可以表示在类似X86处理器架构的处理器架构中)代表了另一种挑战。给定已知的指令地址,DBR130可仅向前分解。可变长度编码使得辨别先前指令的开始处变得尤其困难。如果对控制流做出了不正确的假定,那么DBR130可停止在真实指令的中间的字节分解。
相应地,热代码发现操作探测到客户代码控制流在聚集的HPM采样标识的热指令处开始。所有其生成的基础程序块和控制流边缘被分配在单一的超级区域,first_sr,其在区域选择操作期间被分配。
由于热代码发现操作不断的探测,操作追踪到每一个客户地址相关的信息,该客户地址是或可能成为基础程序块的开始。热代码发现操作通过匹配数据结构来实现上述追踪,该匹配数据结构包括用于每一个这样的地址的独立入口。如果地址已经被成功的分解,那么热代码发现操作记录通过分解生成的基础程序块以及连同基础程序块的大小和指令边界。如果地址还没有被分解,则它的大小被临时作为单一的字节,并且已经生成并以该地址为目标的控制流边缘组被记录。这些控制流边缘被初始化生成为到结尾基础程序块的出口边缘,但是,当或者如果地址已被分解的话,那么则更新控制流边缘以将新的基础程序块作为它们的目标。此外,如果已经确定该地址不能被分解的话,则记录该事实并且所有指向该地址的控制流边缘都保留为出口边缘。匹配结构确保每一个指令都只被分解一次并且支持发现进程的增量特性。
为了管理不断增加的探测,热代码发现操作使用工作列表,其包括了已经被发现的基础程序块,这些基础程序块要求其后续的控制流被跟随。当首次生成基础程序块时,该基础程序块通常被放置到工作列表中。通过查询样本聚集器的对应于该热样本的地址组,热代码发现操作开始执行。对每一个这样的地址来说,热代码发现操作通过调用ENSURE-BB函数来确保存在基础程序块。由于基础程序块可包含具有多个样本的多指令,starts则作为false来通过。这表明基础程序块不需要在被请求的地址处开始,但是只需要包括该被请求的地址作为指令边界。
接下来,调用PROCESS-WORK-LIST函数,该函数继续从工作列表中提取基础程序块并处理该基础程序块直到工作列表为空。处理基础程序块包括确保基础程序块的每一个后续控制流边缘具有目标基础程序块,其可反过来增加更多的基础程序块到工作列表中。为了控制(throttle)发现操作在热代码探测上能够走多远,用从热代码的跳转数(jumps-from-hot)来标识每一个基础程序块,该从热代码的跳转数表示从热样本基础程序跳转到该基础程序块的条件跳转数。包括热样本或是从这样的基础程序块无条件可达的任何基础程序块,其从热代码的跳转数的值为0。因此,对于该样本基础程序块,jfh被宣布为0。如果后继控制流边缘在jump-from-hot的极限(limit)之下则其只被跟随。采样的统计本质可使得实际上是热的代码不能得到公正数量的样本。这个问题对那些非常小的基础程序块是很明显的。Jumps-from-hot机制缓解了这种缺陷。Jumps-from-hot机制同样也用于使得短的但是较低频率执行的离开和回到热代码的路径被包含在超级区域中。当限制包含非热代码的数量时,这避免了退出超级区域和丧失替换代码的优势。
如果后继控制流边缘是出口边缘的话,那么调用函数ENSURE-BB用于控制流边缘目标地址。在这种情况下,基础程序块需要在该地址开始,因为源基础程序块正在向该基础块移动。否则在目标基础程序块上调用函数SET-JUMPS-FROM-HOT。如果提供的从热代码的跳转数(jumps-from-hot)少于基础程序块的当前值,则更新基础程序块并将其放回到工作列表中。这将允许较低的数值被传递给它的后继者,这将导致探测那些之前已经超过极限(limit)的控制流边缘。
那些事实上从未被执行的跟随(following)控制流路径可使得不是指令的字节被分解。这些字节甚至可与当前指令重叠,这些指令通过紧跟的其他一些控制流路径是可到达的。为了处理这个,匹配允许覆盖相同地址的多入口存在(唯一的规则是它们具有不相交的指令边界)。为了确保这一点,当分解指令时,函数DISASSEMBLE-BASIC-BLOCK需要廉价地(cheaply)确定下一个指令的地址是否与当前入口的指令边界相交。
通过位置数据结构廉价地获得该确定结果,该位置数据结构记录匹配中关于重叠入口的信息,如果有重叠入口的话,则具有一个包括该地址被定位在何处的范围。除此之外,位置数据记录重叠入口中的哪一个(如果有的话)将该地址作为它的指令边界中的一个(由于不相交指令边界的要求这样的重叠入口可能最多有一个)。这被叫做匹配入口(被热代码发现操作中的.entry标识来访问)。最后,这个位置数据也记录关于后续入口的信息。后续入口是那个比位置数据的地址大的最小地址(同样的,基于和上述相同的原因可能至多有一个)。位置数据可廉价地(cheaply)超前到一个新的地址并渐增地(incrementally)更新所有其记录的信息。
为了便于计算地址的重叠入口,入口记录它的父入口,最低地址的重叠入口(如果有的话)。这限制了应该执行的搜寻通常为零(通过函数GET-POSITION),因为重叠代码的条件很少见。相反地,当生成或更新入口时(通过函数NEW-BB,MERGE-ENTRY,等等),通常提供包括必需的重叠入口的位置数据,以廉价地(cheaply)计算父入口以及确定哪些其他入口也需要更新它们的父入口。
函数ENSURE-BB利用函数FIND-ENTRY来确定是否已经有包括含addr的入口。如果函数FIND-ENTRY被请求来返回一个在该地址处starts的入口,那么函数FIND-ENTRY检查函数GET-POSITION返回的地址来确定是否有包含基础程序块的匹配入口(表明该地址已经被分解)。如果是的话,那么如果该地址不是基础程序块的开始,则函数FIND-ENTRY将该入口和相关的基础程序块分离(split)。如果该基础程序块在工作列表上,则它能够被交换为与分离的尾部相一致的新的基础程序块。这是因为基础程序块在工作列表上来探测它的后继者,并且在分离基础程序块顶部的基础程序块仅具有仅导向(fall-through-only)的控制流边缘,并且它是现在具有需要探测的控制流的底部。
检查由FIND-ENTRY函数返回到ENSURE-BB函数的位置数据以确定该位置数据是否具有匹配入口,该匹配入口标识当前的入口已经将地址作为指令边缘。如果匹配入口已经被标记为不支持,那么在该地址处则不生成基础程序块。如果代表控制流边缘的目标激活,那么控制流边缘将保留出口边缘。如果匹配入口具有基础程序块,那么该入口已经被分解并且不需要进一步的动作。然而,假如jfh较低的话,则更新基础程序块的从热代码的跳转数(jumps-from-hot),在这种情况下,应将基础程序块重新放置回工作列表中,这样该较低的跳转数可被传递下去。
这时候,DBR130知道没有在addr处开始的指令已经事先被分解(否则的话,将应该有入口包含它)。因此,DBR130调用DISASSEMBLE-BB函数,该函数分解指令并且提前(advance)位置数据直到任何一个条件被满足。尤其是,DBR130分解指令并且提前位置数据直到DBR130到达控制传输指令,遇到不支持或非法指令,或试图访问不存在或非只读可执行客户存储器。此外,要求一些指令在它们自己的基础程序块中。一个可选的实施例是,DBR130分解指令并且提前位置数据直到提前位置数据之后,该位置数据具有一个匹配入口,表示DBR130或者到达后续入口或者已经与重叠入口的指令边界同步化。另一个可选的实施例是,DBR130分解指令并且提前位置直到DBR130遇到作为补丁指令一部分的任意字节(通过参考共享存储器管理来确定)。补丁只能到达一个位置,并且对DBR130来说,不需要为同一个客户代码生成多个版本的替换代码,因为那将降低代码本地化的有效性。控制线程可监控替换代码的有效性并且选择移走它,以允许相关客户代码再次变成候选代码。
DISASSEMBLE-BB函数返回地址的位置数据,该地址与控制流一起紧跟在基础程序块的最后指令之后,该控制流包括基础程序块(BB)的所有控制流目标的地址,所有目标的样本计数,指令的全部样本计数,第一指令和采样第一可补丁指令的地址,以及指令边界。
通过下述多种方法中的一个来确定控制流指令的目标地址。(1)如果最后一条指令是条件跳转,那么函数DISASSEMBLE-BB利用HPM分支定向样本信息。(2)对存储器无向控制传输来说,函数DISASSEMBLE-BB利用文字(literal)地址或HPM装载目标地址样本信息作为适当的地址;函数DISASSEMBLE-BB读取这些位置以找到合适的目标地址。(3)如果从只读存储器中装载,则函数DISASSEMBLE-BB信任该地址,否则的话,函数DISASSEMBLE-BB仅信任也具有样本的地址,因为该指令已被执行所以指令的位置可以被改变。(4)对非文本只读存储器的无向(indirect)控制传输来说,函数DISASSEMBLE-BB也包括伪不知名目标,其表示可能有其他目标。(5)函数DISCOVER-REGISTER-INDIRECT-CODE处理无向寄存(registerindirect)。(6)如果HPM132在提供有向的目标地址是可用的,则函数DISASSEMBLE-BB反而可利用该信息。
需要注意的是,DISASSEMBLE-BB函数可能不能分解任何指令。在这种情况下,ENSURE-BB函数调用SET-UNSUPPORTED函数,如果有需要的话,该SET-UNSURPORTED函数在匹配中生成入口并且将该入口标记为不可支持的。任何附加的控制流边缘都将保留出口边缘。
如果后续位置数据表示在该地址处有匹配入口,则函数ENSURE-BB调用函数CAN-MERGE-ENTRY来检查匹配入口是否可被扩展以也包括刚刚被分解的指令。如果后续入口是由来自凑巧位于真实的基础程序块中间的热样本来生成的话,则这种条件能发生。如果下列条件为真的话,则合并可发生。(1)control_flow的值表示分解指令是以仅导向(fall-through-only)为结束的。(2)后续位置有匹配入口。(3)匹配入口以后续位置的地址为开始。如果DISASSEMBLE-BB函数与重叠入口相同步的话,则上述条件就不是这样的。在那种情况下,重叠入口必须被切分,当ENSURE-BB函数增加导向(fall-through)控制流边缘时,该重叠入口的切分将自动地发生。(4)后续入口具有没有前驱控制流边缘的基础程序块并且后续入口没有必须在它自己的基础程序块中的指令。没有基础程序块的入口或者不被支持或者被作为待定的控制流边缘的目标而生成,因此该入口不能被合并。
通过删除由pos.entry的值(如果有的话)指定的匹配入口,MERGE-ENTRY函数执行合并操作,更新后续入口和其相关的基础程序块的信息以在新的地址处启动,并且返回更新的位置。否则,调用NEW-BB函数来生成基础程序块并且将该基础程序块与由pos.entry(如果需要的话,则生成一个)指定的匹配入口相关联。在其他情况下,通过函数ENSURE-BB调用函数SET-JUMPS-FROM-HOT以更新基础程序块的从热代码的跳转数(jumps-from-hot)并且如果需要的话增加基础程序块到工作列表中(这对新的基础程序块来说将经常发生因为缺省情况下新生成的基础程序块无限大)。如果由pos.entry的值指定的匹配入口具有任何待定的控制流边缘,则更新所有控制流边缘以连接到新生成的基础程序块上而不是作为出口边缘。
如果生成新的基础程序块的,则函数ENSURE-BB调用函数ADD-CONTROL-FLOW。这个函数为每一个基础程序块的目标生成控制流边缘。如果有一个具有目标基础程序块的入口,则控制流边缘简单地与其连接;否则,生成到结尾基础程序块的出口控制流边缘并且调用函数ADD-PENDING-CFE来增加到目标地址的入口的待定的控制流边缘的控制流边缘,如果需要的的话则生成一个待定的控制流边缘。连接任何未知的目标到结尾基础程序块,因为未知目标没有地址,因此对其不生成入口。这些出口的控制流边缘表示无向传输的序列,无向传输指向不同于其他控制流边缘明确表示的目标。
为了利用INLINE-HOT-CALLS函数,调用的控制流边缘被特别表示。首先,DBR130总是假定调用指令会返回并且跟在控制流后继续执行。这保证了DBR130具有用于内联的完整的控制流图。值得注意的是,上述假定可能通常不会成立(例如,到一个编译器清楚永远不会返回的程序调用,或者以不标准的方式返回,例如通过调整返回地址以跳过被放置在调用之后的文本参数数据),但是函数MARK-UNPATCHABLE缓和了这个问题。其次,DBR130将从调用到调用目标基础程序块的控制流表示为两个控制流边缘;一个从调用到结尾基础程序块,一个从开始基础程序块到调用目标基础程序块。这些规定允许PATITION-CODE函数为不同的程序将代码隔离到独立的超级区域中,其也有助于内联器。
函数NEW-CFE和函数NEW-BB自动的管理这个结果。当函数NEW-CEF被请求来生成调用边缘时,如果调用目标基础程序块已经存在的话,则该函数立即生成入口控制流边缘。否则,该函数标识该入口作为调用目标并且该入口的生成将会推迟直到(如果曾经有的话)函数NEW-BB为该入口生成一个基础程序块。返回指令简单的具有一个出口控制流边缘。
DBR130将调用和返回指令放置在它自己的基础程序块中以使得函数INLINE-HOT-CALLS更加易于修改它们的控制流,将它们转化为伪指令,或删除它们。关于层叠的无向控制流的转化的无向控制流指令来说也是同样的。
函数DISCOVER-INDIRECT-CODE试图为那些超出函数DISASSEMBLE-BB能找到的无向控制传输指令推断目标。函数DISCOVER-INDIRECT-CODE通过检查正在执行的指令来进行推断,该指令包括位于正在执行的基础程序块中的指令。因为在那个时候正在执行的基础程序块可能还未被发现,因此函数DISASSEMBLE-BB不能执行检查操作。如果函数DISCOVER-INDIRECT-CODE成功的话,它传递目标到函数ADD-CONTROL-FLOW。这会增加更多的基础程序块到工作列表中,这样的话,函数DISCOVER-INDIRECT-FLOW调用函数PROCESS-WORK-LIST。反复地执行上述两步直到不再发现新的代码。
采用了多种策略来推断无向控制传输指令的目标。(1)对存储器无向索引,检查基础程序块和它的前驱基础程序块的指令以确定是否有被索引的跳转表。这通过索引边界检查代码来识别。也试图确定跳转表的地址(例如,访问可使用绝对或IP相关基础地址)。得到了表的地址,索引范围以及使用的访问大小之后,则执行检查以确定该表是否在只读存储器中,以及如果是的话,则读取内容以获得目标地址。这种方法能处理由通用编译器为转换表生成的代码惯用语(idiom)。(2)对无向寄存器,检查当前正在执行的指令,可能回到前驱基础程序块,以定位定义该寄存器的基础程序块。如果有载入指令,则(1)上面能被检查,否则通过使用DISASSEMBLE-BB函数以相同的方式确定目标。这种方法能处理由无向调用的通用编译器生成的代码惯用语(idiom)。如果提供有向分支目标信息的HPM可用的话,则可使用HPM而不是上述策略。
函数MARK-UNPATCHABLE确保补丁指令并不中断包含在重叠指令中的字节。函数MRAK-UNPATCHABLE通过在匹配中移动(walkingthemapping)以及将所有入口相关的且与其他入口重叠的基础程序快标记作为不可补丁的来实现上述确保。不管其他入口是否具有基础程序块上述操作均被执行,因为入口的存在表示已经检测到到上述地址的控制传输,即使由于超出从热代码的跳转数(jumps-from-hot)的限制而使得该入口是不被支持或不被探测的。父入口信息被用来检测重叠入口。
此外,函数MARK-UNPATCHABLE通过将基础程序块标识为不可补丁的来防止事实上不是指令的字节进行补丁操作,如果这些字节对已知已被执行的基础程序块来说是不可到达的。这个操作贯穿控制流图,从包括样本指令的基础程序块开始,并且沿着后续的控制流边缘继续进行。如前所述,忽略调用指令导向(fall-through)控制流边缘,因为该调用实际上可能并不返回。这个操作由函数DISASSEMBLE-BB提供的关于具有样本的第一指令的信息以及通过其他入口操作借助来自指令边缘信息的帮助维持所提供的信息来实现。在贯穿控制流图前,上述操作将基础程序块分区为三组:未执行是指不包含样本的基础程序块;部分执行是指具有样本但是该样本不在第一指令处;以及全部执行指的是具有在第一指令上的样本。所有的部分和全部执行基础程序块被增加到工作列表中。然后该操作处理在工作列表上的基础程序块。每一个基础程序块被这样处理,将其从工作列表中移除并且跟着它的后继控制流边缘。当跟随调用控制流边缘时,相应的调用目标控制基础块被用作为目标。然而,忽略调用导向(fall-through)控制流边缘因为这个调用实际上可能不返回。对其他控制流边缘来说,有向地使用该目标。如果目标在未执行组内,由于该目标最初从来不曾在工作列表中,因此将目标移动到执行组中并加入到工作列表中;如果目标在部分执行组中,由于目前已经知道该第一指令对其他基础程序块的执行的指令是可到达的,因此将该目标移动到执行组中;否则,该目标在执行组中并可忽略该目标。当工作列表变空时:(1)保留在未执行组内的所有基础程序块被标识为不可补丁;并且(2)恰好在具有样本的第一指令之前所有在部分执行组内的基础程序块被拆分并且对应于顶部的基础程序块被标识为不可打补丁。
一旦热代码发现操作完成,则删除匹配结构。
图11显示了代码分区操作的伪代码表示。尤其是,此时的DBR130有一个大的超级区域,其包括一组基本程序块,也包括DBR已经发现的位于基础程序块之间的控制流边缘。这个超级区域将试图包括多个独立连接的子图,多个子图对应于热代码的独立区域。由于在子图之间没有控制流,DBR130可以为子图独立地生成替换代码,该操作将更加有效。
独立地处理子图为每一个热区域带来代码本地化的优势。这种处理也允许每一个热区域被独立地管理(例如,保持热区域的同时对不再是热点的区域不打补丁)。此外,代码发现操作有意地表示调用使得用于不同程序的代码将位于不相交的子图中。如果探索法能独立地在程序上操作的话,那么内联器探索法在估计内联执行的数量上将更加有效。
基于这些理由,DBR130将代码分区到不相交的子图中并且将每一个子图放置到独立的超级区域中。为了支持传统编译器的分析(例如,支配者和后支配者和循环嵌套),DBR130也增加必须的入口和出口边缘以确保所有的基础程序块从开始基础程序块都是可到达的,并且所有的基础程序块都可到达结尾基础程序块。
尤其是,函数PARTITION-CODE首先调用函数SEPARTE-CONNECTED-COMPONENTS,其标识每一个连接的组件(CCs:connectedcomponents)通过从种子基础程序块在前后控制流边缘的贯穿以及忽略入口和出口控制流边缘。移动每一个连接的组件到它自己的超级区域中,并且连接相关的入口和出口边缘到超级区域的开始和结尾基础程序块上。
然后,在每一个超级区域上调用函数CONNECT-TERMINALS。这个函数首先计算每一个超级区域的强连接组件(SCCs:stronglyconnectedcomponents)。每一个基础程序块对其他基础程序块都是可到达的子图是最大子图。开始/结尾基础程序块通常在它们自己的强连接组件中,因为这些程序块没有前/后控制流边缘,因此不能与其他基础程序块形成一个循环。由于强连接基础程序块是最大的,在强连接组件之间的控制流不能形成一个循环。因此,只有那些不具有来自其他强连接组件的控制流边缘的强连接组件(不包括开始/结尾强连接组件)需要连接到开始基础程序块(任何其中的基础程序块都会这样,因为它们形成循环),因为所有其他强连接基础程序块对这些基础程序块都是可达的。同样,出口边缘只需要增加到那些不具有到其他强连接组件的控制流边缘的强连接组件上(同样,任何基础程序块都会这样做)。之前存在的入口和出口边缘将避免增加多余入口的风险。很少增加出口边缘,因为出口边缘只有在如果客户代码确实有无限循环的情况下才增加。
仅仅控制传输指令提供HPM样本信息,该样本信息可用来设置控制流边缘的计数。任何以非控制流传输指令结束的基础程序块都有一个仅导向(fall-through-only)控制流边缘,该边缘没有样本计数。函数COMPUTE-FALL-THROUGH-ONLY计算这些计数的近似值。该函数首先使得仅导向(fall-through-only)链包含最大路径,该最大路径仅包含仅导向(fall-through-only)的控制流边缘。如果重叠代码使得多个基础程序块导向到相同的基础程序块上,那么该重叠代码任意选择一个基础程序块而忽略其他基础程序块。由于可能只能导向(fall-through)到具有更高地址的指令,因此就不会有循环。
对所有未将开始基础程序块作为前驱的链路,函数COMPUTE-FALL-THROUGH-ONLY向前扫描通过一并加入前驱控制流边缘计数和减去非导向(non-fall-through)后续控制流边缘计数来推断后续导向(fall-through)控制流边缘计数。通过在最大链的顶部开始执行,函数COMPUTE-FALL-THROUGH-ONLY确定任何导向(fall-through)前驱在使用之前已经对其样本计数进行计算了。
由于函数COMPUTE-FALL-THROUGH-ONLY不具备伪入口边缘的样本计数,由此开始的链路不能向前扫描。取而代之的是,函数COMPUTE-FALL-THROUGH-ONLY向后扫描这些链路通过一并加入后继控制流边缘计数和减去非导向(non-fall-through)前驱控制流边缘计数来推断前驱导向(fall-through)控制流边缘计数。同样,在使用后续导向(fall-through)前计算其计数。既有出口边缘又有入口边缘的链路则不是这样操作的,函数COMPUTE-FALL-THROUGH-ONLY简单地假定伪控制流边缘的计数为0。
函数INLINE-HOT-CALLS连接调用基础程序块到是调用目标的基础程序块的“克隆”上。该“克隆”基础程序块从相关调用目标基础程序块开始,并沿着控制流至返回基础程序块,其进而被连接到初始调用基础程序块的后续程序块上。由于超级区域仅包括热代码,因此内联器实际上执行热路径的部分内联。在被调用的程序中任何出口边缘成为克隆基础程序块中的出口边缘。
函数INLINE-HOT-CALLS用伪指令替换初始调用和内联返回指令,其中伪代码随后被内联调用返回地址转换所扩展。这个替换操作允许调用方法的优化。在最坏的情况下,一旦出口边缘返回到执行实际返回指令的客户代码上,内联调用返回地址转换将初始客户地址推入堆栈(stack)。即使内联调用返回地址转换可以避免将返回地址推入堆栈(因为没有出口边缘),内联调用返回地址转换仍然需要在堆栈上为地址留一个空间(gap),除非内联调用返回地址转换能相应的改变在“克隆”基础程序块中所有堆栈访问偏移值。
“克隆”基础程序块实际上是特定调用站点的初始程序的特殊化实例。因此,仅在此种情况下是合法的,即如果该代码实际上正在执行被来自所述调用站点调用的程序,则客户代码有向地进入该“克隆”基础程序块。由于补丁点关于调用上下文(context)是不可知的并且仅到替换代码中的单一目的地,因此最安全的事情绝不是对内联基础程序块进行补丁操作。通过标识所有内联基础程序块为不可补丁来实现上述操作。值得注意的是,内联操作并不删除初始程序的基础程序块。因此,生成具有补丁点的程序的替换代码版本,并且如果内联的克隆基础程序块存在的话,则只有这个非特殊化的版本可被进入。
对无向调用来说,热代码发现操作为已知的目标生成多个控制流边缘。函数INLINE-HOT-CALLS正常地内联每一个控制流边缘并且转换调用到伪-调用-分配指令。这被转化为一个测试的级联以作为无向控制流转换的一部分。
函数INLINE-HOT-CALLS为所有超级区域计算调用图并且迭代地内联满足所有下述要求的调用站点:(1)该调用基础程序块是热的。函数INLINE-HOT-CALLS利用样本计数来确定哪个调用是热的并且值得内联,并可内联包括非内联调用(可能因为他们在冷路径上)的程序。(2)包括调用基础程序块的程序依然在预计的探索内。函数INLINE-HOT-CALLS监控执行代码扩展的数量并且避免过量的代码激增,该激增可能会反过来影响代码本地化的优势或者溢出共享存储器。在自身独立的超级区域中包含独立程序代码使得监控变得容易,每一个超级区域有其自己的预计代码。(3)调用目标基础程序块是已知的(这不是无向调用的未知目标)。(4)从调用目标基础程序块到至少一个返回基础程序块有路径。如果函数INLINE-HOT-CALLS能够将“克隆”基础程序块连接回调用者处,这样的话DBR130可以发现完整的中间循环,在这种情况下,该路径是值得被内联的。具有多入口的程序被支持,每一个调用目标基础程序块可以有它自身的返回基础程序块组。(5)被调用的程序不具有热调用站点。从上面留下的程序中处理调用站点确保该程序仅被内联在它自身已经执行内联之后。这同样也避免了内联(可能共有的)递归程序,该程序在调用图中形成循环这样使得调用再也不能离开。
函数INLINE-HOT-CALLS缩放在“克隆”基础程序块以及控制流边缘上的计数以与调用上的计数相一致。尽管并不必然地产生反映调用站点的实际行为的“克隆”计数,但“克隆”计数是近似值。函数INLINE-HOT-CALLS从初始基础程序块和控制流边缘中减去“克隆”计数,这样产生的计数反映这些克隆基础程序块不再被这个调用站点所执行。
客户进程必须从不在替换代码中执行调用指令,因为被推的返回地址将在替换代码内。将返回地址推入替换代码中将产生两个问题:客户程序可使用例外机制,当选择处理程序(handler)时,该例外机制监视返回地址;以及替换代码可不被补丁,并且找到和更新所有被推入的返回地址将是困难的。为了避免这一点,函数INLINE-HOT-CALLS删除任何没有内联的调用基础程序块。通过连接调用基础程序块的前驱控制流边缘到结尾基础程序块,将上述控制流边缘作为出口边缘。函数INLINE-HOT-CALLS调用函数CONNECT-TERMINALS来增加任何必要的入口控制流边缘到调用基础程序块的后续基础程序块上。这可使得超级区域具有多个连接的组件,但这会由PRUNE-CODE函数执行的分区操作来处理。
图12显示了补丁点选择操作的伪代码表示。基于处理架构的一定类型的结构限制,不是客户代码中的每一个指令适于进行补丁操作。例如,在x86处理器架构中,5字节分支指令,包括1字节的操作码,4字节的偏移值跟随其后,该分支指令被用来转换成替换代码。因此,只有比5字节大的客户指令可以被打补丁。补丁更小的指令可能会覆盖不止一个指令;如果后续指令中的一个是分支的目标,那么补丁操作将会中断程序。
一个额外的难题是安全修正代码的能力,该代码正在同时被多处理器架构上的其他处理器执行。这一问题管理代码系统(例如:Java虚拟机)也会遇到并且解决方案是可用的,但是其解决方案会增加额外的限制到能够被补丁的客户指令上。对AMDx86处理器的解决方案是:(1)如果字节没有跨越对齐8字节边界,那么就写入。否则:(2)写2字节自分支指令到开始的两个字节中。为了保证指令的原子性(atomic),写操作不应该跨越对齐8字节边界。(3)等待以确保所有的处理器已经完成它们的指令取指(fetch)阶段,该取指阶段在前一个写操作之前已经开始,因为取指阶段可提取初始指令。(4)写接下来的3个字节(偏移的最后3字节)。(5)用分支操作码和第一个字节的偏移重写初始的2字节。可以看到,这增加额外的限制到能够在AMD类型的x86架构下被打补丁的客户指令上。其他架构可能也有同样的问题。
值得注意的是,热代码由一旦进入就执行多次的循环组成。该循环可以很大并且跨越多个程序,但是直线代码仅本身需要很长时间来执行,因此不会是热代码。DBR130发现操作生成超级区域(其允许任意的控制流),因此该操作能够标识完整的循环。然而,由于DBR130仅探测热代码,因此,在循环内部可能有这样的路径,其偶尔被执行但是不是超级区域的一部分并且退回到客户代码。如果这样的路径试图在循环的早期迭代中执行,那么控制流可返回到客户代码,其中直到热超级区域下次进入该控制会被保留。因此,即使DBR130成功地标识了循环的热路径,DBR130也不会在超级区域中保留所有的循环迭代。这个问题的解决方案是试图在循环本体内放置补丁,这样的话,如果选择这样的路径,则循环在下一个迭代被重新进入。增加这样的补丁到内部循环中也可能倾向于限制转换。
最后,有两种其他限制。首先,一些基础程序块将从不被打补丁(即,那些被内联器克隆的和以及那些被MARK-UNPATACHABLE值标识的基础程序块)。其次,安装补丁的成本通常相对较高(需要系统调用来改变页面保护和清空缓存),因此对DBR130来说,最小化每一个超级区域中补丁的数量是十分必需的。
函数PATCH-POINT-SELECTION致力于解决这些挑战,通过改变入口边缘到从能被补丁的指令开始的仅有参考基础程序块,并且找到覆盖超级区域的循环的补丁的最小组。由于内联器经常需要具备完整程序的超级区域并且内联器通过补丁限制不被阻碍,因此DBR130在内联器操作之后执行选择操作。
尤其是,函数PATCH-POINT-SELECTION通过计算循环嵌套结构开始。然后确定补丁点组。该确定是在基础程序块的粒度基础上被确定,对该补丁程序块的第一指令是否实质上被补丁是不敏感的。函数PATCH-POINT-SELECTION然后移动旧的入口边缘,切分任何未以补丁指令开始的补丁点基础程序块,并且生成到该基础程序块的新的入口边缘。上述操作使得切分最小化以使得基础程序块达到其要求。
概念上,函数PATCH-POINT-SELECTION确定可补丁基础程序块的完整组,并且通过移除从该组中其他基础程序块可到达的任何基础程序块(没有必要将两个都包含在组内)来最小化该组。函数PATCH-POINT-SELECTION可利用支配关系来确定可到达性。然后,对循环来说,因为循环的后边缘确保该控制流能到达其后支配的同一个循环中的任何基础程序块,因此函数PATCH-POINT-SELECTION也可利用后支配者关系。因为补丁到内部基础程序块可限制循环的潜在转换,因此最好在外部循环中补丁基础程序块。为了达到这一点,函数PATCH-POINT-SELECTION层次化以从最外部循环开始来处理循环。
循环层次结构的根循环实际上并不是循环,而是包含嵌套循环的位置标志符。这允许由序列代码开始的超级区域能被表示,其中序列代码指向一系列循环。为此,当处理时函数PATCH-POINT-SELECTION维持两组补丁,即不含于循环中的根补丁和含于循环中的补丁。当与根补丁进行比较时,后支配者(post-dominator)关系不被使用。
PATCHES函数用来为单一循环标识补丁基础程序块组。该函数首先为循环体确定候选基础程序块组。如果基础程序块是可补丁的并且从现有的根或者循环补丁均不可到达的话,则其为候选基础程序块。然后该函数通过如下操作来最小化该候选基础程序块组,成对地将每一个成员与每一个其他成员相比较,如果其中的一个是可从另一个到达的,则移除该基础程序块。通过以深度优先的搜索顺序处理循环基础程序块,函数PATCH-POINT-SELECTION在循环体中的两个基础程序块中选择较早的一个,其中该循环体是互相可达的。因为其中任何一个基础程序块可能会满足该条件,因此选择哪一个基础程序块仅是一个直观的选择而不是严格限制的。可达性由函数SUPERCEDES来确定,该函数适当地使用支配者和后支配者支配关系。
函数NESTED-PATCHES用来共同处理循环和其自上而下的嵌套循环。在无限递归到检查其子循环之前,该函数检查循环体的基础程序块。任何选择的补丁与任何前面的循环补丁相联合,因此该联合可表示为代替其他嵌套循环的候选者。函数NESTD-PATECHES以DFS顺序来处理嵌套循环,这样的话较早的循环被选中。后期的嵌套循环可代替较早的嵌套循环,但是DBR130仍然希望在早期循环中具有补丁使得替换代码被输入到封闭的无补丁循环的第一个迭代中。
函数PATCH-POINT-SELECTION实质上与函数NESTED-PATCHES在根循环上所做的操作执行相同的功能。该函数利用在根循环上的PATCHES函数,但是规定仅利用支配者关系并将结果输入到根补丁中。然后该函数为每一个它的嵌套子循环来使用NESTED-PATCHES函数。然而,由于根循环不是循环,该函数增加任何子循环补丁到根补丁中。
补丁点操作致力于补丁外围的循环,这将有利于转换。如果一个内部循环试图在早期迭代中跟踪出口边缘,那么在安装替换代码之后,嵌套循环将依然是热的。由于热代码发现并不探测过去已经安装的补丁,该操作将试图恰好找到嵌套循环,该循环将被独立地转换。这个通用方法是可操作修改的(例如,通过分析来确定循环是否具有出口边缘并处理向外的最深处的循环)。
在DBR130区域选择操作的最后一步中,函数PRUNE-CODE精简已经被发现的代码。一个目标是以热代码的超级区域为结尾,其将有利于转换。当PATCH-POINT-SELECTION函数改变入口边缘时,函数PRUNE-CODE移除任何会引起不可达的基础程序块。
函数PRUNE-CODE也精简任何冷结尾基础程序块,这些基础程序块不能到达热基础程序块而仅退出超级区域。这些基础程序块通常是热代码发现的从热代码跳转数(jumps-from-hot)抑制机制的序列。由于这些基础程序块不是热基础程序块,并经常传送回客户代码,因此,将其包含在超级区域中是无用的;反而,替换代码可简单的更早地传回到客户代码。包括这些基础程序块为工作线程简单地提供更多的工作并且,由于这些代码将会被替换入冷代码缓冲器中,这将导致所需要的额外的跳转。通过将所有的冷基础程序块放置在冷组中以及将所有的热基础程序块放置在工作列表中来标识这些基础程序块。工作列表的基础程序块通过检查所有它们的前驱来被执行,那些位于冷组的基础程序块增加到工作列表中是由于它们能够到达一个热基础程序块。保留在冷组中的基础程序块被删除,但是它们的来自基础程序块的前驱的任意控制流边缘被变为出口边缘并且连接到结尾基础程序块上。
基于内联器作出的控制流改变,补丁点选择和冷结尾块的移除,再次调用函数SEPARATE-CONNECTED-COMPONENTS将是有效的。这确保了每一个超级区域再一次仅包括单一的连接组件并因此将被后续的精简操作独立地检查。
不包含执行多迭代的循环的超级区域可能不会从转换中受益,因为补丁跳转和跳转回去的成本可能超出了任何转换所带来的收益。DBR130检查循环嵌套并利用控制流边缘计数来估计循环被迭代的平均次数。没有任何超出阈值的循环的超级区域被删除(这包括完全不包括循环的超级区域)。最后,DBR130也删除那些非常小的超级区域,因为这些区域可能没有足够的能改进的代码。
本发明也可适用于达到上面所描述和内在隐含的优势。尽管本发明已经被描述,并通过参考本发明的特定实施例被定义,但是这样的参考并不意味着对本发明进行限制,并且没有这样的限定被推断。对本领域普通技术人员来说,本发明在形式和功能上能够进行较大的改变、变更或等同。此处所描述的实施例仅仅是示例性的,并不能作为限制本发明范围的边界。
例如,应该理解其他处理器架构和HPM应用也是可预计的。
同样,上述描述的实施例中包括执行一定任务的软件模块。此处描述的软件模块包括代码、程序(batch)和其他可执行文件。该软件模块可被存储在诸如硬盘驱动等机器可读或计算机可读存储介质上。根据本发明的实施例的用来存储软件模块的存储设备可以是磁盘、硬盘,或诸如CD-ROMs或CD-Rs等光盘。根据本发明的实施例的用来存储固件或硬件模块的存储设备也可以包括半导体基存储器,该存储器可以永久的、可移除的、或远程的方式耦合到微处理器/存储器系统上。因此,该模块可被存储到计算机系统的存储器内来配置计算机系统执行该模块的功能。其他新的和各种类型的计算机可读存储介质可用来存储此处讨论的模块。此外,本领域技术人员应该意识到将功能分割成模块是为了易于说明。其他实施例可将多个单一模块的功能合并到一个模块中或增加可选的模块功能的分解。例如,调用子模块的软件模块可被分解使得每一个子模块执行它的功能并且有向传递控制到其他子模块上。
因此,本发明仅仅受限于以下权利要求书的精神和范围,以及在所有方面的可认知的等同方式。

Claims (8)

1.一种动态二进制重写器系统,包括:
包含在处理器中的硬件性能监控器,该硬件性能监控器对一个或多个客户进程进行采样;
动态二进制重写器服务,该动态二进制重写器服务作为独立的进程执行,该动态二进制重写器服务被配置成:
聚集来自所述硬件性能监控器的样本;
执行区域选择以在没有任何前期静态程序信息的情况下标识在所述一个或多个客户进程中被频繁执行的代码区域,其中标识所述被频繁执行的代码区域包括:
在该一个或多个客户进程中确定被频繁执行的代码;以及
执行发现操作,该发现操作分解向前从已知的频繁执行的地址处开始的该一个或多个客户进程的代码;
优化所选择的区域;以及
为所选择的区域生成替换代码,其中所述替换代码在功能上与所选择的区域的初始代码等同;以及
动态二进制重写器代理,该动态二进制重写器代理在该一个或多个客户进程内部执行,该动态二进制重写器代理补丁一个或多个客户进程以使用所述替换代码;
其中该客户进程的控制流被跟随以提供包含任意控制流的控制流图。
2.如权利要求1所述的动态二进制重写器系统,其中:
在该一个或多个客户进程的开始阶段,该动态二进制重写器代理自动地被装载到该一个或多个客户进程对应的客户进程地址空间中并被初始化;以及,
该动态二进制重写器代理执行替换代码的补丁和不补丁操作并报告必要的系统资料库的使用而不在该一个或多个客户进程上施加大量额外的资源需求。
3.如权利要求1所述的动态二进制重写器系统,其中:
从该一个或多个客户进程分离该动态二进制重写器服务允许该动态二进制重写器服务与该一个或多个客户进程并行地执行,利用一个或多个独立内核,如果内核可用的话,同时最小化存储器利用率和避免与该一个或多个客户进程共享资料库;以及,
从该一个或多个客户进程中分离该动态二进制重写器服务允许该动态二进制重写器服务管理多客户进程以此来允许该动态二进制重写器使用的系统资源被协调。
4.如权利要求1所述的动态二进制重写器系统,其中
从该一个或多个客户进程分离该动态二进制重写器服务允许该动态二进制重写器服务连续地操作拍摄被管理的该客户进程的快照以及如果必要的话移除或生成新的替换。
5.如权利要求1所述的动态二进制重写器系统,其中:
该动态二进制重写器服务包括动态二进制重写器控制线程,该动态二进制重写器控制线程管理与动态二进制重写器代理的通信并协调该动态二进制重写器服务的各个方面。
6.如权利要求1所述的动态二进制重写器系统,其中:
该动态二进制重写器服务包括一个或多个工作线程,该工作线程执行区域选择操作、区域转换操作和客户进程的替换代码生成操作。
7.如权利要求1所述的动态二进制重写器系统,其中:
所述在该一个或多个客户进程中确定被频繁执行的代码包括如下指令:
用于执行代码分区的操作的指令;
用于执行仅导向计算操作的指令;
用于执行被频繁执行的代码内联操作的指令;
用于执行补丁点选择操作的指令;以及
用于执行代码精简操作的指令。
8.如权利要求7所述的动态二进制重写器系统,其中:
该发现操作利用入口匹配和记录关于指令边界和重叠代码序列的信息的位置结构来有效地检测重叠代码;以及,
当在可变长度指令架构上执行以及当调用规范中包括从不返回的调用时,产生重叠指令。
CN201080038984.2A 2009-09-02 2010-08-31 基于动态二进制重写器架构的轻量级服务 Active CN102483700B (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US12/552,740 2009-09-02
US12/552,740 US8752008B2 (en) 2009-09-02 2009-09-02 Lightweight service based dynamic binary rewriter framework
PCT/US2010/047280 WO2011028694A1 (en) 2009-09-02 2010-08-31 A lightweight service based dynamic binary rewriter framework

Publications (2)

Publication Number Publication Date
CN102483700A CN102483700A (zh) 2012-05-30
CN102483700B true CN102483700B (zh) 2016-07-06

Family

ID=42982788

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201080038984.2A Active CN102483700B (zh) 2009-09-02 2010-08-31 基于动态二进制重写器架构的轻量级服务

Country Status (7)

Country Link
US (1) US8752008B2 (zh)
EP (1) EP2473917B1 (zh)
JP (1) JP2013504124A (zh)
KR (1) KR101697719B1 (zh)
CN (1) CN102483700B (zh)
IN (1) IN2012DN01415A (zh)
WO (1) WO2011028694A1 (zh)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8510723B2 (en) * 2009-05-29 2013-08-13 University Of Maryland Binary rewriting without relocation information
US8356165B2 (en) * 2009-09-14 2013-01-15 Advanced Micro Devices, Inc. Selecting regions of hot code in a dynamic binary rewriter
JP4931978B2 (ja) * 2009-10-06 2012-05-16 インターナショナル・ビジネス・マシーンズ・コーポレーション 並列化処理方法、システム、及びプログラム
US9329846B1 (en) * 2009-11-25 2016-05-03 Parakinetics Inc. Cooperative program code transformation
US8930936B2 (en) * 2012-11-06 2015-01-06 International Business Machines Corporation Loading remote binaries onto a write-protected device
US9116816B2 (en) 2013-03-05 2015-08-25 International Business Machines Corporation Prefetching for a parent core in a multi-core chip
US9135180B2 (en) 2013-03-05 2015-09-15 International Business Machines Corporation Prefetching for multiple parent cores in a multi-core chip
US9141550B2 (en) 2013-03-05 2015-09-22 International Business Machines Corporation Specific prefetch algorithm for a chip having a parent core and a scout core
US9792120B2 (en) 2013-03-05 2017-10-17 International Business Machines Corporation Anticipated prefetching for a parent core in a multi-core chip
WO2015047295A1 (en) * 2013-09-27 2015-04-02 Hewlett-Packard Development Company, L.P. Application control flow models
JP5988444B2 (ja) 2014-02-14 2016-09-07 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation 最適化したバイナリー・モジュールをテストする方法、並びに、当該最適化したバイナリー・モジュールをテストするためのコンピュータ及びそのコンピュータ・プログラム
CN107003861B (zh) * 2014-08-29 2020-07-24 华为技术有限公司 用于编译源代码的方法
KR101889749B1 (ko) 2017-07-21 2018-09-20 주식회사 티맥스데이터 메시지 스케줄링 방법
EP3738026A4 (en) * 2018-01-09 2021-10-13 Justdo, Inc. METHODOLOGY, SYSTEM AND SOFTWARE FOR MODIFICATION OF COMPUTER PROGRAMS IN SCRIPT LANGUAGE
US10503626B2 (en) * 2018-01-29 2019-12-10 Oracle International Corporation Hybrid instrumentation framework for multicore low power processors

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1490718A (zh) * 2002-09-17 2004-04-21 国际商业机器公司 多重处理环境中透明动态优化的方法和系统

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020147969A1 (en) * 1998-10-21 2002-10-10 Richard A. Lethin Dynamic optimizing object code translator for architecture emulation and dynamic optimizing object code translation method
US6330588B1 (en) * 1998-12-21 2001-12-11 Philips Electronics North America Corporation Verification of software agents and agent activities
US6622300B1 (en) * 1999-04-21 2003-09-16 Hewlett-Packard Development Company, L.P. Dynamic optimization of computer programs using code-rewriting kernal module
US20050144602A1 (en) * 2003-12-12 2005-06-30 Tin-Fook Ngai Methods and apparatus to compile programs to use speculative parallel threads
US8037465B2 (en) * 2005-09-30 2011-10-11 Intel Corporation Thread-data affinity optimization using compiler
US20070198973A1 (en) * 2006-02-02 2007-08-23 International Business Machines Corporation Computer-implemented method, system, and program product for deployment time optimization of a distributed application
US7954094B2 (en) * 2006-03-27 2011-05-31 International Business Machines Corporation Method for improving performance of executable code
KR101137569B1 (ko) * 2006-06-27 2012-04-19 엘지전자 주식회사 디버깅 시스템 및 방법
US7752255B2 (en) * 2006-09-19 2010-07-06 The Invention Science Fund I, Inc Configuring software agent security remotely
KR101308781B1 (ko) * 2006-10-02 2013-09-17 인터내셔널 비지네스 머신즈 코포레이션 프로그램 코드 변환과 관련된 링크된 함수 호출을 동적으로 처리하는 방법 및 장치
JP2008276735A (ja) * 2007-04-03 2008-11-13 Toshiba Corp プログラムコード変換装置及びプログラムコード変換方法
US8028277B2 (en) * 2007-05-21 2011-09-27 International Business Machines Corporation Self-healing system and method for code optimization in a computing environment
JP2009237610A (ja) 2008-03-25 2009-10-15 Ntt Docomo Inc コード変換装置及びコード変換方法
US8356165B2 (en) * 2009-09-14 2013-01-15 Advanced Micro Devices, Inc. Selecting regions of hot code in a dynamic binary rewriter

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1490718A (zh) * 2002-09-17 2004-04-21 国际商业机器公司 多重处理环境中透明动态优化的方法和系统

Also Published As

Publication number Publication date
EP2473917B1 (en) 2018-08-08
CN102483700A (zh) 2012-05-30
EP2473917A1 (en) 2012-07-11
JP2013504124A (ja) 2013-02-04
KR20120063496A (ko) 2012-06-15
US8752008B2 (en) 2014-06-10
US20110055805A1 (en) 2011-03-03
WO2011028694A1 (en) 2011-03-10
IN2012DN01415A (zh) 2015-06-05
KR101697719B1 (ko) 2017-01-18

Similar Documents

Publication Publication Date Title
CN102483700B (zh) 基于动态二进制重写器架构的轻量级服务
Steele Jr Rabbit: A compiler for Scheme
US10768919B2 (en) Package installation on a host file system using a container
US7240343B2 (en) System and method for handling an exception in a program
US7890941B1 (en) Binary profile instrumentation framework
US8356165B2 (en) Selecting regions of hot code in a dynamic binary rewriter
US20130139164A1 (en) Business Process Optimization
US7698692B1 (en) Preparing a binary file for future instrumentation
US20130138473A1 (en) Business Process Optimization
US20160321048A1 (en) Information processing apparatus and compiling method
CN101765831A (zh) 数据库不一致的处理方法
CN1783013A (zh) 用于多处理系统的软件管理的高速缓存优化系统和方法
CN102243609A (zh) 一种基于嵌入式软件的测试分析方法及系统
CN103645930B (zh) 汇编级跨文件调度框架的构建方法
US7788655B2 (en) Mechanism for ordering lists of local variables associated with a plurality of code blocks
US20200117433A1 (en) Code optimization conversations for connected managed runtime environments
US20090144528A1 (en) Method for running native code across single or multi-core hybrid processor achitecture
CN103559069B (zh) 一种基于代数系统的跨文件过程间优化方法
CN112306501A (zh) 业务数据采集方法、装置、存储介质和计算设备
CN112130848B (zh) 一种面向便笺式存储器的带宽感知循环分块优化方法、编译系统、设备及存储介质
US8434076B2 (en) Efficient compilation and execution of imperative-query languages
CN110471669B (zh) 一种空指针引用的检测方法及检测装置
Schleier-Smith et al. Restream: Accelerating backtesting and stream replay with serial-equivalent parallel processing
Duan et al. The Framework and Fundamental Use of ROS
US11983516B2 (en) Method for executing code portions on execution resources

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant