首页> 中国专利> 用于程序代码转换期间的本机代码和目标代码的组合执行的方法及装置

用于程序代码转换期间的本机代码和目标代码的组合执行的方法及装置

摘要

在程序代码转换(特别是动态二进制翻译)中,主题代码(17)通过翻译器(19)被翻译为目标代码(21),以在目标处理器(13)上执行。目标代码的选定部分(例如,库函数SFuncA(172))被执行本机代码的一部分(例如本机函数NFuncA(282))所替代。本机函数对于目标处理器是本机特有的。该方法还包括执行主题代码部分(例如,主题函数SFuncB(173))以替代本机代码部分(例如,库函数NFuncB(283))。反向绑定技术以本机代码的选定部分(特别是本机库函数)替代主题代码,以在该翻译器(19)内保持控制。这有助于维持该翻译器(19)中的准确主题状态,还具有其它优点。

著录项

  • 公开/公告号CN101189578A

    专利类型发明专利

  • 公开/公告日2008-05-28

    原文格式PDF

  • 申请/专利权人 特兰斯蒂有限公司;

    申请/专利号CN200680019817.7

  • 申请日2006-05-26

  • 分类号G06F9/455(20060101);

  • 代理机构11286 北京铭硕知识产权代理有限公司;

  • 代理人郭鸿禧;韩素云

  • 地址 英国伦敦

  • 入库时间 2023-12-17 20:11:07

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2012-11-07

    授权

    授权

  • 2009-09-02

    专利申请权、专利权的转移(专利申请权的转移) 变更前: 变更后: 登记生效日:20090731 申请日:20060526

    专利申请权、专利权的转移(专利申请权的转移)

  • 2008-07-23

    实质审查的生效

    实质审查的生效

  • 2008-05-28

    公开

    公开

说明书

本发明总体上涉及计算机和计算机软件的领域,更具体地讲,涉及用于 例如转换程序代码的代码翻译器、仿真器和加速器的程序代码转换方法及装 置。

在嵌入式和非嵌入式的CPU中,存在占优势的指令集架构(ISA),有许 多软件存于其中,假设它们可容易地存取相关软件,其可被性能“加速”或 “翻译”至许多可用的处理器而表现较佳的成本/性能优势。还发现这样的占 优势的CPU架构,其被及时锁住至其ISA,且无法表现性能或符合市场需求。 这样的CPU将得益于面向软件的处理器共架构。

例如,在公布的申请WO00/22521中公开了能够促进这种加速、翻译和 共架构能力的程序代码转换方法和装置,WO00/22521的公开通过引用包含于 此。

库函数是由另一程序调用以执行特定函数的代码区段。许多计算环境提 供一种标准库函数集,例如,操作系统的一部分(“系统库”)。在其它情况中, 提供一个或多个专有库。当主题程序在主题计算环境中运行时,由于函数调 用针对这些外部主题库而建构,所以控制流通过不同单元的主题代码之间。 在一些情况下,某些主题库的本机(即,目标架构)版本在该目标架构上是可获 得的。因此,期望利用这些本机库函数,其适于替代将主题库翻译为目标代 码。在程序代码转换中本机库的使用在共同待审查申请US 10/748,317(见 WO2005/008478)已加以讨论,其公开通过引用包含于此。

发明人已确认此种本机绑定还造成不利。例如,执行控制从主题程序被 移除且转到本机代码。接着,控制后续的执行(例如,相关子库的使用)是更为 困难的。再者,可能失去实现最优化的机会。此外,仿真的主题状态可能变 得不准确。

根据本发明,提供一种在权利要求中阐述的装置和方法。本发明的优选 特征从权利要求以及说明来看是清楚的。

下面是可根据本发明实施例实行的各个方面和优点的概要。提供本发明 作为一种导引,以帮助本领域技术人员能够更快速地理解详细的设计讨论, 这些设计讨论在各方面确保,并且意图不是以任何方式限制权利要求的范围。

在本发明的一方面中,提供一种执行程序代码的方法,该方法在从可由 主题处理器执行的主题代码转换为可由目标处理器执行的目标代码期间执行 程序代码,其中,该目标代码结合可由该目标处理器本地执行的本机代码可 被执行,该方法包括:在该目标处理器上执行第一主题代码部分,作为已翻 译的目标代码;从该第一主题代码部分调用,以在该目标处理器上本地执行 本机代码部分;从该本机代码部分调用,以执行第二主题代码部分作为已翻 译的目标代码;从该第二主题代码部分的执行返回到该本机代码部分的执行; 以及从该本机代码部分的执行返回到该第一主题代码部分的执行。

