CN116932044A - 一种指令翻译方法及其相关设备 - Google Patents

一种指令翻译方法及其相关设备 Download PDF

Info

Publication number
CN116932044A
CN116932044A CN202210346585.7A CN202210346585A CN116932044A CN 116932044 A CN116932044 A CN 116932044A CN 202210346585 A CN202210346585 A CN 202210346585A CN 116932044 A CN116932044 A CN 116932044A
Authority
CN
China
Prior art keywords
address
instruction
mapping result
result
stack space
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.)
Pending
Application number
CN202210346585.7A
Other languages
English (en)
Inventor
刘先喆
曾建江
吕研冬
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.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
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 Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN202210346585.7A priority Critical patent/CN116932044A/zh
Priority to PCT/CN2023/084280 priority patent/WO2023185799A1/zh
Publication of CN116932044A publication Critical patent/CN116932044A/zh
Pending legal-status Critical Current

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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/3017Runtime instruction translation, e.g. macros
    • G06F9/30174Runtime instruction translation, e.g. macros for non-native instruction set, e.g. Javabyte, legacy code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/52Binary to binary
    • 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/30Arrangements for executing machine instructions, e.g. instruction decode

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

本申请实施例公开了一种指令翻译方法,方法包括:获取函数调用指令的返回指令;根据返回指令中指示的第二地址,获取第一地址映射结果,将第一地址映射结果存储至运行栈空间;获取返回指令的第二翻译结果,第二翻译结果为返回指令的二进制翻译结果,第二翻译结果指示从目标位置处获取并执行第一地址映射结果指示的指令。本申请复用了源程序的运行栈空间,节省了存储空间,且不需要每次翻译返回指令时都需要对返回指令的地址进行校验,降低了翻译时的开销,增加了程序运行的效率。

Description

