一种指令翻译方法及其相关设备技术

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

【技术实现步骤摘要】
一种指令翻译方法及其相关设备


[0001]本申请涉及计算机领域,尤其涉及一种指令翻译方法及其相关设备。

技术介绍

[0002]二进制翻译(dynamic binary translation)是一种在二进制层面通过对软件在运行时或者运行前进行修改和监控的方式来增加软件的可移植性和适应性的技术。以动态二进制翻译为例,使用该技术的软件称为动态二进制翻译器(dynamic binary translator,DBT)。动态二进制翻译技术分离了软件对硬件的依赖,使得源软件(source software)不再直接运行在硬件之上,而是运行在动态二进制翻译器上,通过这种方式使得源软件得以在目标机器(target machine)上运行。
[0003]间接跳转指令是一类跳转指令,由于间接跳转指令的目标地址只有在运行时可知,且每次执行时该值都有可能不同,导致对间接跳转指令进行翻译时无法得到源机器码地址(source program counter,SPC)对应的翻译码地址(target program counter,TPC),为了解决这一问题,动态二进制翻译器引入查找表(Lookup table)结构,将每个源机器码地址与对应的翻译码地址存入查找表中,当执行间接跳转指令时会通从寄存器或内存中得到SPC,然后以SPC为索引查找对应的TPC。在一个典型的应用程序中,函数返回指令为一种间接跳转指令,由于同一个函数会被多个不同的地方调用,因此函数返回时必须使用间接跳转来返回到它被调用的地方继续执行。
[0004]在对返回指令进行动态二进制翻译时,若每次执行函数返回时都要访问查找表结构,导致频繁产生上下文切换(context switch),性能损失较大。

技术实现思路

[0005]本申请提供了一种指令翻译方法,一方面不需要使用独立数据结构来保存返回指令的源机器码地址和翻译码地址之间的映射关系,节省了存储空间,且由于运行栈空间对于返回指令的更改是可以感知的,不需要每次翻译返回指令时都需要对返回指令的地址进行校验,降低了翻译时的开销。
[0006]第一方面,本申请提供了一种指令翻译方法,所述方法应用于代码的翻译,例如可以应用于代码的二进制翻译其他需要兼容不同运行条件的代码翻译场景中,例如可以应用于代码的动态二进制翻译、静态二进制翻译或者动静态相结合的二进制翻译。其中,所谓动态二进制翻译,可以理解为当执行应用程序时(即,在运行时),在运行中执行二进制翻译。相对的,静态二进制翻译则可以为离线执行二进制翻译,例如在运行应用程序前执行的二进制翻译。
[0007]所述方法包括:获取函数调用指令的返回指令,其中,所述函数调用指令用于指示调用第一地址指示的指令,所述返回指令用于指示根据所述函数调用指令执行完所述第一地址指示的指令后执行第二地址指示的指令;根据所述第二地址,获取第一地址映射(address mapping)结果,所述第一地址映射结果是所述第二地址的映射结果;将所述第一
地址映射结果存储至运行栈空间;根据所述返回指令,获取所述返回指令的第一翻译结果,所述第一翻译结果为所述返回指令的翻译结果,所述第一翻译结果指示从所述运行栈空间获取并执行所述第一地址映射结果指示的指令。
[0008]在一种可能的实现中,所述第二地址为源机器码地址SPC,所述第一地址映射结果为所述第二地址的翻译码地址TPC。
[0009]目前现有的函数返回地址优化方案中,通过使用独立数据结构来保存返回指令的SPC和TPC之间的映射关系,需要额外的存储空间,且在返回指令被更改的情况下,由于保存返回指令的SPC和TPC之间的映射关系的独立数据结构并不感知,因此每次翻译返回指令(无论返回指令是否被更改)时都需要对返回指令的SPC进行校验,增加了翻译时的开销。本申请实施例中,复用了源程序的运行栈空间,例如,将栈空间上原本用于存放返回指令地址的空间(例如SPC)来存放第一地址映射结果(例如TPC),一方面不需要使用独立数据结构来保存返回指令的SPC和TPC之间的映射关系,节省了存储空间,且由于运行栈空间对于返回指令的更改是可以感知的,不需要每次翻译返回指令时都需要对返回指令的SPC进行校验,降低了翻译时的开销,增加了程序运行的效率。
[0010]在一种可能的实现中,在得到第一地址映射结果后,可以生成并执行存储指令,该存储指令可以指示将第一地址映射结果(例如TPC)存储到源软件程序的运行栈空间中的返回指令的地址空间。
[0011]在一种可能的实现中,所述将所述第一地址映射结果存储至运行栈空间,包括:将所述第一地址映射结果存储至运行栈空间的目标位置,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
[0012]在一种可能的实现中,所述将所述第一地址映射结果存储至运行栈空间,包括:将所述第一地址映射结果替换运行栈空间的目标位置中的第二地址,所述目标位置为所述运行栈空间中所述第二地址对应的位置。
[0013]在一种可能的实现中,当翻译函数调用指令时,可以通过固定偏移计算出源软件中函数调用指令后一条指令的地址(例如本申请实施例中的第二地址)的第一地址映射结果。例如,第一地址映射结果可以包括第二地址的TPC。
[0014]在一种可能的实现中,所述方法还包括:根据所述函数调用指令,获取第二翻译结果,所述第二翻译结果为所述函数调用指令的翻译结果。
[0015]在一种可能的实现中,所述函数调用指令包括所述第一地址的SPC,所述第二翻译结果包括所述第一地址的TPC。
[0016]在一种可能的实现中,在将所述第一地址映射结果存储至运行栈空间后,所述方法还包括:基于对所述第二地址的访问请求,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址。
[0017]在一种可能的实现中,在翻译代码块运行时可能需要访问源软件函数的返回指令的地址(可以简称为返回地址,例如本申请中的第二地址),例如加载libunwind库,具体需要从运行栈空间的返回地址的空间中获取返回指令的地址的SPC,由于本申请实施例中运行栈空间的返回地址的空间存储的是返回指令的地址的地址映射结果(也就是第一地址映射结果,例如返回指令的地址的TPC),因此,需要进行返回指令的地址的恢复。在一种可能的实现中,在所述获取第一翻译结果之后,响应于对所述第二地址的访问请求,将所述运行
栈空间中的所述第一地址映射结果替换为所述第二地址,例如可以将返回指令的TPC替换为返回指令的SPC。
[0018]在一种可能的实现中,将所述运行栈空间中的所述第一地址映射结果替换为所述第二地址,具体包括:将所述运行栈空间中目标位置的所述第一地址映射结果替换为所述第二地址。
[0019]在一种可能的实现中,返回指令的地址可以被修改,在这种情况下,运行栈空间中目标位置存储的第一地址映射结果是不准确的翻译结果(TPC),为了能够获取到准确的翻译结果(TPC),则需要获取到修改后的所述返回指令的地址(修改后的所述第二地址,例如修改后的SPC),并根据修改后的本文档来自技高网
...

【技术保护点】

【技术特征摘要】
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.一种指令翻译装置,其特征在于,所述装置包括:获取模块,用于获取函数调用指令的返回指令,其中,所述函数调用指令用于指示调用第一地址指示的指令,所述返回指令用于指示根据所述函数调用指令执行完所述第一地址指示的指令后执行第二地址指示的指令;根据所述第二地址,获取...

【专利技术属性】
技术研发人员:刘先喆曾建江吕研冬
申请(专利权)人:华为技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1