在本发明的另一方面中,提供一种执行程序代码的方法,该方法在从可 由主题处理器执行的主题代码转换为可由目标处理器执行的目标代码之后执 行程序代码。在该方法中,该目标代码结合可由该目标处理器本地执行的本 机代码可被执行。该方法包括:至少提供第一、第二和第三主题代码部分, 并至少提供第一本机代码部分;从该第一主题代码部分的执行进行调用以执 行该第一本机代码部分,使得该第一本机代码部分被执行以替代该第二主题 代码部分的已翻译目标代码版本的执行;从该第一本机代码部分的执行进行 调用以执行该第三主题代码部分的目标代码已翻译版本;从该第三主题代码 部分的目标代码已翻译版本的执行返回到该第一本机代码部分的执行;以及 从该第一本机代码部分的执行返回到该第一主题代码部分的执行。

在本发明的另一方面中,提供一种程序代码执行的方法,该方法适用于 从可由主题处理器执行的主题代码转换为可由目标处理器执行的目标代码。 在该方法中,该目标代码结合可由该目标处理器本地执行的本机代码可被执 行。该方法包括:至少提供第一和第二主题代码部分,其具有相应的第一和 第二本机代码部分,其中,该第一本机代码部分包括到该第二本机代码部分 的链接;将该第一主题代码部分绑定到该第一本机代码部分,使得该第一本 机代码部分被执行以替代该第一主题代码部分的目标代码已翻译版本的执 行;以及,以到该第二主题代码部分的链接替代该第一本机代码部分中的该 链接,使得该第二主题代码部分的目标代码已翻译版本被执行以替代该第二 本机代码部分的执行。

在示例的实施例中,发明人已研发出有关加速程序代码转换的方法,这 些方法对于有关实时翻译器是特别有用的,该实时翻译器提供主题程序代码 到目标代码的动态二进制翻译。

本发明的示例实施例改进了进行程序代码转换时的性能。特别地,示例 的实施例改进了有关结合已翻译目标代码使用本机绑定代码的性能。此外, 本发明的实施例使得翻译器执行从主题代码到目标代码的程序代码转换,并 结合本机代码的一些部分有效地执行目标代码。

本发明还延伸到翻译器装置,其具有被配置为执行在此限定的任何一种 方法的翻译器单元。另外,本发明延伸到计算机可读存储介质,其上记录可 由计算机执行以实现在此限定的任何一种方法的指令。

包括在说明书中并组成说明书的一部分的附图示出了当前的优选实施方 式,这些附图如下:

图1是示出应用了本发明实施例的装置的框图;

图2是示出在程序代码转换期间执行控制的示例方法的示意性流程图;

图3是示例翻译器中的示例主题程序的示意性表示;

图4是显示使用本机绑定的示例实施例的操作流程的示意性框图;

图5是示例的反向绑定函数的示意性表示;

图6是包括本机绑定函数和反向绑定主题函数的程序代码的示例;

图7是目标处理器中的存储器的示例布置;

图8显示本机绑定和反向绑定的第一示例机制;

图9显示本机绑定和反向绑定的另一示例机制;以及

图10显示用于在程序代码转换的翻译器中的上下文再使用的示例机制。

提供以下描述以使本领域技术人员能够实现并使用本发明,并且该描述 提出由发明人实施其发明所建立的最佳方式。然而,由于本发明的一般原理 在此已明确地限定以提供一种改善程序代码转换的方法与装置,因此对于本 领域技术人员来说,各种修改仍是明显可见。

以下的技术用语中,主题程序在包括主题处理器的主题计算平台上执行。 包括目标处理器的目标计算平台用于通过执行动态程序代码转换的翻译器来 执行主题程序。翻译器执行从主题代码至目标代码的代码转换,使得目标代 码在目标计算平台上可执行。