一种指令翻译方法及其相关设备
技术领域
本申请涉及计算机领域,尤其涉及一种指令翻译方法及其相关设备。
背景技术
二进制翻译(dynamic binary translation)是一种在二进制层面通过对软件在运行时或者运行前进行修改和监控的方式来增加软件的可移植性和适应性的技术。以动态二进制翻译为例,使用该技术的软件称为动态二进制翻译器(dynamic binarytranslator,DBT)。动态二进制翻译技术分离了软件对硬件的依赖,使得源软件(sourcesoftware)不再直接运行在硬件之上,而是运行在动态二进制翻译器上,通过这种方式使得源软件得以在目标机器(target machine)上运行。
间接跳转指令是一类跳转指令,由于间接跳转指令的目标地址只有在运行时可知,且每次执行时该值都有可能不同,导致对间接跳转指令进行翻译时无法得到源机器码地址(source program counter,SPC)对应的翻译码地址(target program counter,TPC),为了解决这一问题,动态二进制翻译器引入查找表(Lookup table)结构,将每个源机器码地址与对应的翻译码地址存入查找表中,当执行间接跳转指令时会通从寄存器或内存中得到SPC,然后以SPC为索引查找对应的TPC。在一个典型的应用程序中,函数返回指令为一种间接跳转指令,由于同一个函数会被多个不同的地方调用,因此函数返回时必须使用间接跳转来返回到它被调用的地方继续执行。
在对返回指令进行动态二进制翻译时,若每次执行函数返回时都要访问查找表结构,导致频繁产生上下文切换(context switch),性能损失较大。
发明内容
本申请提供了一种指令翻译方法,一方面不需要使用独立数据结构来保存返回指令的源机器码地址和翻译码地址之间的映射关系,节省了存储空间,且由于运行栈空间对于返回指令的更改是可以感知的,不需要每次翻译返回指令时都需要对返回指令的地址进行校验,降低了翻译时的开销。
第一方面,本申请提供了一种指令翻译方法,所述方法应用于代码的翻译,例如可以应用于代码的二进制翻译其他需要兼容不同运行条件的代码翻译场景中,例如可以应用于代码的动态二进制翻译、静态二进制翻译或者动静态相结合的二进制翻译。其中,所谓动态二进制翻译,可以理解为当执行应用程序时(即,在运行时),在运行中执行二进制翻译。相对的,静态二进制翻译则可以为离线执行二进制翻译,例如在运行应用程序前执行的二进制翻译。
所述方法包括:获取函数调用指令的返回指令,其中,所述函数调用指令用于指示调用第一地址指示的指令,所述返回指令用于指示根据所述函数调用指令执行完所述第一地址指示的指令后执行第二地址指示的指令;根据所述第二地址,获取第一地址映射(address mapping)结果,所述第一地址映射结果是所述第二地址的映射结果;将所述第一地址映射结果存储至运行栈空间;根据所述返回指令,获取所述返回指令的第一翻译结果,所述第一翻译结果为所述返回指令的翻译结果,所述第一翻译结果指示从所述运行栈空间获取并执行所述第一地址映射结果指示的指令。
在一种可能的实现中,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
目前现有的函数返回地址优化方案中,通过使用独立数据结构来保存返回指令的SPC和TPC之间的映射关系,需要额外的存储空间,且在返回指令被更改的情况下,由于保存返回指令的SPC和TPC之间的映射关系的独立数据结构并不感知,因此每次翻译返回指令(无论返回指令是否被更改)时都需要对返回指令的SPC进行校验,增加了翻译时的开销。本申请实施例中,复用了源程序的运行栈空间,例如,将栈空间上原本用于存放返回指令地址的空间(例如SPC)来存放第一地址映射结果(例如TPC),一方面不需要使用独立数据结构来保存返回指令的SPC和TPC之间的映射关系,节省了存储空间,且由于运行栈空间对于返回指令的更改是可以感知的,不需要每次翻译返回指令时都需要对返回指令的SPC进行校验,降低了翻译时的开销,增加了程序运行的效率。
在一种可能的实现中,在得到第一地址映射结果后,可以生成并执行存储指令,该存储指令可以指示将第一地址映射结果(例如TPC)存储到源软件程序的运行栈空间中的返回指令的地址空间。
在一种可能的实现中,所述将所述第一地址映射结果存储至运行栈空间,包括:将所述第一地址映射结果存储至运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
在一种可能的实现中,所述将所述第一地址映射结果存储至运行栈空间,包括:将所述第一地址映射结果替换运行栈空间的目标位置中的第二地址,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
在一种可能的实现中,当翻译函数调用指令时,可以通过固定偏移计算出源软件中函数调用指令后一条指令的地址(例如本申请实施例中的第二地址)的第一地址映射结果。例如,第一地址映射结果可以包括第二地址的TPC。
在一种可能的实现中,所述方法还包括:根据所述函数调用指令,获取第二翻译结果,所述第二翻译结果为所述函数调用指令的翻译结果。
在一种可能的实现中,所述函数调用指令包括所述第一地址的SPC,所述第二翻译结果包括所述第一地址的TPC。
在一种可能的实现中,在将所述第一地址映射结果存储至运行栈空间后,所述方法还包括:基于对所述第二地址的访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
在一种可能的实现中,在翻译代码块运行时可能需要访问源软件函数的返回指令的地址(可以简称为返回地址,例如本申请中的第二地址),例如加载libunwind库,具体需要从运行栈空间的返回地址的空间中获取返回指令的地址的SPC,由于本申请实施例中运行栈空间的返回地址的空间存储的是返回指令的地址的地址映射结果(也就是第一地址映射结果,例如返回指令的地址的TPC),因此,需要进行返回指令的地址的恢复。在一种可能的实现中,在所述获取第一翻译结果之后,响应于对所述第二地址的访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址,例如可以将返回指令的TPC替换为返回指令的SPC。
在一种可能的实现中,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址,具体包括:将所述运行栈空间中目标位置的所述第一地址映射结果替换为所述第二地址。
在一种可能的实现中,返回指令的地址可以被修改,在这种情况下,运行栈空间中目标位置存储的第一地址映射结果是不准确的翻译结果(TPC),为了能够获取到准确的翻译结果(TPC),则需要获取到修改后的所述返回指令的地址(修改后的所述第二地址,例如修改后的SPC),并根据修改后的所述返回指令的地址,获取第二地址映射结果,所述第二地址映射结果为修改后的所述第二地址的映射结果,并执行所述第二地址映射结果指示的指令且不执行所述第一映射结果。
在一种可能的实现中,所述根据修改后的所述第二地址,获取所述第二地址的第二地址映射结果,包括:对修改后的所述第二地址进行地址映射,得到所述第二地址映射结果。
在一种可能的实现中,所述根据修改后的所述第二地址,获取所述第二地址的第二地址映射结果,包括:根据修改后的所述第二地址,从映射关系(例如预设的SPC到TPC映射关系)中获取所述修改后的所述第二地址对应的第二地址映射结果;或者,对所述修改后的所述第二地址进行地址映射,得到所述第二地址映射结果(例如在预设的SPC到TPC映射关系中未找到修改后的SPC,则可以重新对修改后的SPC进行地址映射)。
本申请实施例中,只有当程序修改函数返回指令的地址而产生异常时,才通过异常处理过程得到准确的翻译结果(例如TPC),使程序正确运行(而无需每次都进行校验过程),既保证了完备性的同时也兼顾了程序的运行效率。
第二方面,本申请提供了一种地址恢复方法,所述方法包括:获取访问请求;其中,所述访问请求指示从运行栈空间中访问第二地址,所述第二地址属于返回指令,所述返回指令用于指示执行所述第二地址指示的指令;且所述第二地址的第一地址映射结果被存储至运行栈空间,所述第一地址映射结果是所述第二地址的映射结果;基于所述访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
在一种可能的实现中,在翻译代码块运行时可能需要访问源软件函数的返回指令的地址(可以简称为返回地址,例如本申请中的第二地址),例如加载libunwind库,具体需要从运行栈空间的返回地址的空间中获取返回指令的地址的SPC,由于本申请实施例中运行栈空间的返回地址的空间存储的是返回指令的地址的地址映射结果(也就是第一地址映射结果,例如返回指令的地址的TPC),因此,需要进行返回指令的地址的恢复。在一种可能的实现中,在所述获取第一翻译结果之后,响应于对所述第二地址的访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址,例如可以将返回指令的TPC替换为返回指令的SPC。
在一种可能的实现中,所述第二地址的第一地址映射结果保存在所述运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
在一种可能的实现中,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
在一种可能的实现中,所述方法还包括:在所述将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址之前,所述方法还包括:生成映射关系,所述映射关系包括源机器码地址和翻译码地址之间的对应关系;从所述映射关系中获取所述第一地址映射结果对应的所述第二地址。
本申请实施例中,相比于实时维护源机器码地址和翻译码地址之间的对应关系,可以在存在对源机器码地址的访问需求时才生成源机器码地址和翻译码地址之间的对应关系,可以降低存储资源的占用。
第三方面,本申请提供了一种指令翻译装置,所述装置包括:
获取模块,用于获取函数调用指令的返回指令,其中,所述函数调用指令用于指示调用第一地址指示的指令,所述返回指令用于指示根据所述函数调用指令执行完所述第一地址指示的指令后执行第二地址指示的指令;
根据所述第二地址,获取第一地址映射结果,所述第一地址映射结果是所述第二地址的映射结果;
存储模块,用于将所述第一地址映射结果存储至运行栈空间;
所述获取模块,还用于根据所述返回指令,获取所述返回指令的第一翻译结果,所述第一翻译结果为所述返回指令的翻译结果,所述第一翻译结果指示从所述运行栈空间获取并执行所述第一地址映射结果指示的指令。
在一种可能的实现中,所述存储模块,具体用于:
将所述第一地址映射结果存储至运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
在一种可能的实现中,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
在一种可能的实现中,所述装置还包括:
替换模块,用于在将所述第一地址映射结果存储至运行栈空间后,基于对所述第二地址的访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
在一种可能的实现中,在将所述第一地址映射结果存储至运行栈空间后,所述第二地址被修改,所述获取模块,还用于:
根据修改后的所述第二地址,获取第二地址映射结果,所述第二地址映射结果为修改后的所述第二地址的映射结果;
所述装置还包括:
执行模块,用于执行所述第二地址映射结果指示的指令且不执行所述第一映射结果。
在一种可能的实现中,所述获取模块,具体用于:
对修改后的所述第二地址进行地址映射,以得到所述第二地址映射结果。
在一种可能的实现中,所述获取模块,还用于:
根据所述函数调用指令,获取第二翻译结果,所述第二翻译结果为所述函数调用指令的翻译结果。
第四方面,本申请提供了一种地址恢复装置,所述装置包括:
获取模块,用于获取访问请求;其中,所述访问请求指示从运行栈空间中访问第二地址,所述第二地址属于返回指令,所述返回指令用于指示执行所述第二地址指示的指令;且所述第二地址的第一地址映射结果被存储至运行栈空间,所述第一地址映射结果是所述第二地址的映射结果;
替换模块,用于基于所述访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
在一种可能的实现中,所述第二地址的第一地址映射结果保存在所述运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
在一种可能的实现中,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
在一种可能的实现中,所述获取模块,还用于:
在所述将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址之前,生成映射关系,所述映射关系包括源机器码地址和翻译码地址之间的对应关系;
从所述映射关系中获取所述第一地址映射结果对应的所述第二地址。
第五方面,本申请提供了一种终端设备,所述终端设备包括处理器和存储器,所述处理器获取存储器中存储的代码,以执行第一方面以及其可选的实现方式中的任意一种、以及第二方面以及其可选的实现方式中的任意一种。
第六方面,本申请提供了一种非易失性计算机可读存储介质,所述非易失性计算机可读存储介质包含计算机指令用于执行第一方面以及其可选的实现方式中的任意一种、以及第二方面以及其可选的实现方式中的任意一种。
第七方面,本申请还提供了一种计算机程序产品,包括代码,当所述代码被执行时,用于执行第一方面以及其可选的实现方式中的任意一种、以及第二方面以及其可选的实现方式中的任意一种。
第八方面,提供了一种芯片,所述芯片包括处理器,所述处理器用于执行第一方面以及其可选的实现方式中的任意一种、以及第二方面以及其可选的实现方式中的任意一种。
附图说明
图1为本申请提供的DBT的示意;
图2为本申请提供的系统的结构示意;
图3为一种二进制翻译方法的流程示意;
图4为一种二进制翻译方法的流程示意;
图5为本实施例提供的一个二进制翻译方法的流程示意;
图6为一种运行栈空间的示意;
图7为本实施例提供的二进制翻译方法的流程示意;
图8为本申请提供的二进制翻译方法的流程示意;
图9为本申请提供的二进制翻译方法的流程示意;
图10为本申请提供的二进制翻译方法的流程示意;
图11为本申请提供的二进制翻译方法的应用架构示意;
图12为本实施例提供的一个二进制翻译装置的结构示意;
图13为本实施例提供的一个终端设备的结构示意;
图14为本申请提供的一种服务器的结构示意。
具体实施方式
下面结合附图,对本申请的实施例进行描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。本领域普通技术人员可知,随着技术的发展和新场景的出现,本申请实施例提供的技术方案对于类似的技术问题,同样适用。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或模块的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或模块,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或模块。在本申请中出现的对步骤进行的命名或者编号,并不意味着必须按照命名或者编号所指示的时间/逻辑先后顺序执行方法流程中的步骤,已经命名或者编号的流程步骤可以根据要实现的技术目的变更执行次序,只要能达到相同或者相类似的技术效果即可。
接下来介绍本申请涉及的一些概念:
二进制翻译:将某一体系架构(源体系架构)上的软件运行在另一体系架构(目标体系架构)上的技术,一般情况下,源体系架构和目标体系架构是两种不同的架构。例如源体系架构和目标体系架构是可以是不同的指令集架构(instruction set architecture,ISA)。
目标机器:本申请实施例中指目标体系架构的真实物理机器。
源软件:期望通过二进制翻译技术进行体系架构迁移的软件。
源机器码:源软件所在体系架构对应的二进制代码。
翻译码:对源软件进行二进制码翻译后的目标机器二进制代码。
间接跳转指令:一类跳转指令,其特点是跳转目标存放于寄存器或内存之中,只有当程序运行到间接跳转指令时,对应的寄存器或内存中存放的才是正确的跳转目标地址,如果在执行跳转指令之前访问寄存器或内存,这时拿到的目标地址可能是错误的。
二进制翻译(binary translation,BT)是将为一个源(“客体(guest)”)ISA构建的二进制翻译至另一个目标(“宿主(host)”)ISA的技术。使用BT,可能在具有不同的架构的处理器上执行为一个处理器ISA构建的应用程序二进制,而不需要重编译高级源代码或重写汇编代码。
动态二进制翻译(dynamic binary translation)是一种在二进制层面通过对软件在运行时进行修改和监控的方式来增加软件的可移植性和适应性的技术。使用该技术的软件称为动态二进制翻译器(dynamic binary translator,DBT)。动态二进制翻译技术分离了软件对硬件的依赖,使得源软件(source software)不再直接运行在硬件之上,而是运行在动态二进制翻译器上,通过这种方式使得源软件得以在目标机器(target machine)上运行。
动态二进制翻译器包含翻译引擎(translation engine)和执行引擎(executionengine)两个主要部分。如图1所示,翻译引擎读入源软件的源机器码(source code),并将其翻译成目标机器上的翻译码(translated code);执行引擎运行这些翻译码来模拟源软件的执行。与此相对应的,源软件的运行过程也被分成两个部分:翻译阶段和运行阶段。在翻译阶段对要执行的源机器码进行翻译,翻译完成后将控制转到执行引擎去执行,进入执行阶段。执行引擎根据要执行的源指令地址找到翻译指令地址来执行它。当执行引擎遇到尚未翻译的代码片段便将控制交回翻译引擎继续翻译。二进制翻译器通过翻译与执行两个阶段的相互交替便可在目标机器上模拟源软件的运行。
接下来描述本申请的应用架构:
图2描绘了一种系统100。系统100包括耦合至系统存储器104的处理器(例如但不限于为图2所示的中央处理器(central processing unit,CPU))102。系统100可以包括高速缓冲存储器105(其可以包括在系统存储器104中)和/或类似于高速缓冲存储器但是通过软件管理的暂时存储器(scratch-pad memory)107。CPU 102可以包括多个处理器寄存器106-1、106-2、…,106-m,总称106。CPU102可以包括多个核心处理单元(下文中的“多个核心”或单数的“核心”)并且每个核心可以被配置为执行多个线程。系统存储器104可以托管源二进制应用程序110、动态二进制翻译系统115以及宿主操作系统(operating system,OS)120。动态二进制翻译系统115可以包括目标二进制代码块(一个或多个)112、包括寄存器映射模块116的动态二进制翻译器代码114和/或源寄存器存储118。源二进制应用程序110可以包括对应于源ISA的多个源二进制代码块。目标二进制代码块(一个或多个)对应于目标ISA。源二进制代码块是一个或多个指令的序列。
目标二进制代码块(一个或多个)112可以存储在命名为“代码高速缓存”111的系统存储器的区域内。可以将代码高速缓存111理解为用于目标二进制代码块(一个或多个)112的存储,即,从对应的源二进制代码块(一个或多个)翻译过来的目标二进制代码块(一个或多个)112。系统存储器104可以托管源寄存器存储118,该源寄存器存储118被配置为存储数据到处理器寄存器106或者从处理器寄存器106载入数据。在一些实施例中,高速缓冲存储器105和/或暂时存储器107被配置为存储数据到处理器寄存器(一个或多个)106或者从处理器寄存器(一个或多个)106载入数据。
可以通过一个或多个核心执行动态二进制翻译器代码114和寄存器映射模块116来对源二进制应用程序110进行操作,以将源二进制应用程序110的块(一个或多个)转化为目标二进制代码块(一个或多个)112。可以动态地将源二进制代码块翻译成目标二进制代码块。换句话说,可以响应于对执行二进制块的调用而不是静态地(即,在运行时前)将源二进制代码块翻译成目标二进制代码块。接着可以将目标二进制代码块存储在系统存储器104中的代码高速缓存111中并且将其提供至CPU102用于执行。
动态二进制翻译器的目标是提供与源机器兼容的执行环境,使得源软件在目标机器上尽可能高效的运行。然而,兼容性与高效性是两个对立面,在保证兼容性的前提下尽可能的减少性能损失是动态二进制翻译面临的主要挑战。其中,如何对间接跳转指令(indirect branch instruction)翻译是影响性能的关键因素之一。间接跳转指令是一类跳转指令,其特点是跳转目标存放于寄存器或内存之中,只有当程序运行到间接跳转指令时,对应的寄存器或内存中存放的才是正确的跳转目标地址,如果在执行跳转指令之前访问寄存器或内存,这时拿到的目标地址可能是错误的。由于间接跳转指令的目标地址只有在运行时可知,且每次执行时该值都有可能不同,导致对间接跳转指令进行翻译时无法得到源机器码地址(source program counter,SPC)对应的翻译码地址(target programcounter,TPC),为了解决这一问题,动态二进制翻译器引入查找表(lookup table)结构,如图3所示,将每个源机器码地址与对应的翻译码地址存入查找表中,当执行间接跳转指令时会通从寄存器或内存中得到SPC,然后以SPC为索引查找对应的TPC。
在一个典型的应用程序中,函数返回指令为一种间接跳转指令,由于同一个函数会被多个不同的地方调用,因此函数返回时必须使用间接跳转来返回到它被调用的地方继续执行。
在对返回指令进行动态二进制翻译时,若每次执行函数返回时都要访问这个查找表结构,导致频繁产生上下文切换(context switch),性能损失较大。由于函数返回遵循函数的调用规范(calling convention),是一种有规律的间接跳转,在每次执行函数调用时都会将函数的返回地址压入栈顶,函数执行结束后再从栈顶取出返回地址,跳转到被调用位置继续执行,根据这一规律提出了返地址回栈(return address stack,RAS)的优化方式,如图4所示。在处理间接跳转的查找表结构之外又构建出一个专门用于存放函数返回地址的栈式结构,使用返回地址栈指针(RAS pointer)标记出栈顶所在的位置,每次执行函数调用时,将SPC和TPC存放于栈顶;函数返回时,从栈顶取出SPC和TPC,比较SPC和此时的返回地址是否一致;如果一致,则跳转到对应的TPC继续执行;如果不一致,则按照一般的间接跳转指令进行处理,即到查找表结构中去寻找对应的TPC。
通过上述返回地址栈的方式虽然避免了对查找表结构不必要的访问,省去了大量上下文切换的开销,但是由于需要额外的专门用于存放函数返回地址的栈式结构,消耗了更多的存储空间,且每次执行函数调用和返回时仍要通过RAS保存和获取函数的SPC与TPC,并对该地址进行一次校验操作。在这一处理过程中,仍然需要额外生成访存和比较指令来完成这些工作,增加了额外的性能开销。
为了解决上述问题,本申请实施例提供了一种指令翻译方法。
下面通过图5对本实施例提供的指令翻译方法的步骤进行详细说明,图5为本申请实施例提供的一种指令翻译方法的流程示意,如图5所示,该指令翻译方法可以包括以下步骤:
501、获取函数调用指令的返回指令,其中,所述函数调用指令用于指示调用第一地址指示的指令,所述返回指令用于指示根据所述函数调用指令执行完所述第一地址指示的指令后执行第二地址指示的指令。
步骤501的执行主体可以为二进制翻译器,例如可以在二进制翻译器对源应用程序进行动态二进制翻译、静态二进制翻译或者动静态相结合的二进制翻译时执行步骤501。
以动态二进制翻译为例,在一种可能的实现中,步骤501的执行主体可以为DBT,例如可以在DBT对源应用程序进行动态二进制翻译时执行步骤501。
其中,所谓动态二进制翻译,可以理解为当执行应用程序时(即,在运行时),在运行中执行二进制翻译。相对的,静态二进制翻译则可以为离线执行二进制翻译,例如在运行应用程序前执行的二进制翻译。
在一种可能的实现中,DBT可以对一个源软件应用进行动态二进制翻译,会将源软件分成多个源代码块,翻译引擎每次读入一个源代码块将其翻译成目标机器上可执行的翻译代码块,例如可以对源代码块内的指令逐条翻译,直至翻译到源代码块内的最后一条指令。
在一种可能的实现中,DBT可以依次翻译每一条源软件指令,当遇到函数调用指令时可以进入函数调用指令处理流程,其中,函数调用指令用于指示调用第一地址指示的指令。函数调用指令可以包括第一地址。
在一种可能的实现中,在执行到函数调用指令时,可以跳转到第一地址指示的指令,并执行第一地址指示的指令,之后会执行该函数调用指令的返回指令,该返回指令可以指示在执行完第一地址指示的指令后返回调用的指令,例如,返回指令用于指示根据所述函数调用指令执行完所述第一地址指示的指令后执行第二地址指示的指令。例如,返回指令可以包括第二地址(例如第二地址的SPC)。
在一种可能的实现中,在翻译到函数调用指令时,可以但不限于通过固定偏移计算出源软件中函数调用指令后一条指令的地址(例如本申请实施例中的第二地址)。
其中,返回指令“return可以表示从被调函数(例如本申请实施例中的第一地址指示的指令)返回到主调函数(例如本申请实施例中的第二地址指示的指令)继续执行,返回时可附带一个返回值,由return后面的参数指定。
502、根据所述第二地址,获取第一地址映射(address mapping)结果,所述第一地址映射结果是所述第二地址的映射结果。
在一种可能的实现中,所述返回指令包括第二地址(也就是源机器码地址SPC),所述第一地址映射结果包括所述第二地址的翻译码地址TPC。
在一种可能的实现中,当翻译函数调用指令时,可以通过固定偏移计算出源软件中函数调用指令后一条指令的地址(例如本申请实施例中的第二地址)的第一地址映射结果。
在一种可能的实现中,可以对第二地址进行地址映射,以得到第一地址映射结果。例如,第一地址映射结果可以包括第二地址的TPC。
503、将所述第一地址映射结果存储至运行栈空间。
其中,程序运行时,操作系统会为每个进程分配栈空间,用于保存如下的一种或多种程序运行时函数调用的参数、函数返回的地址、局部变量以及函数返回值,栈空间可以随函数调用而增加,随函数结束而释放。
在一种可能的实现中,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
在一种可能的实现中,在得到第一地址映射结果后,可以生成并执行存储指令,该存储指令可以指示将第一地址映射结果(例如TPC)存储到源软件程序的运行栈空间中的返回指令(也就是第二地址)的地址空间。
其中,运行栈空间可以称之为运行时栈(run time stack)空间。参照图6,图6为一种运行栈空间的示意,函数Func_A内部执行到某一处会调用函数Func_B,在函数Func_A调用函数Func_B前,会预先将函数Func_B所需要的参数放入运行时栈(run time stack)空间,如图6的(a)所示;随后执行call Func_B指令调用函数Func_B,此时会先将函数Func_B的返回地址(return address)压入运行时栈空间,然后执行函数Func_B的指令,如图6(b)所示;待函数Func_B执行完毕后,会执行返回指令(ret),此时根据运行时栈空间中函数Func_B的返回地址跳转到函数Func_A中调用点后的位置继续执行,由于Func_B的返回地址不再被需要,因此会被弹出运行时栈空间,如图6(c)所示。
目前现有的函数返回地址优化方案中,通过使用独立数据结构来保存返回指令中SPC和TPC之间的映射关系,需要额外的存储空间,且在返回指令的地址被更改的情况下,由于保存返回指令的SPC和TPC之间的映射关系的独立数据结构并不感知,因此每次翻译返回指令(无论返回指令是否被更改)时都需要对返回指令的SPC进行校验,增加了翻译时的开销。本申请实施例中,复用了源程序的运行栈空间,例如,将栈空间上原本用于存放返回指令地址的空间(例如SPC)来存放第一地址映射结果(例如TPC),一方面不需要使用独立数据结构来保存返回指令的SPC和TPC之间的映射关系,节省了存储空间,且由于运行栈空间对于返回指令的更改是可以感知的,不需要每次翻译返回指令时都需要对返回指令的SPC进行校验,降低了翻译时的开销。
在一种可能的实现中,在将第一地址映射结果存储至目标位置之后,可以对函数调用指令进行翻译,以得到第二翻译结果。
在一种可能的实现中,可以根据所述函数调用指令,获取第二翻译结果,所述第二翻译结果为所述函数调用指令的二进制翻译结果。
在一种可能的实现中,所述函数调用指令包括所述第一地址的SPC,所述第二翻译结果包括所述第一地址的TPC。
504、根据所述返回指令,获取所述返回指令的第一翻译结果,所述第一翻译结果为所述返回指令的翻译结果,所述第一翻译结果指示从所述运行栈空间获取并执行所述第一地址映射结果指示的指令。
在一种可能的实现中,当翻译到函数返回指令时,可以根据所述返回指令,获取第一翻译结果,其中,第一翻译结果可以包括装载指令以及跳转指令,装载指令可以指示从所述目标位置处获取第一地址映射结果,跳转指令可以指示执行第一地址映射结果指示的指令。
示例性的,当翻译到函数返回指令时,可以生成装载指令,从源软件程序运行栈中函数返回地址空间取出TPC,然后再生成一条跳转指令跳转到该TPC。当源代码块翻译完成后,控制流会转移到执行引擎执行翻译代码块。
接下来结合一个具体的流程示意,介绍本申请实施例中对函数调用指令和返回指令的翻译过程:其中,对函数调用指令的翻译处理流程可以如图7所示。对函数返回指令的翻译处理流程可以如图8所示。
参照图7,对函数调用指令的翻译处理流程可以包括:
(1)依次翻译每一条源软件指令,当遇到函数调用指令(源)时进入函数调用指令处理流程;
(2)计算出源软件中函数调用指令后(物理上的)一条指令的TPC,作为下一条存储指令的参数;
(3)生成一条存储指令,将(2)中计算的TPC存储到运行栈空间返回地址处;
(4)生成函数调用指令,将控制流转移到被调用函数。
参照图8,对函数返回指令的翻译处理流程可以包括:
(1)依次翻译每一条源软件指令,当遇到函数返回指令时进入返回指令翻译处理流程;
(2)从运行栈空间获取函数返回的TPC;
(3)生成跳转指令将函数控制流转移到该TPC处继续执行。
在一种可能的实现中,在翻译代码块运行时可能需要访问源软件函数的返回指令的地址(可以简称为返回地址,例如本申请中的第二地址),例如加载libunwind库,具体需要从运行栈空间的返回地址的空间中获取返回指令的地址的SPC,由于本申请实施例中运行栈空间的返回地址的空间存储的是返回指令的地址的地址映射结果(也就是第一地址映射结果,例如返回指令的地址的TPC),因此,需要进行返回指令的地址的恢复。在一种可能的实现中,在所述获取第一翻译结果之后,响应于对所述第二地址的访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址,例如可以将返回指令的TPC替换为返回指令的SPC。
示例性的,响应于针对于返回指令的地址的访问请求,DBT的执行引擎可以将控制流转入函数返回地址恢复流程,将程序运行栈空间上的函数返回地址依次恢复为SPC,完成后控制流再次转入执行引擎,其中,执行引擎可以负责清除翻译代码,调用翻译引擎重新翻译源代码块。在这种情况下,翻译函数调用指令时,函数返回地址栈上存储的不再是TPC,而是SPC;对源代码块中函数返回指令的翻译,会生成装载指令从源软件程序运行栈中函数返回地址空间中取出SPC,然后再生成一条跳转到执行引擎的指令。当源代码块翻译完成后,控制流会转移到执行引擎去执行翻译代码块,执行完翻译代码块,又会回到执行引擎,根据SPC值找到下一个要运行的翻译代码块继续运行。
接下来结合一个具体的流程示意,介绍本申请实施例中对返回指令的地址的访问请求的处理过程:其中,对返回指令的地址的访问请求的处理过程可以如图9所示。
参照图9,对返回指令的地址的访问请求的处理过程可以包括:
(1)S0.依次遍历所有的翻译代码块,若访问到末尾则转去行S8;否则,执行S1;
(2)S1.取出下一个要访问的代码块;
(3)S2.判断是否遍历完翻译代码块内所有指令,若是则转去执行S0;否则,执行S3;
(4)S3.取出下一条指令;
(5)S4.判断这条指令,若是函数调用指令则转去执行S5;否则,转去执行S2;
(6)S5.获取函数调用指令的位置,记录函数调用指令后一条指令地址,即翻译函数返回地址(TPC);
(7)S6.利用S5中记录的TPC在查找该项对应的SPC;
(8)S7.将TPC和SPC填入地址缓存表,转去执行步骤S2;
(9)S8.利用返回地址缓存表中的记录恢复程序运行栈上的源机器码地址(SPC)。
通过上述方式,可以使得本申请实施例的方案不会出现无法获取源软件函数返回地址的问题。
在一种可能的实现中,返回指令的地址可以被修改,在这种情况下,运行栈空间中目标位置存储的第一地址映射结果是不准确的翻译结果(TPC),为了能够获取到准确的翻译结果(TPC),则需要获取到修改后的所述返回指令的地址(修改后的所述第二地址,例如修改后的SPC),并根据修改后的所述返回指令的地址,获取第二地址映射结果,并在不执行所述第一翻译结果的情况下,执行所述第二地址映射结果的指令。
在一种可能的实现中,所述根据修改后的所述第二地址,获取所述第二地址的第二地址映射结果,包括:根据修改后的所述第二地址,从映射关系(例如预设的SPC到TPC映射关系)中获取所述修改后的所述第二地址对应的第二地址映射结果;或者,对所述修改后的所述第二地址进行地址映射,得到所述第二地址映射结果(例如在预设的SPC到TPC映射关系中未找到修改后的SPC,则可以重新对修改后的SPC进行地址映射)。
在一种可能的实现中,当遇到源软件程序运行栈中函数返回指令的地址被修改时,函数返回会触发异,例如可以产生SIGSEGV信号,可以将控制程序进入信号处理过程,在信号处理程序中通获取到触发异常的SPC,随后控制流转移到执行引擎,通过SPC查找TPC,然后执行TPC对应的翻译代码块,恢复程序的正常运行。
本申请实施例中,只有当程序修改函数返回指令的地址而产生异常时,才通过异常处理过程得到准确的翻译结果(例如TPC),使程序正确运行(而无需每次都进行校验过程),既保证了完备性的同时也兼顾了程序的运行效率。
接下来结合一个具体的流程示意,介绍本申请实施例中发生异常的处理过程:其中,发生异常的处理过程可以如图10所示。
参照图10,发生异常的处理过程可以包括:
(1)源软件代码段页面属性置为不可执行,当程序执行到异常返回地址时会触发执行保护异常;
(2)系统会自动调用对应的异常处理程序执行,在异常处理程序中,获取触发异常时该指令要跳转的目标地址,将该地址当作SPC;
(3)用(2)获取的SPC为索引,去查找表中寻找对应的TPC;若没有找到则触发翻译流程去生成SPC所对应的代码,得到TPC;
(4)修改异常处理程序栈上的返回地址;
(5)操作系统在异常处理程序结束时将控制流转到执行流程;
(6)执行流程会恢复翻译码执行所需上下文,然后根据(3)中得到的TPC,转去执行该代码。
参照图11,图11为本申请实施例中指令翻译方法的一个架构示意。基于本申请实施例的指令翻译器与常规动态二进制翻译器最明显的区别就是函数返回地址存放的位置不同,将函数返回地址存入栈地址空间可以减少不必要的比较,进而加快程序执行。本申请实施例虽然提高了程序的执行效率,但同时也引入了一些特殊情况,针对这些情况又提出了异常情况处理和函数返回地址恢复方案来进行处理,实例执行路径如图11所示,虚线表示数据流,实线表示控制流。
本申请实施例提供了一种指令翻译方法,所述方法包括:获取函数调用指令的返回指令,其中,所述函数调用指令用于指示调用第一地址指示的指令,所述返回指令用于指示根据所述函数调用指令执行完所述第一地址指示的指令后执行第二地址指示的指令;根据所述第二地址,获取第一地址映射(address mapping)结果,所述第一地址映射结果是所述第二地址的映射结果;将所述第一地址映射结果存储至运行栈空间;根据所述返回指令,获取所述返回指令的第一翻译结果,所述第一翻译结果为所述返回指令的翻译结果,所述第一翻译结果指示从所述运行栈空间获取并执行所述第一地址映射结果指示的指令。目前现有的函数返回地址优化方案中,通过使用独立数据结构来保存返回指令的SPC和TPC之间的映射关系,需要额外的存储空间,且在返回指令被更改的情况下,由于保存返回指令的SPC和TPC之间的映射关系的独立数据结构并不感知,因此每次翻译返回指令(无论返回指令是否被更改)时都需要对返回指令的SPC进行校验,增加了翻译时的开销。本申请实施例中,复用了源程序的运行栈空间,例如,将栈空间上原本用于存放返回指令的地址的空间(例如SPC)来存放第一地址映射结果(例如TPC),一方面不需要使用独立数据结构来保存返回指令的SPC和TPC之间的映射关系,节省了存储空间,且由于运行栈空间对于返回指令的更改是可以感知的,不需要每次翻译返回指令时都需要对返回指令的SPC进行校验,降低了翻译时的开销,增加了程序运行的效率。
此外,本申请实施例还提供了一种地址恢复方法,所述方法包括:获取访问请求;其中,所述访问请求指示从运行栈空间中访问第二地址,所述第二地址属于返回指令,所述返回指令用于指示执行所述第二地址指示的指令;且所述第二地址的第一地址映射结果被存储至运行栈空间,所述第一地址映射结果是所述第二地址的映射结果;基于所述访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
关于地址恢复方法的具体描述可以参照图5对应的实施例的描述,相似之处不再赘述。
在一种可能的实现中,在翻译代码块运行时可能需要访问源软件函数的返回指令的地址(可以简称为返回地址,例如本申请中的第二地址),例如加载libunwind库,具体需要从运行栈空间的返回地址的空间中获取返回指令的地址的SPC,由于本申请实施例中运行栈空间的返回地址的空间存储的是返回指令的地址的地址映射结果(也就是第一地址映射结果,例如返回指令的地址的TPC),因此,需要进行返回指令的地址的恢复。在一种可能的实现中,在所述获取第一翻译结果之后,响应于对所述第二地址的访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址,例如可以将返回指令的TPC替换为返回指令的SPC。
在一种可能的实现中,所述第二地址的第一地址映射结果被存储至运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置;所述将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址,包括:将所述运行栈空间中所述目标位置的所述第一地址映射结果替换为所述第二地址。
在一种可能的实现中,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
在一种可能的实现中,所述方法还包括:在所述将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址之前,所述方法还包括:生成映射关系,所述映射关系包括源机器码地址和翻译码地址之间的对应关系;从所述映射关系中获取所述第一地址映射结果对应的所述第二地址。
本申请实施例中,相比于实时维护源机器码地址和翻译码地址之间的对应关系,可以在存在对源机器码地址的访问需求时才生成源机器码地址和翻译码地址之间的对应关系,可以降低存储资源的占用。
参照图12,图12为本申请实施例提供的一种指令翻译装置的结构示意,如图12所示,本申请实施例提供的指令翻译装置1200,包括:
获取模块1201,用于获取函数调用指令的返回指令,其中,所述函数调用指令用于指示调用第一地址指示的指令,所述返回指令用于指示根据所述函数调用指令执行完所述第一地址指示的指令后执行第二地址指示的指令;
根据所述第二地址,获取第一地址映射结果,所述第一地址映射结果是所述第二地址的映射结果;
存储模块1202,用于将所述第一地址映射结果存储至运行栈空间;
所述获取模块1201,还用于根据所述返回指令,获取所述返回指令的第一翻译结果,所述第一翻译结果为所述返回指令的翻译结果,所述第一翻译结果指示从所述运行栈空间获取并执行所述第一地址映射结果指示的指令。
其中,关于获取模块1201的具体描述可以参照上述实施例中步骤501、步骤502和步骤504的描述,这里不再赘述。
其中,关于存储模块1202的具体描述可以参照上述实施例中步骤503的描述,这里不再赘述。
在一种可能的实现中,所述存储模块,具体用于:
将所述第一地址映射结果存储至运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
在一种可能的实现中,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
在一种可能的实现中,所述装置还包括:
替换模块1203,用于在将所述第一地址映射结果存储至运行栈空间后,基于对所述第二地址的访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
在一种可能的实现中,在将所述第一地址映射结果存储至运行栈空间后,所述第二地址被修改,所述获取模块,还用于:
根据修改后的所述第二地址,获取第二地址映射结果,所述第二地址映射结果为修改后的所述第二地址的映射结果;
所述装置还包括:
执行模块,用于执行所述第二地址映射结果指示的指令且不执行所述第一映射结果。
在一种可能的实现中,所述获取模块,具体用于:
对修改后的所述第二地址进行地址映射,以得到所述第二地址映射结果。
在一种可能的实现中,所述获取模块,还用于:
根据所述函数调用指令,获取第二翻译结果,所述第二翻译结果为所述函数调用指令的翻译结果。
本申请实施例还提供了一种地址恢复装置,所述装置包括:
获取模块,用于获取访问请求;其中,所述访问请求指示从运行栈空间中访问第二地址,所述第二地址属于返回指令,所述返回指令用于指示执行所述第二地址指示的指令;且所述第二地址的第一地址映射结果被存储至运行栈空间,所述第一地址映射结果是所述第二地址的映射结果;
替换模块,用于基于所述访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
在一种可能的实现中,所述第二地址的第一地址映射结果保存在所述运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
在一种可能的实现中,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
在一种可能的实现中,所述获取模块,还用于:
在所述将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址之前,生成映射关系,所述映射关系包括源机器码地址和翻译码地址之间的对应关系;
从所述映射关系中获取所述第一地址映射结果对应的所述第二地址。
接下来介绍本申请实施例提供的一种终端设备,请参阅图13,图13为本申请实施例提供的终端设备的一种结构示意图,终端设备1300具体可以表现为虚拟现实VR设备、手机、平板、笔记本电脑、智能穿戴设备等,此处不做限定。具体的,终端设备1300包括:接收器1301、发射器1302、处理器1303和存储器1304(其中终端设备1300中的处理器1303的数量可以一个或多个,图13中以一个处理器为例),其中,处理器1303可以包括应用处理器13031和通信处理器13032。在本申请的一些实施例中,接收器1301、发射器1302、处理器1303和存储器1304可通过总线或其它方式连接。
存储器1304可以包括只读存储器和随机存取存储器,并向处理器1303提供指令和数据。存储器1304的一部分还可以包括非易失性随机存取存储器(non-volatile randomaccess memory,NVRAM)。存储器1304存储有处理器和操作指令、可执行模块或者数据结构,或者它们的子集,或者它们的扩展集,其中,操作指令可包括各种操作指令,用于实现各种操作。
处理器1303控制终端设备的操作。具体的应用中,终端设备的各个组件通过总线系统耦合在一起,其中总线系统除包括数据总线之外,还可以包括电源总线、控制总线和状态信号总线等。但是为了清楚说明起见,在图中将各种总线都称为总线系统。
上述本申请实施例揭示的方法可以应用于处理器1303中,或者由处理器1303实现。处理器1303可以是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器1303中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器1303可以是通用处理器、数字信号处理器(digital signal processing,DSP)、微处理器或微控制器,还可进一步包括专用集成电路(application specific integratedcircuit,ASIC)、现场可编程门阵列(field-programmable gate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。该处理器1303可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器1304,处理器1303读取存储器1304中的信息,结合其硬件完成上述方法的步骤。
接收器1301可用于接收输入的数字或字符信息,以及产生与终端设备的相关设置以及功能控制有关的信号输入。发射器1302可用于通过第一接口输出数字或字符信息;发射器1302还可用于通过第一接口向磁盘组发送指令,以修改磁盘组中的数据;发射器1302还可以包括显示屏等显示设备。
本申请实施例还提供了一种服务器,请参阅图14,图14是本申请实施例提供的服务器一种结构示意图,具体的,服务器1400由一个或多个服务器实现,服务器1400可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(centralprocessing units,CPU)1414(例如,一个或一个以上处理器)和存储器1432,一个或一个以上存储应用程序1442或数据1444的存储介质1430(例如一个或一个以上海量存储设备)。其中,存储器1432和存储介质1430可以是短暂存储或持久存储。存储在存储介质1430的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器1414可以设置为与存储介质1430通信,在服务器1400上执行存储介质1430中的一系列指令操作。
服务器1400还可以包括一个或一个以上电源1426,一个或一个以上有线或无线网络接口1450,一个或一个以上输入输出接口1458;或,一个或一个以上操作系统1441,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
本申请实施例中,中央处理器1414,用于执行图5对应实施例中描述的指令翻译方法。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者其他网络设备等)执行本申请图2实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read-only memory,ROM)、随机存取存储器(random access memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。

Claims (25)

1.一种指令翻译方法,其特征在于,所述方法包括:
获取函数调用指令的返回指令,其中,所述函数调用指令用于指示调用第一地址指示的指令,所述返回指令用于指示根据所述函数调用指令执行完所述第一地址指示的指令后执行第二地址指示的指令;
根据所述第二地址,获取第一地址映射结果,所述第一地址映射结果是所述第二地址的映射结果;
将所述第一地址映射结果存储至运行栈空间;以及,
根据所述返回指令,获取所述返回指令的第一翻译结果,所述第一翻译结果为所述返回指令的翻译结果,所述第一翻译结果指示从所述运行栈空间获取并执行所述第一地址映射结果指示的指令。
2.根据权利要求1所述的方法,其特征在于,所述将所述第一地址映射结果存储至运行栈空间,包括:
将所述第一地址映射结果存储至运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
3.根据权利要求1或2所述的方法,其特征在于,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
4.根据权利要求1至3任一所述的方法,其特征在于,在将所述第一地址映射结果存储至运行栈空间后,所述方法还包括:
基于对所述第二地址的访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
5.根据权利要求1至4任一所述的方法,其特征在于,在将所述第一地址映射结果存储至运行栈空间后,所述第二地址被修改,所述方法还包括:
根据修改后的所述第二地址,获取第二地址映射结果,所述第二地址映射结果为修改后的所述第二地址的映射结果;
执行所述第二地址映射结果指示的指令且不执行所述第一映射结果。
6.根据权利要求5所述的方法,其特征在于,所述根据修改后的所述第二地址,获取所述第二地址的第二地址映射结果,包括:
对修改后的所述第二地址进行地址映射,以得到所述第二地址映射结果。
7.根据权利要求1至6任一所述的方法,其特征在于,所述方法还包括:
根据所述函数调用指令,获取第二翻译结果,所述第二翻译结果为所述函数调用指令的翻译结果。
8.一种地址恢复方法,其特征在于,所述方法包括:
获取访问请求;其中,所述访问请求指示从运行栈空间中访问第二地址,所述第二地址属于返回指令,所述返回指令用于指示执行所述第二地址指示的指令;且所述第二地址的第一地址映射结果被存储至运行栈空间,所述第一地址映射结果是所述第二地址的映射结果;
基于所述访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
9.根据权利要求8所述的方法,其特征在于,所述第二地址的第一地址映射结果保存在所述运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
10.根据权利要求8或9所述的方法,其特征在于,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
11.根据权利要求10所述的方法,其特征在于,在所述将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址之前,所述方法还包括:
生成映射关系,所述映射关系包括源机器码地址和翻译码地址之间的对应关系;
从所述映射关系中获取所述第一地址映射结果对应的所述第二地址。
12.一种指令翻译装置,其特征在于,所述装置包括:
获取模块,用于获取函数调用指令的返回指令,其中,所述函数调用指令用于指示调用第一地址指示的指令,所述返回指令用于指示根据所述函数调用指令执行完所述第一地址指示的指令后执行第二地址指示的指令;
根据所述第二地址,获取第一地址映射结果,所述第一地址映射结果是所述第二地址的映射结果;
存储模块,用于将所述第一地址映射结果存储至运行栈空间;
所述获取模块,还用于根据所述返回指令,获取所述返回指令的第一翻译结果,所述第一翻译结果为所述返回指令的翻译结果,所述第一翻译结果指示从所述运行栈空间获取并执行所述第一地址映射结果指示的指令。
13.根据权利要求12所述的装置,其特征在于,所述存储模块,具体用于:
将所述第一地址映射结果存储至运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
14.根据权利要求12或13所述的装置,其特征在于,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
15.根据权利要求12至14任一所述的装置,其特征在于,所述装置还包括:
替换模块,用于在将所述第一地址映射结果存储至运行栈空间后,基于对所述第二地址的访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
16.根据权利要求12至15任一所述的装置,其特征在于,在将所述第一地址映射结果存储至运行栈空间后,所述第二地址被修改,所述获取模块,还用于:
根据修改后的所述第二地址,获取第二地址映射结果,所述第二地址映射结果为修改后的所述第二地址的映射结果;
所述装置还包括:
执行模块,用于执行所述第二地址映射结果指示的指令且不执行所述第一映射结果。
17.根据权利要求16所述的装置,其特征在于,所述获取模块,具体用于:
对修改后的所述第二地址进行地址映射,以得到所述第二地址映射结果。
18.根据权利要求12至17任一所述的装置,其特征在于,所述获取模块,还用于:
根据所述函数调用指令,获取第二翻译结果,所述第二翻译结果为所述函数调用指令的翻译结果。
19.一种地址恢复装置,其特征在于,所述装置包括:
获取模块,用于获取访问请求;其中,所述访问请求指示从运行栈空间中访问第二地址,所述第二地址属于返回指令,所述返回指令用于指示执行所述第二地址指示的指令;且所述第二地址的第一地址映射结果被存储至运行栈空间,所述第一地址映射结果是所述第二地址的映射结果;
替换模块,用于基于所述访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
20.根据权利要求19所述的装置,其特征在于,所述第二地址的第一地址映射结果保存在所述运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
21.根据权利要求19或20所述的装置,其特征在于,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
22.根据权利要求21所述的装置,其特征在于,所述获取模块,还用于:
在所述将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址之前,生成映射关系,所述映射关系包括源机器码地址和翻译码地址之间的对应关系;
从所述映射关系中获取所述第一地址映射结果对应的所述第二地址。
23.一种非易失性计算机可读存储介质,其特征在于,所述非易失性可读存储介质包含计算机指令,用于执行权利要求1至11任一所述的方法。
24.一种运算设备,其特征在于,所述运算设备包括存储器和处理器,所述存储器中存储有代码,所述处理器用于获取所述代码,以执行权利要求1至11任一所述的方法。
25.一种计算机程序产品,其特征在于,所述计算机程序产品包括代码,当所述代码被执行时,用于实现权利要求1至11任一所述的方法。
CN202210346585.7A 2022-03-31 2022-03-31 一种指令翻译方法及其相关设备 Pending CN116932044A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202210346585.7A CN116932044A (zh) 2022-03-31 2022-03-31 一种指令翻译方法及其相关设备
PCT/CN2023/084280 WO2023185799A1 (zh) 2022-03-31 2023-03-28 一种指令翻译方法及其相关设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210346585.7A CN116932044A (zh) 2022-03-31 2022-03-31 一种指令翻译方法及其相关设备

Publications (1)

Publication Number Publication Date
CN116932044A true CN116932044A (zh) 2023-10-24

Family

ID=88199157

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210346585.7A Pending CN116932044A (zh) 2022-03-31 2022-03-31 一种指令翻译方法及其相关设备

Country Status (2)

Country Link
CN (1) CN116932044A (zh)
WO (1) WO2023185799A1 (zh)

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6615300B1 (en) * 2000-06-19 2003-09-02 Transmeta Corporation Fast look-up of indirect branch destination in a dynamic translation system
US20050149915A1 (en) * 2003-12-29 2005-07-07 Intel Corporation Methods and apparatus for optimizing a program undergoing dynamic binary translation using profile information
CN101387969B (zh) * 2008-10-16 2011-04-13 上海交通大学 软硬件协同设计的动态二进制翻译方法
CN102662830A (zh) * 2012-03-20 2012-09-12 湖南大学 一种基于动态二进制翻译框架的代码复用攻击检测系统
CN106873944A (zh) * 2016-12-23 2017-06-20 北京北大众志微系统科技有限责任公司 在动态二进制翻译系统中处理间接转移指令的方法和装置

Also Published As

Publication number Publication date
WO2023185799A1 (zh) 2023-10-05

Similar Documents

Publication Publication Date Title
RU2585969C2 (ru) Управление в режиме низких привилегий работой средства сбора сведений о ходе вычислений
US9430254B2 (en) Register mapping techniques
US8990780B2 (en) Setting breakpoints in optimized instructions
RU2585968C2 (ru) Сбор сведений о ходе вычислений
US9753730B2 (en) Decoding instructions from multiple instructions sets
CN112015491B (zh) 实现函数跳转的方法、装置及计算机存储介质
US20150379169A1 (en) Efficient emulation for pseudo-wrapped callback handling in binary translation software
US7395199B2 (en) Emulating the operation of a video graphics adapter
EP3534266B1 (en) Method, apparatus and system for prefetching data
JP2007535241A (ja) 条件付で実行可能モジュールを縮小するシステムおよび方法
US8943480B2 (en) Setting breakpoints in optimized instructions
US20220244931A1 (en) Image file obtaining method and apparatus
US20140365735A1 (en) Computing apparatus, computing method, and computing program
CN117573419B (zh) 一种页面异常处理方法及装置
CN111381905B (zh) 一种程序处理方法、装置及设备
CN116932044A (zh) 一种指令翻译方法及其相关设备
US11210188B1 (en) Systems and methods for processor monitoring and recovery
CN110633210A (zh) 文件执行方法、装置、存储介质和电子设备
CN115421875B (zh) 二进制翻译方法及装置
CN115878197A (zh) 基于设备树的启动优化方法、系统、芯片、设备和介质
CN113656606A (zh) 应用程序的代码查询方法、装置、设备及存储介质
CN114880632A (zh) 获取混淆资源的方法、智能终端及计算机可读存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication