CN119718552B - 二进制翻译方法、电子设备、可读存储介质及程序产品 - Google Patents
二进制翻译方法、电子设备、可读存储介质及程序产品Info
- Publication number
- CN119718552B CN119718552B CN202510206930.0A CN202510206930A CN119718552B CN 119718552 B CN119718552 B CN 119718552B CN 202510206930 A CN202510206930 A CN 202510206930A CN 119718552 B CN119718552 B CN 119718552B
- Authority
- CN
- China
- Prior art keywords
- instruction
- instructions
- type
- stack pointer
- stack
- 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
Links
Landscapes
- Executing Machine-Instructions (AREA)
Abstract
本发明实施例提供了一种二进制翻译方法、电子设备、可读存储介质和程序产品,方法应用于翻译器,在将客户机指令流翻译为宿主机指令流后,获取所述宿主机指令流包含的第一类指令;所述第一类指令为栈指针计算指令且所述第一类指令的源操作数包含栈指针寄存器以及立即数操作数;在所述第一类指令的数量为M的情况下,基于各所述第一类指令的源操作数,将所述M条第一类指令合并为N条第一类指令;所述M为大于1的正整数,所述N为小于M的正整数。这样,本发明实施例可以针对翻译后执行前的宿主机指令进行处理,将M条第一类指令合并处理为N条,减少翻译后的第一类指令的数量,降低翻译后的指令膨胀率,从而提高翻译器的执行效率。
Description
技术领域
本发明属于计算机技术领域,特别是涉及一种二进制翻译方法、装置、电子设备及可读存储介质。
背景技术
在计算机技术领域中,通常通过二进制翻译技术,即通过翻译器将客户机指令翻译成宿主机指令,以使一种体系架构编译的程序也能在另一种体系架构的硬件平台运行。
目前,大部分翻译器往往采用“边翻译边执行”的方式,而客户机与宿主机采用的架构通常不同,这往往导致翻译后得到的宿主机指令的数量相较于原本的客户机指令的数量大大增多,从而使得翻译器的执行效率较低。
发明内容
本发明提供一种二进制翻译方法、电子设备、可读存储介质及程序产品,以便解决翻译器的执行效率较低的问题。
为了解决上述技术问题,本发明是这样实现的:
第一方面,本发明提供一种二进制翻译方法,所述方法应用于翻译器,所述方法包括:
在将客户机指令流翻译为宿主机指令流后,获取所述宿主机指令流包含的第一类指令;所述第一类指令为栈指针计算指令且所述第一类指令的源操作数包含栈指针寄存器以及立即数操作数;
在所述第一类指令的数量为M的情况下,基于各所述第一类指令的源操作数,将所述M条第一类指令合并为N条第一类指令;所述M为大于1的正整数,所述N为小于M的正整数。
第二方面,本发明提供一种二进制翻译方法,将复杂指令集架构的客户机指令按基本块翻译为精简指令集的宿主机指令,包括:
将基本块中的多个客户机栈操作指令中的每个翻译为宿主机的栈访存指令和用于调整栈顶的栈指针计算指令的组合,所述栈访存指令和栈指针计算指令的源操作数包括栈指针寄存器和立即数;
从宿主机指令流中移除至少部分栈指针计算指令;
修改栈访存指令中的立即数偏移量来使栈访存操作指向栈顶,以补偿移除的栈指针计算指令的栈顶调整;以及
用一条栈指针计算指令实现被移除的栈指针指令所累积的栈指针调整。
第三方面,本发明提供一种电子设备,包括:处理器、存储器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现上述二进制翻译方法。
第四方面,本发明提供一种可读存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行上述二进制翻译方法。
本发明实施例所提供的二进制翻译方法,应用于翻译器,在将客户机指令流翻译为宿主机指令流后,获取所述宿主机指令流包含的第一类指令;所述第一类指令为栈指针计算指令且所述第一类指令的源操作数包含栈指针寄存器以及立即数操作数;在所述第一类指令的数量为M的情况下,基于各所述第一类指令的源操作数,将所述M条第一类指令合并为N条第一类指令;所述M为大于1的正整数,所述N为小于M的正整数。这样,本发明实施例可以针对翻译后执行前的宿主机指令进行处理,将M条第一类指令合并处理为N条,减少翻译后的第一类指令的数量,降低翻译后的指令膨胀率,从而提高翻译器的执行效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种二进制翻译方法的步骤流程图;
图2是本发明实施例提供的一种二进制翻译的流程示意图;
图3是本发明实施例提供的一种基本块的示意图;
图4是本发明实施例提供的另一种二进制翻译方法的流程示意图;
图5是本发明实施例提供的一种指令处理装置的结构图;
图6是本发明实施例提供的一种电子设备的结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是本发明实施例提供的一种二进制翻译方法的步骤流程图,该方法应用于翻译器,如图1所示,该方法可以包括如下步骤:
步骤101、在将客户机指令流翻译为宿主机指令流后,获取所述宿主机指令流包含的第一类指令;所述第一类指令为栈指针计算指令且所述第一类指令的源操作数包含栈指针寄存器以及立即数操作数。
步骤102、在所述第一类指令的数量为M的情况下,基于各所述第一类指令的源操作数,将所述M条第一类指令合并为N条第一类指令;所述M为大于1的正整数,所述N为小于M的正整数。
其中,上述翻译器(也可以称为二进制翻译器)用于将客户机(GUEST)中的源程序A翻译为宿主机(HOST)中的目标程序B,并在宿主机中执行目标程序B。源程序A中的指令可以称为客户机指令,目标程序B中的指令可以称为宿主机指令。相应地,上述客户机指令流指的是多个客户机指令构成的指令流,上述宿主机指令流指的是多个宿主机指令构成的指令流。可选地,由于翻译器在将客户机指令翻译为宿主机指令的过程中,通常会采用中间码表征翻译后的指令细节,再将中间码转换为真实的宿主机指令存储至内存中,在此基础上,本发明实施例中的宿主机指令可以是已经存储至内存中的真正的宿主机指令,还可以是宿主机指令之前对客户机指令进行翻译后得到的中间码,可以按照实际的指令处理需求自行选取,本发明实施例对此不作限制。
需要说明的是,本发明实施例中的客户机采用CISC架构,宿主机采用RISC架构。示例性地,本发明实施例中的客户机可以采用x86架构,宿主机可以采用龙架构(LoongArch)。RISC架构只能通过load/store来操作内存,内存不能作为其他指令的操作数,CISC可以把内存作为pop,push等指令的操作数。所以CISC的一条pop或push指令会翻译为RISC中的一条load/store指令加上一个调整栈顶指针的指令,可能导致指令冗余和膨胀的问题。
进一步地,本发明实施例中的翻译器可以是动态二进制翻译器,其通常是将客户机架构的指令在运行时翻译成宿主机架构指令并运行。翻译器读取二进制文件后,通常会以基本块 (Translation Block, TB)为单位进行翻译和执行。因此,上述客户机指令流和宿主机指令流可以是一个基本块所包含的指令。
图2是本发明实施例提供的一种二进制翻译的流程示意图,如图2所示,翻译器读取客户机平台的可执行程序,即二进制文件后,通常会按照基本块的粒度进行翻译和执行。在执行一个基本块之前首先在代码缓存区读取目标程序,如果找到了已经被翻译好的基本块就去执行该代码块,如果未在代码缓存区找到该基本块,就会执行翻译操作并将翻译好后的代码放入代码缓存区,然后执行该基本块。执行完一个基本块之后,再去代码缓存区查找下一个基本块,以此循环,直到程序执行结束。
进一步地,由于二进制翻译技术是在一种CPU体系架构下运行另一种CPU体系架构的源程序,客户机以及宿主机采用两种不同的架构,而不同架构的指令集存在较大差异,在翻译过程中,可能需要多条宿主机指令表达一条客户机指令,从而导致客户机指令被翻译为更多的宿主机指令。而由图2可知,翻译后的指令数量越多,则翻译器的执行效率越低,且还会在一定程度上降低程序整体的翻译效率。
在此基础上,本发明实施例可以在将客户机指令流翻译为宿主机指令流之后,对宿主机指令流的指令进行处理。
其中,上述栈指针寄存器是用于指向堆栈的栈顶的寄存器,而堆栈在程序执行过程中尤为重要,例如在函数调用、局部变量管理以及上下文切换时,均需要通过栈指针寄存器准确地使用堆栈这一数据结构,从而实现高效的内存管理和控制流,因此,程序中用于对栈指针寄存器进行操作的指令往往较多,则本发明实施例可以针对该指令的数量进行优化。
其中,上述第一类指令指的是源操作数包含栈指针寄存器以及立即数操作数的栈指针计算指令,其用于对栈指针寄存器的值进行计算更新,其目的操作数为栈指针寄存器,一个源操作数为栈指针寄存器,至少一个源操作数为立即数。示例性地,以宿主机为LoongArch为例,若存在一个宿主机指令为:addi.d sp,sp,8 ,该指令表示对栈指针寄存器sp加8后存入sp,其用于基于立即数以及栈指针寄存器的当前值对栈指针寄存器的值进行计算更新,为第一类指令。
具体的,本发明实施例可以对宿主机指令流中的宿主机指令进行遍历,确定各宿主机指令的目的操作数是否为宿主机平台对应的栈指针寄存器,若是,再进一步判断各宿主机指令的源操作数是否包含栈指针寄存器以及立即数操作数,若是,则可以确定其为第一类指令。相应地,若目的操作数不为栈指针寄存器或源操作数不包含栈指针寄存器以及立即数操作数,则可以确定其非第一类指令。
其中,上述M为大于1的正整数,上述N为小于M的正整数。具体的,在第一类指令的数量为M的情况下,表明宿主机指令流中存在至少两条用于对栈指针寄存器进行计算的第一类指令,此时本发明实施例可以将M条第一类指令进行合并,将其合并为N条第一类指令。其中,上述N可以根据实际情况自行设置,一种情况下,N可以为1,本发明实施例对此不作限制。
具体的,上述合并操作可以基于各第一类指令的源操作数实现,可以是基于第一类指令源操作数中的立即数操作数实现,具体可以是将各第一类指令的立即数操作数进行合并,合并为N个立即数,并基于N个立即数生成N个第一类指令即可。
具体的,由于栈指针计算指令是用于更新栈指针寄存器,栈指针计算指令通过对栈指针寄存器的加减实现栈顶位置的更新,因此,本发明实施例可以通过合并第一类指令,将宿主机指令流中对栈指针寄存器的M次更新直接合并为N次,可以在一定程度上减少所需执行的宿主机指令的数量,提高翻译器的执行效率。同时,针对动态翻译器还可以在一定程度上提高整体的程序翻译效率。
综上所述,本发明实施例在将客户机指令流翻译为宿主机指令流后,获取所述宿主机指令流包含的第一类指令;所述第一类指令为栈指针计算指令且所述第一类指令的源操作数包含栈指针寄存器以及立即数操作数;在所述第一类指令的数量为M的情况下,基于各所述第一类指令的源操作数,将所述M条第一类指令合并为N条第一类指令;所述M为大于1的正整数,所述N为小于M的正整数。这样,本发明实施例可以针对翻译后执行前的宿主机指令进行处理,将M条第一类指令合并处理为N条,减少翻译后的第一类指令的数量,降低翻译后的指令膨胀率,从而提高翻译器的执行效率。
可选的,上述所述基于各所述第一类指令的源操作数,将所述M条第一类指令合并为N条第一类指令的操作,本发明实施例具体可以包括:
S21、按照指令执行顺序,从所述宿主机指令流中获取宿主机指令作为待处理指令。
S22、若所述待处理指令为所述第一类指令,基于所述待处理指令的立即数操作数对预设参数的参数值进行更新,并从所述宿主机指令流中删除所述待处理指令;所述预设参数的初始值为0。
S23、再次执行所述从所述宿主机指令流中获取宿主机指令作为待处理指令的操作,直至当前的待处理指令为逻辑结束指令的情况下,基于所述预设参数的当前参数值生成一条第一类指令,并将所生成的第一类指令插入为所述逻辑结束指令的上一条指令。
其中,上述指令执行顺序指的是宿主机指令在指令流中的逻辑执行顺序,逻辑执行顺序在后的指令通常依赖于之前的指令的执行结果。在此基础上,本发明实施例可以按照指令执行顺序,从宿主机指令流中依次获取宿主机指令作为待处理指令。
其中,上述预设参数可以是预先设置的变量参数,其初始值可以为0,本发明实施例可以在执行上述步骤102之前,预先为该预设参数赋值为0。具体的,由于栈指针计算指令中的立即数往往为有符号立即数,因此,上述预设参数也可以是有符号类型的变量。进一步地,在待处理指令为第一类指令的情况下,本发明实施例可以基于待处理指令对预设参数的参数值进行更新。具体的,由于第一类指令为栈指针计算指令,则上述更新操作可以是基于待处理指令的立即数操作数实现,可以是为预设参数的参数值增加待处理指令的立即数操作数。示例性地,以预设参数为off为例,若待处理指令的立即数操作数为imm,则上述更新操作可以是off=off+imm。
进一步地,本发明实施例基于待处理指令的立即数操作数对预设参数的参数值进行更新,可以通过预设参数传递栈指针寄存器在当前指令流中的变化值,在此基础上,本发明实施例可以从宿主机指令流中直接删除上述待处理指令。
进一步地,可以再次执行上述步骤S21,依次对宿主机指令流中的第一类指令执行上述步骤S22的操作,这样,可以将宿主机指令流中的栈指针计算指令转换为参数值的更新,而无需在宿主机指令流中体现每一个栈指针计算指令。
其中,上述逻辑结束指令指的是指令流中按照指令执行顺序所执行的最后一条指令,可以是跳转指令或基本块结束指令。进一步地,依次对宿主机指令流中的第一类指令执行上述步骤S22的操作,直至所获取的待处理指令为逻辑结束指令的情况下,此时可以基于预设参数的当前参数值生成一条第一类指令,并将所生成的该第一类指令插入为逻辑结束指令的上一条指令。具体的,上述生成一条第一类指令的操作可以是将预设参数的当前参数值作为第一类指令的立即数操作数,从而生成用于对栈指针寄存器进行计算的第一类指令。
经过上述操作,可以将宿主机指令流中的多个第一类指令合并为一条第一类指令,即,无需按照顺序对栈指针寄存器进行计算,而是通过立即数操作数的累积,对栈指针寄存器进行延迟合并计算。
本发明实施例按照指令执行顺序,从所述宿主机指令流中获取宿主机指令作为待处理指令;若所述待处理指令为所述第一类指令,基于所述待处理指令的立即数操作数对预设参数的参数值进行更新,并从所述宿主机指令流中删除所述待处理指令;所述预设参数的初始值为0;再次执行所述从所述宿主机指令流中获取宿主机指令作为待处理指令的操作,直至当前的待处理指令为逻辑结束指令的情况下,基于所述预设参数的当前参数值生成一条第一类指令,并将所生成的第一类指令插入为所述逻辑结束指令的上一条指令。这样,可以通过预设参数对宿主机指令流中的栈指针寄存器的变化值进行传递,从而可以无需在宿主机指令流中体现每一条栈指针计算指令,仅需在宿主机指令流的逻辑结束指令之前插入一条第一类指令即可,可以实现栈指针寄存器的延迟合并计算,可以大大减少宿主机指令的数量,从而提高翻译器的运行效率。
可选的,上述从所述宿主机指令流中获取宿主机指令作为待处理指令的操作之后,本发明实施例具体还可以包括:
S31、若所述待处理指令为第二类指令,在所述待处理指令的源操作数包含立即数操作数的情况下,基于所述预设参数的当前参数值对所述待处理指令的立即数操作数进行更新;所述第二类指令为所述第一类指令之外的源操作数中包含栈指针寄存器的指令。
S32、再次执行所述从所述宿主机指令流中获取宿主机指令作为待处理指令的操作。
其中,上述第二类指令指的是源操作数包含栈指针寄存器且非第一类指令的指令,其目的操作数为任一操作数,源操作数包含栈指针寄存器。以宿主机为LoongArch为例,若存在一个宿主机指令为:addi.d t0,sp,8,该指令表示将sp寄存器加8后存入寄存器t0中,其需要基于栈指针寄存器的值执行相应操作,为第二类指令。在此情况下,第二类指令的执行依赖于栈指针寄存器的值,而由于本发明实施例删除了宿主机指令流中的第一类指令,也就是在第二类指令执行之前,栈指针寄存器并未更新为准确值。这种情况下,为了保证第二类指令的执行准确性,本发明实施例可以基于预设参数的当前参数值对待处理指令的立即数操作数进行更新。
具体的,第二类指令的源操作数包含栈指针寄存器,若第二类指令的源操作数还包含立即数操作数,则第二类指令的执行同时依赖于栈指针寄存器以及立即数操作数,由于在前述步骤中,本发明实施例删除了第一类指令,导致此时栈指针寄存器的值并不准确,从而会对第二类指令的执行结果造成影响,此时预设参数的当前参数值可以表征栈指针寄存器的待更新值,从而本发明实施例可以直接在待处理指令的立即数操作数的基础上,增加预设参数的当前参数值,保证第二类指令执行的准确性。
示例性地,以待处理指令为第二类指令,其源操作数包含立即数操作数为imm,预设参数为off为例,则上述更新操作可以是imm=imm+off。
进一步地,在对第二类指令的立即数操作数进行更新后,可以再次执行获取待处理指令的操作,即对下一条宿主机指令进行处理。
本发明实施例中,若所述待处理指令为第二类指令,在所述待处理指令的源操作数包含立即数操作数的情况下,基于所述预设参数的当前参数值对所述立即数操作数进行更新;所述第二类指令为所述第一类指令之外的源操作数包含栈指针寄存器的指令;再次执行所述从所述宿主机指令流中获取宿主机指令作为待处理指令的操作。这样,可以在减少翻译后的宿主机指令的数量的同时,通过预设参数的当前参数值对依赖于栈指针寄存器的第二类指令的立即数操作数进行更新,避免删除第一类指令所导致的第二类指令执行结果不准确的问题。
可选的,上述基于所述预设参数的当前参数值对所述待处理指令的立即数操作数进行更新的操作,本发明实施例具体可以包括:
S41、获取所述当前参数值以及所述待处理指令的立即数操作数的当前数值之和,作为待更新数值。
S42、在所述待更新数值不超出所述待处理指令的立即数操作数范围的情况下,将所述待处理指令的立即数操作数更新为所述待更新数值。
具体的,由于指令的操作数往往具有对应的表达范围,操作数不能超出其对应的表达范围,若超出,则可能导致指令无法执行或者执行出错。在此基础上,本发明实施例在对待处理指令的立即数操作数进行更新之前,可以先判断更新后的立即数是否超出相应的操作数的表达范围。
具体的,可以将预设参数的当前参数值以及待处理指令的立即数操作数的当前数值之和作为待更新数值,该数值即为将要替换原立即数操作数的数值。具体的,一条指令的操作数范围往往是固定的,其往往与待处理指令所包含的寄存器的位宽或者指令功能相关,指令的操作数范围往往是由指令手册规定的,在此基础上,本发明实施例可以基于宿主机的指令集架构对应的指令手册中的描述确定待处理指令的立即数操作数范围,或者也可以根据待处理指令中立即数阈的位数(bit)计算得到。或者,还可以通过接受相关人员的输入信息获取待处理指令的立即数操作数范围,具体可以按照实际情况自行设置,本发明实施例对此不作限制。
具体的,在待更新数值不超出待处理指令的立即数操作数范围的情况下,则可以将待处理指令的立即数操作数更新为待更新数值,即,采用待更新数值作为待处理指令源操作数中的立即数操作数。
本发明实施例中,获取所述当前参数值以及所述待处理指令的立即数操作数的当前数值之和,作为待更新数值;在所述待更新数值不超出所述待处理指令的立即数操作数范围的情况下,将所述待处理指令的立即数操作数更新为所述待更新数值。这样,可以在对第二类指令的立即数操作数进行更新的同时,保证所更新的立即数不超出待处理指令的立即数操作数范围,保证指令的正常执行。
可选的,本发明实施例具体还可以包括:
S51、在所述预设参数的当前参数值不为0的情况下,执行所述基于所述预设参数的当前参数值对所述待处理指令的立即数操作数进行更新的操作。
具体的,本发明实施例可以在对待处理指令的立即数操作数进行更新之前,先判断预设参数的当前参数值是否为0,若不为0,则表明栈指针寄存器存在待计算的值,此时的栈指针寄存器的值不准确,需要对第二类指令的立即数操作数进行校正,此时可以执行上述基于预设参数的当前参数值对待处理指令的立即数操作数进行更新的操作。
相应地,若预设参数的当前参数值为0,则表明栈指针寄存器不存在待计算的值,此时的栈指针寄存器的值准确,从而无需对第二类寄存器的立即数操作数进行校正,可以直接获取下一条宿主机指令作为待处理指令。
本发明实施例中,在所述预设参数的当前参数值不为0的情况下,执行所述基于所述预设参数的当前参数值对所述待处理指令的立即数操作数进行更新的操作。这样,通过预设参数的当前参数值是否为0判断栈指针寄存器是否存在待计算的值,在不为0的情况下再执行对立即数操作数进行更新的操作,可以减少不必要的立即数操作数更新操作,降低数据处理量。
可选的,在上述待处理指令为所述第二类指令的情况下,本发明实施例具体还可以包括:
S61、若所述待处理指令的源操作数不包含立即数操作数,或,所述待更新数值超出所述待处理指令的立即数操作数范围,则基于所述预设参数的当前参数值生成一条第一类指令。
S62、将所生成的所述第一类指令插入为所述待处理指令的上一条指令,并将所述预设参数的参数值更新为0。
其中,在待处理指令的源操作数不包含立即数操作数的情况下,表明该第二类指令的执行往往是基于栈指针寄存器以及其他寄存器实现的,此时无法通过更新立即数操作数对第二类指令进行校正,因此,此时可以生成一条第一类指令对栈指针寄存器进行计算更新。相应地,在上述待更新数值超出待处理指令的立即数操作数范围时,表明若采用待更新数值对立即数操作数进行更新,可能导致第二类指令执行出错或无法执行,则此时可以不对第二类指令的立即数操作数进行更新,基于预设参数的当前参数值生成一条第一类指令对栈指针寄存器进行计算更新。
具体的,可以将预设参数的当前参数值作为第一类指令的立即数操作数,再将栈指针寄存器作为目的操作数以及一个源操作数即可得到一条第一类指令。
进一步地,生成第一类指令之后,可以将该第一类指令插入为待处理指令的上一条指令,即,将该第一类指令插入至宿主机指令流中待处理指令之前的位置。这样,可以保证在第二类指令执行之前,通过生成插入的第一类指令将栈指针寄存器更新至准确值,从而保证第二类指令的执行准确性。
本发明实施例中,若所述待处理指令的源操作数不包含立即数操作数,或,所述待更新数值超出所述待处理指令的立即数操作数范围,则基于所述预设参数的当前参数值生成一条第一类指令;将所生成的所述第一类指令插入为所述待处理指令的上一条指令,并将所述预设参数的参数值更新为0。这样,可以在无法对待处理指令的立即数操作数进行更新时,通过在待处理指令之前插入生成的栈指针计算指令,可以在第二类指令执行之前,通过生成插入的第一类指令将栈指针寄存器更新至准确值,从而保证第二类指令的执行准确性,避免由于合并第一类指令所带来的指令执行不准确的问题。
可选地,上述基于预设参数的当前参数值生成一条第一类指令的操作,可以是:
在所述预设参数的当前参数值不为0的情况下,基于所述预设参数的当前参数值生成一条第一类指令。
可以理解的,在预设参数的当前参数值为0时,表明栈指针寄存器不存在待更新的值,即栈指针寄存器的当前值为准确值,无需对其进行更新,从而无需通过生成并插入第一类指令实现对栈指针寄存器的更新,可以避免不必要的指令生成和插入操作。相应地,在预设参数的当前参数值不为0时,表明栈指针寄存器存在待更新的值,需要对其进行计算更新,从而在此情况下再生成并插入第一类指令实现对栈指针寄存器的更新。
需要说明的是,不同指令集体系结构(Instruction Set Architecture,ISA)的硬件设计能支持的指令存在诸多差异,这导致基于一种ISA指令集编译的可执行文件和其它平台不兼容,需要通过二进制翻译技术使得一种体系结构编译的程序也能在另一种体系结构的硬件平台上运行。而随着微处理器性能的不断提升,通过二进制翻译在一种CPU体系架构下运行另一种CPU体系架构的源程序的可行性越来越强,使得二进制翻译技术得到了更多的发展。但该技术目前仍存在翻译效率低下,冗余操作过多等技术问题。例如:在从CISC向精简指令集RISC进行翻译时,由于CISC架构的指令功能强大,一条指令可以执行复杂的操作,如内存访问算术运算和逻辑运算等。而RISC架构中倾向于使用简单的固定长度的指令,每条指令通常只执行一个简单的操作,为了实现复杂的功能,RISC架构下需要通过多条指令来组合实现。因此对于从CISC架构向RISC翻译的二进制翻译器,原始指令集的指令会被转换成更多的指令,导致二进制翻译器的执行效率低下。
示例性地,以x86架构作为GUEST平台,以LoongArch(LA)架构作为HOST平台为例,在x86架构中,RSP、ESP和SP均是用于表示栈指针的寄存器(即:栈指针寄存器),但它们适用于不同的位宽RSP用于表示64位寄存器,ESP表示32位寄存器,SP表示16位寄存器,RSP是64位寄存器,能够处理64位地址空间,ESP是32位寄存器,能够处理32位地址空间。SP是16位寄存器。下述描述均采用ESP来代指x86架构中的栈指针寄存器。
以x86架构为例,涉及到ESP寄存器计算的栈操作指令通常包括下表1所示出的指令:
表1
以采用用户模式仿真器(Quick EMUlator User Mode Emulation,QEMU)对客户机指令进行翻译为例,图3是本发明实施例提供的一种基本块的示意图,如图3所示,其中包含一个TB的指令,这8条指令均涉及到x86架构中栈指针寄存器的计算,Qemu 的处理是,在每一条 x86 的指令翻译中都如实计算栈指针寄存器。
下述表是相关技术中对图3所示的指令翻译后得到的指令示意,如下表2所示:
表2
其中,表中的“inst_xx”表示其他指令,“reg_*”表征与栈指针寄存器不相关的寄存器, $s4 表征寄存器映射后的 x86的栈指针寄存器。其中,上述宿主机指令中的“addi.drd,rj, si12”表征将通用寄存器 rj 中的 [63:0] 位数据加上 12 比特立即数 si12 符号扩展后的 64位数据,将所得结果写入通用寄存器 rd 中。“add.d rd,rj,rk”表征将通用寄存器rj中的 [63:0]位数据加上通用寄存器 rk 中的 [63:0] 位数据,所得结果写入通用寄存器 rd 中。“ld.d rd, rj, si12”表征从内存取回一个双字的数据写入通用寄存器rd,指令的访存地址计算方式是将通用寄存器 rj 中的值与符号扩展后的 12 比特立即数si12 相加求和。可以看到,翻译后的代码有 7 条指令涉及栈指针寄存器的计算(addi.d $s4,$s4,8)且这7条指令的源操作数均包含栈指针寄存器以及立即数操作数,即上述翻译后的指令流包含7条第一类指令。
上表示例的X86客户机程序基本块仅包含了涉及出栈操作的POP和RET指令,对64位寄存器,出栈指令使得栈指针增加8。由此,在LA宿主机基本块中,使用addi.d $s4, $s4,8作为栈指针计算指令(第一类指令),计算栈指针。本领域技术人员理解,对涉及入栈操作的PUSH和CALL指令,栈指针减少,addi.d变为sub.d减法指令。图4是本发明实施例提供的另一种二进制翻译方法的流程示意图,如图4所示,本发明实施例针对翻译后得到的一个基本块包含的宿主机指令流,可以设置预设参数off,可以设置off的初始值为0,并从宿主机指令流中获取待处理指令,并判断待处理指令是否为结束指令(逻辑结束指令),若否,则表明还存在未处理的宿主机指令,此时可以判断该待处理指令是否为第一类指令,若是,则对预设参数off的参数值进行更新,并从宿主机指令流中移除该条指令,并再次获取下一条宿主机指令作为待处理指令。
相应地,若待处理指令为逻辑结束指令,即不存在待处理指令,则可以判断预设参数off是否为0,若否,则需要插入指令校正栈指针寄存器,即:基于预设参数的当前参数值生成一条第一类指令插入至逻辑结束指令之前。若off为0,则表明栈指针寄存器无需更新校正,此时直接结束指令处理流程即可。
相应地,若待处理指令不为第一类指令,则可以判断待处理指令是否为第二类指令,以及判断预设参数off是否不为0,若待处理指令不为第二类指令或预设参数的当前参数值为0,则无需对待处理指令进行处理,直接获取下一条宿主机指令作为待处理指令即可。若待处理指令为第二类指令且off不为0,则进一步判断待处理指令的源操作数是否包含立即数操作数imm,且off与imm之和(off+imm)是否在立即数操作数imm的表达范围,若是,则对待处理指令的立即数操作数进行更新,更新imm=imm+off,并再次获取下一条宿主机指令作为待处理指令。相应地,若否,即若待处理指令的源操作数不包含立即数操作数imm,或off+imm不在imm的表达范围(off+imm超出imm的表达范围),则需要插入指令校正栈指针寄存器,即:基于预设参数的当前参数值生成一条第一类指令插入至待处理指令之前。之后,将预设参数的参数值重新初始化为0。
通过上述指令处理之后,本发明实施例可以将图3所示出的客户机指令流翻译后的宿主机指令流优化为下表3所示:
表3
通过上表可以看出,本发明实施例可以对源操作数包含栈指针寄存器以及立即数操作数的栈指针计算指令进行延迟合并计算,将上述示例的 7 条栈指针计算指令优化为1 条,删除部分栈指针计算指令,减少了翻译后生成的代码指令的数量,降低了翻译后的指令膨胀率,从而提升二进制翻译器的运行效率。
在另一个实施例中,提供了这样一种二进制翻译方法,将复杂指令集架构的客户机指令按基本块翻译为精简指令集的宿主机指令,包括以下操作:
将基本块中的多个客户机栈操作指令中的每个翻译为包含宿主机的栈访存指令和用于调整栈顶的栈指针计算指令的组合,所述栈访存指令和栈指针计算指令的源操作数包括栈指针寄存器和立即数;
从宿主机指令流中移除至少部分栈指针计算指令;
修改栈访存指令中的立即数偏移量来使栈访存操作指向栈顶,以补偿移除的栈指针计算指令的栈顶调整;以及
用一条栈指针计算指令实现被移除的栈指针指令所累积的栈指针调整。
如表2示例,X86的POP指令包含加载和调整栈指针的操作,被翻译为包含LA的ld.d访存指令和addi加法指令的组合,ld.d将栈顶数据加载到栈指针寄存器$s4中,addi.d $s4, $s4, 8指令用于调整栈指针,调整后的栈指针用于下一ld.d操作。
表2的LA指令序列中存在冗余。为优化冗余,如表3所示,与每个POP指令对应的addi.d $s4, $s4, 8指令被从LA指令序列中移除,另一方面,修改栈访存指令中的立即数偏移量来使栈访存操作指向栈顶,以保证操作的准确。在表2和3的实施例中,对应于POP指令,LA中的ld.d指令的立即数偏移量递增8,补偿了addi.d $s4, $s4, 8的栈指针调整操作。可以理解,对PUSH指令,可以使用subi.d $s4, $s4, 8的来补偿栈指针调整操作。
在基本块结束前,统一修正$s4,通过一条addi指令补偿所有被移除的栈指针计算指令,确保基本块结束时栈指针寄存器$s4中数据的正确性。
用于补偿的指令可以是基本块中剩余的一条栈指针计算指令。例如,在表3中,ret对应的LA栈指针计算指令addi未被移除,但其立即数偏移量被调整为56,累积了所有被移除指令的栈指针调整。
可替代地,不使用ret对应的addi,而是在作为基本块结束标志的ret前插入一条栈指针计算指令,实现基本块中所有被移除的栈指针指令的累积栈指针调整。
X86客户机栈操作指令包括表1中的出栈指令POP、入栈指令PUSH、函数调用CALL和返回指令RET,以及栈管理指令ENTER和LEAVE。对于包含出栈操作的指令,除了表2示例中的POP和RET,还有CALL和LEAVE,出栈操作使栈指针增加,LA中的栈指针计算指令是加法指令addi;对包含入栈操作的指令,栈指针减少,栈指针计算指令是减法指令。
以上实施例中,将基本块中的多个X86客户机栈操作指令中的每个翻译为包含宿主机的栈访存指令和用于调整栈顶的栈指针计算指令的组合,然后对翻译后的指令序列中的冗余进行优化。
在另一实施例中,将基本块中的多个客户机栈操作指令翻译为多个宿主机栈访存指令和一个栈指针计算指令,所述栈访存指令和栈指针计算指令的源操作数包括栈指针寄存器和立即数。例如,将表3第1列的X86指令序列直接翻译为第3列的LA指令,而不是翻译为第2列后再进行优化。
基于每个客户机栈操作指令的类型,宿主机栈访存指令的立即数偏移量被调整,以使每个栈访存操作指向栈顶。例如,对于POP指令,栈访存指令的立即数偏移量递增。
栈指针计算指令的立即数偏移量反映多个宿主机访存指令的立即数偏移量的累积。同样地,在基本块结束前,统一修正$s4,确保基本块结束时栈指针寄存器$s4中数据的正确性。例如,表3中,addi.d $s4, $s4, 56,立即数偏移量反映了7条X86栈操作指令的立即数偏移量的累积。
图5是本发明实施例提供的一种指令处理装置的结构图,所述装置应用于翻译器,如图5所示,该装置20可以包括:
第一获取模块201,用于在将客户机指令流翻译为宿主机指令流后,获取所述宿主机指令流包含的第一类指令;所述第一类指令为栈指针计算指令且所述第一类指令的源操作数包含栈指针寄存器以及立即数操作数;
合并模块202,用于在所述第一类指令的数量为M的情况下,基于各所述第一类指令的源操作数,将所述M条第一类指令合并为N条第一类指令;所述M为大于1的正整数,所述N为小于M的正整数。
可选的,所述合并模块,包括:
第二获取子模块,用于按照指令执行顺序,从所述宿主机指令流中获取宿主机指令作为待处理指令;
第一更新子模块,用于若所述待处理指令为所述第一类指令,基于所述待处理指令的立即数操作数对预设参数的参数值进行更新,并从所述宿主机指令流中删除所述待处理指令;所述预设参数的初始值为0;
第一执行子模块,用于再次执行所述从所述宿主机指令流中获取宿主机指令作为待处理指令的操作,直至当前的待处理指令为逻辑结束指令的情况下,基于所述预设参数的当前参数值生成一条第一类指令,并将所生成的第一类指令插入为所述逻辑结束指令的上一条指令。
可选的,所述装置还包括:
第二更新模块,用于若所述待处理指令为第二类指令,在所述待处理指令的源操作数包含立即数操作数的情况下,基于所述预设参数的当前参数值对所述待处理指令的立即数操作数进行更新;所述第二类指令为所述第一类指令之外的源操作数中包含栈指针寄存器的指令;
第二执行模块,用于再次执行所述从所述宿主机指令流中获取宿主机指令作为待处理指令的操作。
可选的,所述第二更新模块,包括:
第二获取子模块,用于获取所述当前参数值以及所述待处理指令的立即数操作数的当前数值之和,作为待更新数值;
第三更新子模块,用于在所述待更新数值不超出所述待处理指令的立即数操作数范围的情况下,将所述待处理指令的立即数操作数更新为所述待更新数值。
可选的,所述装置还包括:
第三执行模块,用于在所述预设参数的当前参数值不为0的情况下,执行所述基于所述预设参数的当前参数值对所述待处理指令的立即数操作数进行更新的操作。
可选的,所述装置还包括:
生成模块,用于在所述待处理指令为所述第二类指令的情况下,若所述待处理指令的源操作数不包含立即数操作数,或,所述待更新数值超出所述待处理指令的立即数操作数范围,则基于所述预设参数的当前参数值生成一条第一类指令;
插入模块,用于将所生成的所述第一类指令插入为所述待处理指令的上一条指令,并将所述预设参数的参数值更新为0。
综上所述,本发明实施例在将客户机指令流翻译为宿主机指令流后,获取所述宿主机指令流包含的第一类指令;所述第一类指令为栈指针计算指令且所述第一类指令的源操作数包含栈指针寄存器以及立即数操作数;在所述第一类指令的数量为M的情况下,基于各所述第一类指令的源操作数,将所述M条第一类指令合并为N条第一类指令;所述M为大于1的正整数,所述N为小于M的正整数。这样,本发明实施例可以针对翻译后执行前的宿主机指令进行处理,将M条第一类指令合并处理为N条,减少翻译后的第一类指令的数量,降低翻译后的指令膨胀率,从而提高翻译器的执行效率。
本申请还提供了一种电子设备,参见图6,包括:处理器701、存储器702以及存储在所述存储器上并可在所述处理器上运行的计算机程序7021,所述处理器执行所述程序时实现前述实施例的二进制翻译方法。
本申请还提供了一种可读存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行前述实施例的二进制翻译方法。
本申请还提供了一种二进制翻译器程序产品,在宿主机上运行时,执行本申请各实施例的二进制翻译方法。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本发明并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明的排序设备中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
Claims (15)
1.一种二进制翻译方法,其特征在于,所述方法应用于翻译器,所述方法包括:
在将客户机指令流翻译为宿主机指令流后,获取所述宿主机指令流包含的第一类指令;所述第一类指令为栈指针计算指令且所述第一类指令的源操作数包含栈指针寄存器以及立即数操作数;所述第一类指令用于对所述栈指针寄存器的值进行计算更新;
在所述第一类指令的数量为M的情况下,基于各所述第一类指令的源操作数,将所述M条第一类指令合并为N条第一类指令;合并包括:从M条第一类指令中移除部分第一类指令,保留N条第一类指令,用所述N条第一类指令实现被移除的第一类指令所累积的栈指针调整;所述M为大于1的正整数,所述N为小于M的正整数;所述宿主机指令流还包括栈访存指令;
所述方法还包括:修改栈访存指令中的立即数偏移量来使栈访存操作指向栈顶,以补偿移除的所述第一类指令的栈顶调整。
2.根据权利要求1所述的方法,其特征在于,所述基于各所述第一类指令的源操作数,将所述M条第一类指令合并为N条第一类指令,包括:
按照指令执行顺序,从所述宿主机指令流中获取宿主机指令作为待处理指令;
若所述待处理指令为所述第一类指令,基于所述待处理指令的立即数操作数对预设参数的参数值进行更新,并从所述宿主机指令流中删除所述待处理指令;所述预设参数的初始值为0;
再次执行所述从所述宿主机指令流中获取宿主机指令作为待处理指令的操作,直至当前的待处理指令为逻辑结束指令的情况下,基于所述预设参数的当前参数值生成一条第一类指令,并将所生成的第一类指令插入为所述逻辑结束指令的上一条指令。
3.根据权利要求2所述的方法,其特征在于,所述从所述宿主机指令流中获取宿主机指令作为待处理指令之后,所述方法还包括:
若所述待处理指令为第二类指令,在所述待处理指令的源操作数包含立即数操作数的情况下,基于所述预设参数的当前参数值对所述待处理指令的立即数操作数进行更新;所述第二类指令为所述第一类指令之外的源操作数中包含栈指针寄存器的指令;
再次执行所述从所述宿主机指令流中获取宿主机指令作为待处理指令的操作。
4.根据权利要求3所述的方法,其特征在于,所述基于所述预设参数的当前参数值对所述待处理指令的立即数操作数进行更新,包括:
获取所述当前参数值以及所述待处理指令的立即数操作数的当前数值之和,作为待更新数值;
在所述待更新数值不超出所述待处理指令的立即数操作数范围的情况下,将所述待处理指令的立即数操作数更新为所述待更新数值。
5.根据权利要求3所述的方法,其特征在于,所述方法还包括:
在所述预设参数的当前参数值不为0的情况下,执行所述基于所述预设参数的当前参数值对所述待处理指令的立即数操作数进行更新的操作。
6.根据权利要求4所述的方法,其特征在于,在所述待处理指令为所述第二类指令的情况下,所述方法还包括:
若所述待处理指令的源操作数不包含立即数操作数,或,所述待更新数值超出所述待处理指令的立即数操作数范围,则基于所述预设参数的当前参数值生成一条第一类指令;
将所生成的所述第一类指令插入为所述待处理指令的上一条指令,并将所述预设参数的参数值更新为0。
7.根据权利要求1所述的方法,其特征在于,客户机是复杂指令集架构,宿主机是精简指令集架构。
8.一种二进制翻译方法,将复杂指令集架构的客户机指令按基本块翻译为精简指令集的宿主机指令,包括:
将基本块中的多个客户机栈操作指令中的每个翻译为宿主机的栈访存指令和用于调整栈顶的栈指针计算指令的组合,所述栈访存指令和栈指针计算指令的源操作数包括栈指针寄存器和立即数;
从宿主机指令流中移除至少部分栈指针计算指令;
修改栈访存指令中的立即数偏移量来使栈访存操作指向栈顶,以补偿被移除的栈指针计算指令的栈顶调整;以及
用一条栈指针计算指令实现被移除的栈指针指令所累积的栈指针调整。
9.根据权利要求8所述的方法,其中,所述客户机栈操作指令包括出栈指令、入栈指令、函数调用和返回指令、栈管理指令;所述栈指针计算指令包括加法指令或减法指令。
10.根据权利要求8所述的方法,其中,用剩余的未移除栈指针计算指令实现被移除的栈指针指令的累积栈指针调整。
11.根据权利要求8所述的方法,其中,在基本块结束前,插入一条栈指针计算指令,实现基本块中所有被移除的栈指针指令的累积栈指针调整。
12.一种二进制翻译方法,将复杂指令集架构的客户机指令按基本块翻译为精简指令集的宿主机指令,方法包括:
将基本块中的多个客户机栈操作指令翻译为多个宿主机栈访存指令和一个栈指针计算指令,所述栈访存指令和栈指针计算指令的源操作数包括栈指针寄存器和立即数;
基于每个客户机栈操作指令的类型,每个宿主机栈访存指令的立即数偏移量被调整,以使每个栈访存操作指向栈顶;以及
所述栈指针计算指令的立即数偏移量反映所述多个宿主机栈访存指令的立即数偏移量的累积。
13.一种电子设备,其特征在于,包括:
处理器、存储器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1-12中任一项所述的方法。
14.一种可读存储介质,其特征在于,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行权利要求1-12中任一项所述的方法。
15.一种二进制翻译程序产品,包含指令,当所述指令由处理器执行时,使得所述处理器执行权利要求1-12中任一项所述的方法。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202510206930.0A CN119718552B (zh) | 2025-02-24 | 2025-02-24 | 二进制翻译方法、电子设备、可读存储介质及程序产品 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202510206930.0A CN119718552B (zh) | 2025-02-24 | 2025-02-24 | 二进制翻译方法、电子设备、可读存储介质及程序产品 |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| CN119718552A CN119718552A (zh) | 2025-03-28 |
| CN119718552B true CN119718552B (zh) | 2026-04-10 |
Family
ID=95081808
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN202510206930.0A Active CN119718552B (zh) | 2025-02-24 | 2025-02-24 | 二进制翻译方法、电子设备、可读存储介质及程序产品 |
Country Status (1)
| Country | Link |
|---|---|
| CN (1) | CN119718552B (zh) |
Citations (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN114995832A (zh) * | 2022-06-28 | 2022-09-02 | 湖南卡姆派乐信息科技有限公司 | 一种动静结合的二进制程序翻译方法 |
| CN117369829A (zh) * | 2023-07-20 | 2024-01-09 | 龙芯中科技术股份有限公司 | 二进制翻译方法、电子设备及存储介质 |
Family Cites Families (6)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US5930509A (en) * | 1996-01-29 | 1999-07-27 | Digital Equipment Corporation | Method and apparatus for performing binary translation |
| US6535903B2 (en) * | 1996-01-29 | 2003-03-18 | Compaq Information Technologies Group, L.P. | Method and apparatus for maintaining translated routine stack in a binary translation environment |
| AU2001236976A1 (en) * | 2000-02-14 | 2001-08-27 | Chicory Systems, Inc. | Delayed update of a stack pointer and program counter |
| CN100555225C (zh) * | 2008-03-17 | 2009-10-28 | 中国科学院计算技术研究所 | 一种支持x86虚拟机的risc处理器装置及方法 |
| CN116501451B (zh) * | 2023-06-25 | 2023-10-17 | 中国科学院计算技术研究所 | 二进制翻译方法、翻译控制方法、指令执行方法及装置 |
| CN119225902A (zh) * | 2024-08-14 | 2024-12-31 | 龙芯中科技术股份有限公司 | 二进制翻译方法、装置、电子设备及可读存储介质 |
-
2025
- 2025-02-24 CN CN202510206930.0A patent/CN119718552B/zh active Active
Patent Citations (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN114995832A (zh) * | 2022-06-28 | 2022-09-02 | 湖南卡姆派乐信息科技有限公司 | 一种动静结合的二进制程序翻译方法 |
| CN117369829A (zh) * | 2023-07-20 | 2024-01-09 | 龙芯中科技术股份有限公司 | 二进制翻译方法、电子设备及存储介质 |
Also Published As
| Publication number | Publication date |
|---|---|
| CN119718552A (zh) | 2025-03-28 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| JP5263702B2 (ja) | プログラム・コードを変換するためのコンピュータ・システム、方法、及びコンピュータ可読記録媒体 | |
| KR101642556B1 (ko) | 이진 번역을 수행하기 위한 방법 및 시스템 | |
| JP5005342B2 (ja) | ワイド・トランスフォーム・スライス・インストラクションを実行するプロセッサアーキテクチャ | |
| US6324686B1 (en) | Just in time compiler technique | |
| US8499293B1 (en) | Symbolic renaming optimization of a trace | |
| US9501423B2 (en) | Program execution device and compiler system | |
| CN111290952A (zh) | 一种动态链接库函数的跟踪方法及装置 | |
| CN114924810A (zh) | 一种异构程序执行方法、装置、计算设备及可读存储介质 | |
| JPS63132338A (ja) | コード生成方法 | |
| US20240184547A1 (en) | Code processing method in hardware memory order architecture and corresponding apparatus | |
| US7730463B2 (en) | Efficient generation of SIMD code in presence of multi-threading and other false sharing conditions and in machines having memory protection support | |
| CN119248286B (zh) | 一种基于访存指令重构的跨内存页差异兼容运行方法 | |
| US20140365735A1 (en) | Computing apparatus, computing method, and computing program | |
| JP4684571B2 (ja) | エミュレーションコンピュータ技術を実行する直接命令 | |
| US9182960B2 (en) | Loop distribution detection program and loop distribution detection method | |
| CN114237612A (zh) | 程序代码的编译方法、装置、电子设备及存储介质 | |
| CN117112127A (zh) | 二进制翻译方法、装置、电子设备及可读存储介质 | |
| CN119718552B (zh) | 二进制翻译方法、电子设备、可读存储介质及程序产品 | |
| CN119473394B (zh) | 一种基于循环依赖分析的avx指令模拟执行优化方法 | |
| US7966474B2 (en) | System, method and computer program product for translating storage elements | |
| Engelke et al. | Robust practical binary optimization at run-time using llvm | |
| CN115393174B (zh) | 一种粗粒度的图像神经网络加速器指令集架构方法及装置 | |
| CN119225902A (zh) | 二进制翻译方法、装置、电子设备及可读存储介质 | |
| CN113454593A (zh) | 保持多个机器生成上的复杂功能的兼容性 | |
| US8701119B1 (en) | Parsing XML in software on CPU with multiple execution units |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| PB01 | Publication | ||
| PB01 | Publication | ||
| SE01 | Entry into force of request for substantive examination | ||
| SE01 | Entry into force of request for substantive examination | ||
| GR01 | Patent grant | ||
| GR01 | Patent grant |