图1示出了示例的目标计算平台14,其包括目标处理器13,目标处理器 13包括目标寄存器15和存储多个软件组件17、19、20、21、22、27和28 的存储器18。这些软件组件包括将被翻译的主题代码17、操作系统20、翻 译器代码19、已翻译代码(目标代码)21、抽象寄存器组(bank)27、本机绑定机 制22,以及本机代码28。

由主题代码17的运行时翻译所产生的“目标代码”21以及直接针对目 标架构所编译的“本机代码”28之间存在区别。由目标操作系统20所提供 的系统目标库是本机代码28的一个示例。相反,主题系统库的翻译是目标码 21的一个示例。本机代码28是产生于翻译器19外部。这意味着翻译器19 并不产生本机代码28。而且,翻译器19并不具有最优化本机代码28的机会。

在一个实施例中,翻译器代码19是仿真器,该仿真器以最优化或非最优 化方式将主题指令集架构(ISA)的主题代码翻译为另一ISA的已翻译目标代 码。在另一实施例中,翻译器19用作加速器,该加速器通过执行程序代码最 优化以将主题代码翻译为每个相同ISA的目标代码。

一般而言,目标计算平台14是一种翻译器装置,其包括(特别是)翻译器 单元19。在示例的实施例中,翻译器19是实施该翻译器的源代码的编译版 本。翻译器19以及由翻译器19所产生的已翻译代码21结合目标处理器13(通 常为微处理器或其它合适的计算机)上的操作系统20而运行。应理解的是, 图1中所述的结构仅为示例,例如,本发明的实施例可以在驻留在操作系统 之内或之下的代码中实施。主题代码17、编译器代码19、操作系统20以及 存储器18的存储结构可以是本领域技术人员所知悉的广泛种类的任何类型。

在根据图1的装置中,当运行目标代码21时,程序代码转换最好在运行 时动态地执行。翻译器19与已翻译程序21内联运行。翻译器19最好用作针 对目标架构编译的应用程序。主题程序17在运行时由翻译器19翻译,以在 目标架构14上执行。翻译器19还转换由主题程序17进行的主题操作系统(OS) 调用,从而当转到目标OS 20时,使得它们正确地运行。

通过翻译器19运行主题程序17包括二种不同类型且以交错方式执行的 代码:翻译器代码19以及目标代码21。翻译器代码19在运行时之前基于翻 译器19的高级源代码实施而由例如编译器产生。相反,目标代码21在整个 运行时基于正被翻译的程序的已存储的主题代码17由翻译器代码19产生。

主题程序17意图在主题处理器(未示出)上运行。在一个实施例中,翻译 器19用作仿真器。换言之,翻译器19仿真该主题处理器,而实际上在目标 处理器13上执行主题程序17作为目标代码21。

在示例的实施例中,提供至少一个全局寄存器存储27(也称为主题寄存 器组27或抽象寄存器组27)。在多处理器的环境中,根据主题处理器的架构, 可选地提供多于一个的抽象寄存器组27。主题处理器状态的表示由主题代码 21和翻译器19的组件所提供。换言之,翻译器19将主题处理器状态(例如: 变量和/或对象)存储在各种显式编程语言装置中。用于编译翻译器19的编译 器确定该状态和操作如何在翻译器代码中实施。比较而言,目标代码21隐式 地提供目标寄存器15和存储器位置18(由目标代码21的目标指令所控制)中 的主题处理器状态。例如,全局寄存器存储27的低级别表示仅仅是已分配的 存储器的区域。然而,在翻译器19的源代码中,全局寄存器存储27是可被 较高级地存取和控制的数据数组或对象。

图2是示出在程序代码转换期间执行控制的示例方法的示意性流程图。

如图2所示,控制初始存在于翻译器控制循环190中。在步骤201,控 制循环190调用翻译器19的代码产生函数192,该代码产生函数192将主题 代码17的区块(block)翻译为已翻译代码21的相应区块。接着,在步骤202, 已翻译目标代码21的区块在目标处理器13上执行。方便地,已翻译目标代 码21的每个区块的末端含有指令,以将控制返回至控制循环201。换言之, 翻译和执行主题代码的步骤是交错的,使得部分主题程序17被翻译且接着依 次被执行。

这里,术语“基本区块”对于本领域技术人员是熟知的。基本区块是具 有精确的一个入口点和精确的一个出口点(其将代码的区块限制为单一控制 路径)的代码区段。为此,基本区块是有用的控制流的基本单元。翻译器19 将主题代码17适当地分为多个基本区块,其中每个基本区块是单个入口点处 的第一指令以及单个出口点处的最后指令(例如,跳跃、调用或分支指令)之间 的序次的一组指令。翻译器可仅选择这些基本区块中的一个区块(区块模式), 或选择一组基本区块(群组区块模式)。一组区块适当地包括两个或多个基本区 块(被一起处理为单个单元)。此外,翻译器可形成表示主题代码的相同基本区 块但在不同入口条件下的等区块(iso-block)。

在示例的实施例中,中间表示(IR)树基于主题指令序列而产生,作为从 原始主题程序17产生目标代码21的部分过程。IR树是由主题程序所计算的 表达式和所执行的操作的抽象表示。之后,目标代码21基于IR树而产生。 IR节点的集合实际上是有向无环图(DAG),但俗称为“树”。

如本领域技术人员可理解的,在一个实施例中,翻译器19使用面向对象 的编程语言(例如:C++)来实现。例如,IR节点被实现为C++对象,对于其 它节点的参照被实现为对应于这些其它节点的C++对象的C++引用。因此, IR树被实现为含有各种彼此引用的IR节点对象的集合。

此外,在讨论中的实施例中,IR产生使用与主题架构(主题程序17将在 其上运行)的指定特性相应的一组抽象寄存器定义。例如,针对主题架构上的 各个物理寄存器(“主题寄存器”),有独特的抽象寄存器定义。这样,翻译器 中的抽象寄存器定义可以被实现为C++对象,其含有对于IR节点对象(即, IR树)的引用。由该组抽象寄存器定义所引用的所有IR树的集合体被称为工 作IR森林(forest)(称为“森林”是因为它含有多个抽象寄存器根,每个根指 的是IR树)。这些IR树及其它过程适当地形成翻译器代码产生函数192的一 部分。

本机绑定

图3是示意性实施例,其显示将通过翻译器19执行的主题程序17的多 个编译单元171、172和173。在该示例中,可执行的主要主题171调用第一 库170a中的函数SFuncA 172。该第一主题函数SFuncA的执行依次调用第二 库170b中的第二主题函数SFuncB 173。图3中的箭头表示主题程序的这些 不同单元之间的控制流。例如,第一库170a是专有库,而第二库170b是系 统库,反之亦然。

尽管在图3中已经显示了库以供说明,但是主题代码单元171、172和 173可以是任何主题代码的合适部分。当未使用本机绑定时,主题程序17的 单元171、172和173各自被翻译为目标代码21并在翻译器19的控制下执行。

图4示出了在本发明的示例的实施例中使用的本机绑定机制。这里,翻 译器19使用本机绑定,以本机系统库280a中对等效函数的调用来替代主题 程序17中对主题系统库函数172的调用。换言之,主题程序171实际上反而 调用本机绑定代码28的区段。主题程序171的已翻译目标代码版本含有对本 机绑定代码28的调用。在这种情况下,该调用被绑定到第一本机库280a中 的第一本机函数NFuncA 282。

亦如图4所示,在该示意性的示例中,第一本机函数NFuncA 282依次 调用第二本机库(即子库)中的第二本机函数NFuncB 283。换言之,一般预期 的执行顺序用于本机绑定代码的第二区段283的执行,以紧随本机绑定代码 的第一区段282的执行。

在示例的MIPS-x86翻译中,x86系统目标库“libc”可定义高级 memcpy()(存储器复制)例程,其利用SSE2矢量操作来执行相当快速的字节复 制。通过使用本机绑定机制22,对MIPS主题代码中的memcpy的所有调用 被绑定到本机的memcpy()。这消除了翻译memcpy()函数的主题(MIPS)版本 的成本。此外,memcpy()函数的本机(x86)版本具有较好的目标硬件的复杂的 感知力,因此以最具效率的方式提供来实现函数的期望效果。

当检测到主题程序的控制流进入主题代码17(例如主题库,其中存在主 题代码的本机版本)的区段时,由翻译器19实现本机绑定。翻译器19执行等 效本机码28,而不是翻译主题代码17。

除了目标系统库调用外,本机绑定可用于更多的任意码取代,例如,取 代非库函数的本机编译版本。此外,通过以替代的本机函数(其实现与对主题 系统函数的调用相同的功能,或作为在目标系统调用周围的调用存根(stub)) 取代对主题系统函数的调用,本机绑定可用于在目标架构上实施主题系统调 用。本机绑定也可在超出函数调用点以外的任意主题代码位置上应用,以允 许任意码序列(目标代码或本机代码)和/或函数调用在主题程序中的任何限定 明确的点上被插入或取代。

本机绑定机制22允许翻译器19将特定主题代码17函数与其本机代码 28对应物彼此关联,使得翻译器19获知哪个主题函数进行绑定以及哪个本 机函数将其绑定。翻译器19可依据本机绑定机制22的实施方式而以不同方 式来获得该函数映射信息。如共同待审查申请US 10/748,317和 WO2005/008478中所讨论的,执行本机绑定的特定机制包括绑定点、运行时 符号修补以及S调用。

本机绑定使已翻译主题代码直接地执行代码单元的本机(即,目标架构) 版本,而不是翻译和执行等效主题代码,例如,库的本机版本。这避免了翻 译这些库的主题版本的开销。此外,因为本机版本可利用目标架构的架构特 性(其是主题版本未察觉的),所以本机版本可以是相同功能的更有效实施。

尽管本机绑定带来一些优点,但是也存在限制。特别地,本机代码28 并非在翻译器19的直接控制之下。

执行本机代码28不更新由翻译器19所保持的主题状态。例如,本机代 码28不更新抽象寄存器组27。此外,本机代码不考虑由翻译器19控制的仿 真的主题存储器分配,例如,栈和堆存储器分配。

本机代码可调用至一个或多个级别中的一个或多个子库。翻译器19不能 通过本机代码282控制子库的使用。实际上,通过执行控制远离翻译器19的 多个级别,子库有时是一百个级别深的等级。

翻译器19不能执行针对本机代码28的最优化。例如,翻译器19能够最 优化本机代码库中的代码,但该机会由于不在翻译器19控制之下执行本机代 码28而丧失。

还存在关于参数变换的限制。例如,存在一些限制,诸如有关浮点精度, 其中主题程序17、翻译器19和本机代码28并非都共享相等的浮点精度。

本发明的示例实施例提供用于本机绑定的上下文的改进机制,其解决这 些和其它缺点。

反向绑定

图5示出在本发明示例实施例中使用的反向绑定技术。

如图5所示,翻译器19通过本机代码28的执行而被部分地调用,并且 主题代码17的一部分被执行。控制流接着返回至已绑定的本机代码28。图5 的反向绑定技术为混合型。换言之,主题代码17的一部分(通过翻译器19) 被执行并在部分本机代码28之间交错。特别地,翻译器19被调用以执行主 题代码17的一部分,以替代执行本机代码28的预期下一个部分,或是除了 执行本机代码28的预期下一个部分以外,还执行主题代码17的一部分。

在图5示出的示例中,在步骤①,主要的主题程序171对第一本机函数 NFuncA 282进行调用,第一本机函数NFuncA 282被执行以作为本机绑定代 码。接着,在步骤②,主题代码函数SFuncB 173通过翻译器19被执行为目 标代码,以取代第二本机函数NFuncB 283。在步骤③,控制返回至本机代码 28,以完成NFuncA 282的执行。最后,在步骤④,控制返回至主要的可执行 主题171。

图6显示程序代码的示例区段,以说明反向绑定是特别有帮助的实际情 况。

在该示例中,functionA 171是被翻译和执行为目标代码的主题代码。翻 译器19本机绑定至函数“getSomeInfo”282的本机代码版本,其被执行为本 机代码。该本机函数“getSomeInfo”包括对“malloc”函数的调用,“malloc” 函数分配存储器区域,以便“getSomeInfo”函数运行。然而,该存储器分配 恰好由该主题代码中的functionA释放。执行malloc函数的本机版本导致存 储器泄漏和潜在缺陷。换言之,在主题代码和本机代码的执行之间发生了保 持存储器分配一致性的问题。

如图6所示,在此示例中,存在从本机代码函数“getSomeInfo”282到 “malloc”函数173的主题代码版本的反向绑定。在本机函数“getSomeInfo” 282的执行期间,对“malloc”函数的调用导致翻译器19被调用。翻译器19 将主题“malloc”函数173翻译为目标代码。在由翻译器19所保持的仿真主 题状态中,“malloc”和“free”此时被正确地配对。执行主题“malloc”函数 173的结果返回至本机“getSomeInfo”函数282,以分配表示aBuffer的存储 器。

为了说明起见,图6的示例已被简化。反向绑定最好发生在本机绑定码 中的多个不同点上,并且可发生在多个不同子级别上。

在特定的示例实施例中,通过由对主题代码17的反向绑定部分的链接替 代绑定本机代码28中的链接来应用反向绑定。

图7示出用于执行反向绑定的示例存储器再寻址机制。图7是目标处理 器13的存储器18的示意性表示,该存储器18存储本机代码区段282、283 以及主题代码区段173等。在这种情况下,如同图5,在第一本机库NLibA 280a 和第二本机库NLibB 280b中分别提供本机函数NFuncA 282和NFuncB 283。 因此,第一本机库NLibA 280a依赖于第二本机库NLibB 280b,并且NLibB 是NLibA的从属。在另一实施例中,在单个库中设置第一函数NFuncA 282 和第二函数NFuncB 283,但NFuncB仍是NFuncA的从属。

此外,图7显示了已由翻译器19从主题代码173产生的目标代码213。 目标代码213可在目标处理器13上执行,以替代主题代码173。

当需要时,目标架构通常将通过例如动态链接程序将本机库280a以及任 何从属(例如,库280b)加载到存储器18。但是,在本发明的示例实施例中, 当初始化翻译器19时,将本机库280a(及其从属280b)加载到存储器18。尽 管这消耗较多存储器,但好处在于本机库280a、280b能被翻译器19立即运 用。

在一个示例中,第一本机库(NLibA 280a)中的依赖性和符号被解析,并 且第一本机库280a中的链接被替代为主题库173中的函数的链接,以成为反 向绑定主题函数。在图7中,用对_reverse_NFuncB的调用来替代从NFuncA 282中对NFuncB的调用。此替代调用以本机函数库282中的调用存根来适当 地插入。反向调用存根此时通向主题函数SFuncB 173,其由翻译器19翻译 并以TFuncB 213被执行为目标代码。

现在将详细描述用于实施本机绑定和反向绑定的示例机制。

反向绑定点

在一个实施例中,使用专用的“反向绑定点”描述语言来识别将被绑定 的本机函数。反向绑定点描述包括:(a)将被反向绑定的本机函数;以及(b)相 应的反向绑定主题函数。在执行的开始,翻译器19读取反向绑定点描述以识 别反向绑定点(从本机代码调用主题函数的位置)。

在本机库的初始化期间,当翻译器19遇到这些反向绑定点时,翻译器 19在本机代码28中插入对适当的主题函数的调用存根。

在一个实施例中,特定的反向绑定点描述嵌入到翻译器19中。在另一实 施例中,反向绑定点描述存储在翻译器19运行时读取的单独文件中,因此允 许终端用户通过添加特定的本机对主题函数的映射来控制反向绑定机制22。 修改的本机库

在另一实施例中,本机库的特定翻译器版本被预先创建,当编译时该版 本具有反向绑定点,例如,嵌入到其中的反向调用存根。

参数变换

当调用本机函数时,翻译器19遵守目标架构的本机调用协定。通过比较, 在整个目标代码21中,只要翻译器19遵从一些一致性调用协定,目标代码 21就不必要遵从目标架构调用协定。因此,当执行本机代码28时,可应用 第一调用协定,并且当执行目标代码21时,可应用第二调用协定。在这种情 况下,当在本机代码28和目标代码21之间移动时,可实施调用协定切换, 或反之亦然。

此外,翻译器19可能需要执行目标机器状态(如本机代码28所表示)和 主题机器状态(如目标代码21所表示)之间的数据变换,上述两种状态都用于 反向绑定主题函数173的输入参数和返回值(如果有的话)。这种数据变换的示 例可包括:(i)字节序(endian)转换(即,字节交换);(ii)数据结构对准;(iii)主题 地址和目标地址之间的转换;以及(iv)值变换(例如,常数转换或值缩放)。

例如,在MIPS架构上,函数参数被传送到寄存器中,而在x86架构上, 参数被传送到栈上。为了使MIPS-x86翻译器调用本机函数,x86调用协定需 要将函数参数从主题寄存器组27移动到该栈。相反,对主题MIPS函数的反 向绑定需要将函数参数从该栈移动到主题寄存器组27。

调用存根

调用反向绑定主题函数173包含几个步骤,包括:参数设置、输入参数 变换、函数调用以及结果变换。

参数设置指的是用于计算函数调用参数的值的代码。本机代码28方便地 计算参数值而不考虑函数是被调用作为本机函数283还是作为反向绑定主题 函数173。

输入参数变换将函数调用参数值从其本机代码28表示组织化为主题函 数173预期的格式和位置。

函数调用是以遵守应用于翻译器19中的调用协定的方式对反向绑定主 题函数173的实际函数调用,并且包括(已重新格式化的)参数组织化为函数原 型所需的顺序。函数原型指示函数的参数的顺序和类型以及函数的返回值的 类型。例如,如果由翻译器应用的调用协定需要将自变量传送到栈上,则调 用反向绑定主题函数的代码以正确顺序将自变量放置到主题栈上,并使主题 栈指针相应移动。

结果变换对主题函数的返回值(如果有的话)进行转换。反向绑定主题函 数173将以与主题架构一致的格式返回值,翻译器19将该值转换为由本机代 码28所使用的表示。

“参数变换”指的是不同数据格式之间的所有各种转换以及目标代码21 和本机代码28的调用转换。执行参数变换的代码称为“调用存根”,其包括 基本函数调用周围的最小包装(wrapper),其目的在于允许本机代码调用者282 和主题代码被调用者173相互作用。因此,单个“调用存根”可以被分为本 机代码28和目标代码21成份。参数变换是否整体地发生在目标代码21中或 本机代码28中依赖于反向绑定的实施。

本机代码反向调用存根

图8显示使用在本机代码中实行的调用存根281、285的示例实施方式。 当进行从主题代码171到本机绑定函数282的调用时,使用本机代码调用存 根281。相反,当进行从绑定本机函数A到反向绑定主题函数B 173的调用 时,使用本机代码反向调用存根285。在绑定本机代码282内,翻译器19用 对反向调用存根285的调用取代对本机库函数的调用(例如,如图7所示的从 属库283)。这里,反向调用存根285(预先)写入到本机代码中。每个反向调用 存根285执行上述参数变换,并且调用反向绑定主题函数173。

在一个实施例中,通过限定均匀反向调用存根函数接口而便于进行参数 变换。均匀调用存根函数接口限定所有反向调用存根的固定函数签名和相应 的数据类型,这允许翻译器19配置反向调用存根281而不需参照基本主题函 数173的函数签名(原型)。这允许反向调用存根285可使用高级编程语言(例 如C或C++)而实施,其使得本机绑定和反向绑定机制更容易被翻译器19的 终端用户理解。

在另一实施例中,参数变换通过限定双向均匀调用存根函数接口而便于 进行。该调用存根函数接口限定所有本机绑定函数调用211以及所有反向绑 定函数调用282的固定函数签名。因此,本机绑定和反向绑定机制更容易被 翻译器19的终端用户理解。

目标代码调用存根

图9显示使用目标代码调用存根211和目标代码反向调用存根215的另 一示例实施方式。这里,本机绑定和反向绑定的参数变换在目标代码21中整 体地执行。在该实施例中,翻译器19在译码时检测来自主题代码171的本机 绑定调用,并且将参数变换编码为IR树(其被最终产生为目标代码)。通过表 示参数变换和IR中的本机函数原型的细节,调用存根代码211变为合并到主 题代码(即,调用存根的IR和主题代码的IR是可区别的)。这允许翻译器将最 优化(例如,群组区块)应用于参数变换代码。相比之下,在本机代码中执行的 参数变换,例如,在本机代码调用存根211中所执行的主题寄存器到函数参 数的映射(如上所述),存在于翻译器19外部,并且不能被容易地最优化。类 似地,在目标代码中也提供反向调用存根215,并且最优化在翻译器19内实 现。

本机代码调用存根281、285以及目标代码调用存根和211、215按照相 似的成对方式被适当地执行,然而,也可按照混合的成对方式执行。换言之, 本机代码调用存根281与目标代码反向调用存根285一起使用,或反之亦然。

如上所述,本发明的示例实施例主要涉及以本机函数来替代主题函数(本 机绑定),反之亦然(反向绑定)。然而,本发明的实施例还扩展至任意替代和 添加。特别地,通过将额外反向绑定主题函数调用配置到本机代码例程来适 当地实施反向绑定。这里,额外主题函数调用将执行控制临时地返回到翻译 器19。举一示例而言,翻译器可接着执行代码,以便于在将控制返回到本机 代码之前更新仿真的主题状态。举另一示例而言,翻译器可应用特性描述 (profiling),以在主题程序中的特定点上在调用本机绑定代码或已翻译主题代 码之间动态地进行选择。

上下文再使用

图10示出本发明示例实施例的另一方面。

图10是上下文线程(thread)214的示意性表示。上下文线程214是一种数 据结构,其容纳不同集合的数据,并允许翻译器19在多线程的程序上操作。 该示例的数据结构容纳(尤其是)抽象寄存器组27的当前值、仿真主题栈的位 置、仿真主题栈的尺寸、线程标识符以及与主题线程的翻译有关的特定翻译 器信息。

针对多线程程序中的每个线程,产生新的上下文线程。此外,上下文线 程用于每个反向绑定主题函数173。换言之,每当遇到反向绑定函数173时, 翻译器19提供上下文线程214作为执行该线程的环境。

不幸地,存在与每个上下文线程的产生有关的开销。特别地,需要保留 用于上下文线程的空间并接着以适当值来构成该数据结构的工作。新的上下 文线程的产生是相当昂贵的。

在本发明的示例实施例中,单个上下文线程在多个反向绑定主题函数之 间被共享。最好是,创建单个上下文线程数据结构214a,并接着用于第一反 向绑定主题函数173a,如图10所示。当主题函数173a完成时,上下文线程 214a被存储并不被丢弃。该数据结构保留在存储器18中。

如图10所示,当遇到第二反向绑定主题函数173b时,所存储的主题上 下文被取回并被再使用。这里,所存储的上下文线程214a被取回并成为用于 第二反向绑定主题函数173b的上下文线程214b。该过程随着上下文线程214b 被存储并被再使用作为用于第三反向绑定主题函数173c的上下文线程214c 而重复。

每当上下文线程被再使用时,用对于相应主题函数173b、173c合适的值 来重新构成上下文线程。然而,该重新构成相比于产生全新的上下文线程而 言是不太昂贵的。因此,翻译器19中的开销显著地减低。

以上所述的示例实施例具有许多优点。例如,即使当执行本机代码28 时,翻译器也能够通过将本机代码的区段反向绑定回至翻译器中的主题代码, 来保留执行控制的量度。此外,执行反向绑定主题代码更新由翻译器19所保 持的主题状态,例如,抽象寄存器组27。另外,执行反向绑定主题代码允许 翻译器更新仿真主题存储器分配,例如栈和堆存储器分配。翻译器能够通过 适当地布置反向绑定,来控制绑定本机代码中的子库的使用。级别控制被启 用,并且翻译器能够执行最优化。例如,通过避免未与主题代码共享相等的 浮点数精度的本机代码函数,来改善参数显示。

虽然已示出并描述了一些优选实施例,但本领域的技术人员应理解,在 不脱离权利要求限定的本发明的范围的情况下,可进行各种变化和修改。

应注意与本申请相关的与本说明书共同提交或在本说明书之前提交以及 与本说明书公布于公开审查的所有文章和文档,并且所有这些文章和文档的 内容通过引用包含于此。

本说明书(包括任何权利要求、摘要和附图)所公开的所有特征和/或所公 开的任何方法或过程中的所有步骤都可以按照任何组合方式组合,除了至少 某些特征和/或步骤是相互排斥的组合以外。

本说明书(包括任何权利要求、摘要和附图)所公开的各个特征可由提供 相同、等效或相似目的的可选特征取代,除非明确地表明其不适用。因此, 除非明确地表明其不适用,所公开的各个特性仅仅是一系列等效或相似特征 中的一个示例。

本发明并不限于前述实施例的细节,本发明可延伸至本说明书(包括任何 权利要求、摘要和附图)所公开的特征中的任一新颖部分或任何新颖的组合, 或是延伸至所公开的任何方法或过程中的步骤的任一新颖部分或任何新颖的 组合。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号