二进制翻译中间接跳转指令的翻译方法及其系统的制作方法

文档序号:6584632阅读:228来源:国知局

专利名称::二进制翻译中间接跳转指令的翻译方法及其系统的制作方法
技术领域
:本发明涉及的是计算机领域中二进制翻译领域,尤其涉及二进制翻译中间接跳转指令的翻译方法及其系统。
背景技术
:二进制翻译器功能是将一种指令集体系结构(ISA)上的可执行程序翻译到另一种ISA上执行。当源机器和目标机器的ISA不同时,可以实现不同机器间的代码迁移。该项技术可以用于解决遗产代码的移植,为某一处理器提供更加丰富的软件资源等。当ISA相同时,该项技术可以用于实现动态优化和软件插桩等。另外在虚拟机系统的实现中,存在一个关键步骤就是二进制翻译。上述开发过程中,均会面临的问题为如何高效地处理程序中存在的间接跳转指令。间接跳转指令不同于普通的跳转指令,它的跳转目标地址只有在运行的时刻才能够获得。例如IntelX86体系结构上间接跳转指令的格式如下所示。FF/4JMPr/ml6Jumpnear,absoluteindirect,addressgiveninr/ml6FF/4JMPr/m32Jumpnear,absoluteindirect,addressgiveninr/m32FF/5JMPml6:16Jumpnear,absoluteindirect,addressgiveninml6:16FF/4JMPml6:32Jumpnear,absoluteindirect,addressgiveninml6:32可见,间接跳转指令的操作数可能是寄存器,也可能是内存,该操作数指示的内存地址中存放的内容即为要跳转的目标地址。在二进制翻译系统中,如何有效地翻译上述间接跳转指令,从而达到较高的运行效率,成为现有技术中的一个问题。现有技术中的方法是在内存中构造一个哈希表,该表记录了源机器上跳转目标地址,简称为源PC,和相应的本地码地址,简称为目标PC,的对应关系。当遇到间接跳转指令时,就生成查询哈希表的代码。如果查询成功,就将对应的目标PC装载到一个临时寄存器,跳转到目标PC处继续执行;如果查询失败,就返回到二进制翻译器的运行时环境,并对源PC处的代码进行翻译。翻译完成后修改哈希表对应表项的内容,以备以后查询。该方法在每次执行间接跳转指令时,都需要查询哈希表,开销太大。
发明内容为解决上述问题,本发明提供了一种二进制翻译中间接跳转指令的翻译方法及其系统,能够减少了访问内存的开销,提高了二进制翻译的效率。本发明公开了一种二进制翻译中间接跳转指令的翻译方法,包括步骤l,在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是则进行标记,获得被标记的间接跳转指令的源跳转表;步骤2,在翻译时,将被标记的间接跳转指令翻译为根据待构建的所述被标记的间接跳转指令的目标跳转表的内容进行跳转的指令,为所述目标跳转表预留重定位项;步骤3,翻译完所述被标记的间接跳转指令后,根据所述间接跳转指令的源跳转表构建所述间接跳转指令的目标跳转表;步骤4,将构建的所述目标跳转表的地址写入所述重定位项。所述步骤l进一步为,步骤21,在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是,则对所述间接跳转指令进行标记;步骤22,获得所述被标记的间接跳转指令的源跳转表的大小,所述源跳转表中记载的各个跳转目标地址,记录计算所述源跳转表索引的指令。所述步骤2进一步为,步骤31,翻译所述计算源跳转表的索引的指令,在索引所述目标跳转表时使用所述索引;步骤32,将被标记的间接跳转指令翻译为根据所述索引从待构建的所述间接跳转指令的目标跳转表中获得对应表项,并按所述表项的内容进行跳转的指令;步骤33,为所述目标跳转表预留重定位项。所述步骤3进一步为,步骤41,翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同;步骤42,判断源跳转表的表项中的跳转地址是否已被翻译并生成对应的本地码,如果是,执行步骤43,否则,执行步骤44;步骤43,将所述对应的本地码的入口地址填入所述目标跳转表对应的表项中;步骤44,将所述目标跳转表对应的表项填为跳转到翻译控制器的代码入口地址。所述步骤1和所述步骤2之间还包括步骤51,将被标记的间接跳转指令的翻译中取源跳转表表项内容的指令对应生成的本地码移到跳转寄存器指令之后;所述步骤3进一步为,步骤51,翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同;步骤52,判断源跳转表的表项中的跳转地址是否已被翻译并生成对应的本地码,如果是,执行步骤53,否则,执行步骤54;步骤53,将所述对应的本地码的入口地址填入所述目标跳转表对应的表项中;步骤54,将所述目标跳转表对应的表项填为所述跳转寄存器指令的下一条指令的地址。所述步骤2还包括,对于未被标记的间接跳转指令,按查找哈希表的方法进行翻译。本发明还公开了一种二进制翻译中间接跳转指令的翻译系统,包括间接跳转指令标识模块,用于在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是则进行标记,获得被标记的间接跳转指令的源跳转表;翻译模块,用于在翻译时,将被标记的间接跳转指令翻译为根据待构建的所述被标记的间接跳转指令的目标跳转表的内容进行跳转的指令,为所述目标跳转表预留重定位项;目标跳转表构建模块,用于在翻译完所述被标记的间接跳转指令后,根据所述间接跳转指令的源跳转表构建所述间接跳转指令的目标跳转表;所述翻译模块还用于将构建的所述目标跳转表的地址写入所述预留的重定位项,完成翻译。所述间接跳转指令标识模块进一步用于在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是,则对所述间接跳转指令进行标记;获得所述被标记的间接跳转指令的源跳转表的大小,所述源跳转表中记载的各个跳转目标地址,记录计算所述源跳转表索弓I的指令。所述翻译模块在所述目标跳转表被构建前进一步用于翻译所述计算源跳转表的索引的指令,在索引所述目标跳转表时使用所述索引;将被标记的间接跳转指令翻译为根据所述索引从待构建的所述间接跳转指令的目标跳转表中获得对应表项,并按所述表项的内容进行跳转的指令;为所述目标跳转表预留重定位项。所述目标跳转表构建模块进一步用于翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同;判断源跳转表的表项中的跳转地址是否已被翻译并生成对应的本地码,如果是,将所述对应的本地码的入口地址填入所述目标跳转表对应的表项中,否则,将所述目标跳转表对应的表项填为跳转到翻译控制器的代码入口地址。所述系统在所述间接跳转指令标识模块和所述翻译模块之间还包括指令修改模块,用于将被标记的间接跳转指令的翻译中取源跳转表表项内容的指令对应生成的本地码移到跳转寄存器指令之后;所述目标跳转表构建模块进一步用于翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同;判断源跳转表的表项中的跳转地址是否已被翻译并生成对应的本地码,如果是,将所述对应的本地码的入口地址填入所述目标跳转表对应的表项中,否则,将所述目标跳转表对应的表项填为所述跳转寄存器指令的下一条指令的地址。所述翻译模块还用于对于未被标记的间接跳转指令,按查找哈希表的方法进行翻译。本发明的有益效果在于,通过根据源跳转表构造目标跳转表,依据目标跳转表进行翻译,相比于查找哈希表方法,能够减少访问内存的开销,提高了二进制翻译的效率。图1是本发明的二进制翻译中间接跳转指令的翻译方法的流程图;图2是本发明的二进制翻译中间接跳转指令的翻译系统的结构图。具体实施例方式下面结合附图,对本发明做进一步的详细描述。本发明的二进制翻译中间接跳转指令的翻译方法如图1所示。步骤S100,在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断该间接CN跳转指令是否为多分支语句或虚函数调用,如果是则进行标记,获得被标记的间接跳转指令的源跳转表。当反汇编到源平台上的间接跳转指令时,首先根据反汇编出的源指令序列对多分支语句和虚函数调用语句进行识别,具体实施方式中识别方法为中国发明专利"二进制翻译中经由跳转表的多目标分支语句的识别方法",申请号200510085509.1。该专利通过语义图匹配的方法进行多目标分支语句的识别。首先为反汇编出的源指令序列构造语义图,然后将该语义图和多目标分支语句的标准语义图进行匹配。如果匹配成功,则该间接跳转指令就被识别为多目标分支语句,否则不被识别。如上所述如果识别成功,则标记该间接跳转指令,同时获取该间接跳转指令对应的源跳转表的大小,以及源跳转表的各项内容,源跳转表的各项内容为各个跳转目标地址,并记录下计算源跳转表索引的指令。步骤S200,在翻译时,将被标记的间接跳转指令翻译为根据待构建的所述被标记的间接跳转指令的目标跳转表的内容进行跳转的指令,为该目标跳转表预留重定位项。翻译间接跳转指令时,检查所述步骤S100中对该间接跳转指令的标记,如果是未标记为多分支语句和虚函数调用类型的间接跳转,则按照现有技术中的方法进行翻译,例如将间接跳转指令翻译为查询哈希表的本地码;如果是标记为多分支语句或虚函数调用语句类型的间接跳转,则按照下面的步骤翻译该间接跳转指令。步骤S201,翻译步骤S100中记录的计算源跳转表索引的指令,该索引同时用来索引目标跳转表。步骤S202,翻译生成索引目标跳转表,获取对应表项的内容,根据获取的该表项的内容进行跳转的指令。步骤S203,为所述目标跳转表预留重定位项。由于此时该被标记的间接跳转指令对应的目标跳转表还未被构造,所以需要在翻译该间接跳转指令时为该被标记的间接跳转指令的目标跳转表预留下重定位项,以在构造完目标跳转表后就可以知道目标跳转表的地址。步骤S300,翻译完所述被标记的间接跳转指令后,根据该间接跳转指令的源跳转表构建该间接跳转指令的目标跳转表。当翻译完间接跳转指令后,如果该间接跳转指令被识别为多分支语句或虚函数调用语句,则为该间接跳转指令构造目标跳转表。具体实施方式如下所述。步骤S301,目标跳转表的大小和源跳转表的大小一致,实施例中每一项的内容为一个32位的地址值。步骤S302,如果源跳转表表项中的跳转地址存在已翻译的本地码,则向目标跳转表对应的表项中填入该已翻译的本地码入口地址;如果没有已翻译的本地码,也就是源跳转表中的跳转地址还未被翻译,则将相应的目标跳转表的表项填入跳转到翻译控制器的代码入口地址。步骤S400,将构建的所述目标跳转表的地址写入所述重定位项。由于所述步骤S200在翻译间接跳转指令时,对于识别为多分支语句或虚函数调用语句的间接跳转指令的翻译留下了关于该间接跳转指令的目标跳转表的重定位项,所以在步骤S400中把步骤S300中构造目标跳转表地址写入到重定位项中,以在程序运行的时候就可以找到对应的目标跳转表。—较佳的具体实施方式如下所述。所述步骤S100和所述步骤S200之间还包括步骤S110,将被标记的间接跳转指令的翻译中取源跳转表表项内容的指令对应生成的本地码移到跳转寄存器指令之后。所述步骤S300的具体实施方式如下所述。步骤S310,翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同。步骤S320,判断源跳转表的表项中的跳转地址是否为已被翻译的本地码,如果是,执行步骤S330,否则,执行步骤S340。步骤S330,将所述已被翻译的本地码的入口地址填入所述目标跳转表对应的表项中。步骤S340,将所述目标跳转表对应的表项填为所述间接跳转指令的下一条指令的地址。根据步骤S100中识别的结果,对取源跳转表地址的指令翻译进行修改。例如,间接跳转指令为SI:加p氺table—base(,%index,4)该间接跳转指令被翻译成跳转到目标跳转表的指令D12、D13和D14,在该指令之前取源跳转表表项内容的指令被翻译成Dll。Dll:ld%info,table_base(,%index,4)D12:sl1%index,%index,2D13:ld%t卿2,table_base_dest(%index)D14:jr%t卿2由于源跳转表表项存放的内容是源跳转目标PC的值,所以如果目标跳转表中放置的已经是源跳转目标对应的本地码入口地址,该步操作为多余。但是如果目标跳转表里放的不是对应的本地码入口地址,则需要取源跳转目标PC的值,这是因为翻译控制器需要根据该PC完成翻译工作。由于大部分的指令都已经被翻译完成,所以上述后一种情况出现的可能性较小,因而可以把上述取源跳转表表项内容的指令被翻译生成的指令Dll移到跳转到目标跳转表的指令D12、D13和D14之后。D21:sll%index,%index,2D22:ld%t卿2,table_base_dest(%index)D23:jr%t卿2D24:ld%info,table_base(,%index,4)D25:ld%Ret_BT,Ret_BT_AddrD26:jr%Ret_BT同时在构造目标跳转表时依据如下规则如果不存在和源跳转表中源跳转目标对应的本地码,即源跳转目标还未被翻译,则目标跳转表对应项存放间接跳转指令下一条指令的地址,也就是D24指令的地址。按照上述描述的原则构造目标跳转表后,能够省掉对源跳转表的访问,进一步减少访存次数,降低访存开销。二进制翻译中间接跳转指令的翻译系统如图2所示,包括间接跳转指令标识模块100,用于在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是则进行标记,获得被标记的间接跳转指令的源跳转表。翻译模块200,用于在翻译时,将被标记的间接跳转指令翻译为根据待构建的所述被标记的间接跳转指令的目标跳转表的内容进行跳转的指令,为所述目标跳转表预留重定位项。目标跳转表构建模块300,用于在翻译完所述被标记的间接跳转指令后,根据所述间接跳转指令的源跳转表构建所述间接跳转指令的目标跳转表。翻译模块200还用于将构建的所述目标跳转表的地址写入所述预留的重定位项,完成翻译。较佳的,所述间接跳转指令标识模块100进一步用于在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是,则对所述间接跳转指令进行标记;获得所述被标记的间接跳转指令的源跳转表的大小,所述源跳转表中记载的各个跳转目标地址,记录计算所述源跳转表索引的指令。较佳的,翻译模块200在目标跳转表被构建前进一步用于翻译所述计算源跳转表的索引的指令,在索引所述目标跳转表时使用所述索引;将被标记的间接跳转指令翻译为根据所述索引从待构建的所述间接跳转指令的目标跳转表中获得对应表项,并按所述表项的内容进行跳转的指令;为所述目标跳转表预留重定位项。较佳的,目标跳转表构建模块300进一步用于翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同;判断源跳转表的表项中的跳转地址是否已被翻译并生成对应的本地码,如果是,将所述对应的本地码的入口地址填入所述目标跳转表对应的表项中,否则,将所述目标跳转表对应的表项填为跳转到翻译控制器的代码入口地址。较佳的,所述系统在间接跳转指令标识模块100和翻译模块200之间还包括指令修改模块,用于将被标记的间接跳转指令的翻译中取源跳转表表项内容的指令对应生成的本地码移到跳转寄存器指令之后。目标跳转表构建模块300进一步用于翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同;判断源跳转表的表项中的跳转地址是否已被翻译并生成对应的本地码,如果是,将所述对应的本地码的入口地址填入所述目标跳转表对应的表项中,否则,将所述目标跳转表对应的表项填为所述跳转寄存器指令的下一条指令的地址。较佳的,翻译模块200还用于对于未被标记的间接跳转指令,按查找哈希表的方法进行翻译。本领域的技术人员在不脱离权利要求书确定的本发明的精神和范围的条件下,还可以对以上内容进行各种各样的修改。因此本发明的范围并不仅限于以上的说明,而是由权利要求书的范围来确定的。权利要求一种二进制翻译中间接跳转指令的翻译方法,其特征在于,包括步骤1,在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是则进行标记,获得被标记的间接跳转指令的源跳转表;步骤2,在翻译时,将被标记的间接跳转指令翻译为根据待构建的所述被标记的间接跳转指令的目标跳转表的内容进行跳转的指令,为所述目标跳转表预留重定位项;步骤3,翻译完所述被标记的间接跳转指令后,根据所述间接跳转指令的源跳转表构建所述间接跳转指令的目标跳转表;步骤4,将构建的所述目标跳转表的地址写入所述重定位项。2.如权利要求1所述的二进制翻译中间接跳转指令的翻译方法,其特征在于,所述步骤l进一步为,步骤21,在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是,则对所述间接跳转指令进行标记;步骤22,获得所述被标记的间接跳转指令的源跳转表的大小,所述源跳转表中记载的各个跳转目标地址,记录计算所述源跳转表索引的指令。3.如权利要求2所述的二进制翻译中间接跳转指令的翻译方法,其特征在于,所述步骤2进一步为,步骤31,翻译所述计算源跳转表的索引的指令,在索引所述目标跳转表时使用所述索引;步骤32,将被标记的间接跳转指令翻译为根据所述索引从待构建的所述间接跳转指令的目标跳转表中获得对应表项,并按所述表项的内容进行跳转的指令;步骤33,为所述目标跳转表预留重定位项。4.如权利要求2所述的二进制翻译中间接跳转指令的翻译方法,其特征在于,所述步骤3进一步为,步骤41,翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同;步骤42,判断源跳转表的表项中的跳转地址是否已被翻译并生成对应的本地码,如果是,执行步骤43,否则,执行步骤44;步骤43,将所述对应的本地码的入口地址填入所述目标跳转表对应的表项中;步骤44,将所述目标跳转表对应的表项填为跳转到翻译控制器的代码入口地址。5.如权利要求2所述的二进制翻译中间接跳转指令的翻译方法,其特征在于,所述步骤1和所述步骤2之间还包括步骤51,将被标记的间接跳转指令的翻译中取源跳转表表项内容的指令对应生成的本地码移到跳转寄存器指令之后;所述步骤3进一步为,步骤51,翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同;步骤52,判断源跳转表的表项中的跳转地址是否已被翻译并生成对应的本地码,如果是,执行步骤53,否则,执行步骤54;步骤53,将所述对应的本地码的入口地址填入所述目标跳转表对应的表项中;步骤54,将所述目标跳转表对应的表项填为所述跳转寄存器指令的下一条指令的地址。6.如权利要求1所述的二进制翻译中间接跳转指令的翻译方法,其特征在于,所述步骤2还包括,对于未被标记的间接跳转指令,按查找哈希表的方法进行翻译。7.—种二进制翻译中间接跳转指令的翻译系统,其特征在于,包括间接跳转指令标识模块,用于在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是则进行标记,获得被标记的间接跳转指令的源跳转表;翻译模块,用于在翻译时,将被标记的间接跳转指令翻译为根据待构建的所述被标记的间接跳转指令的目标跳转表的内容进行跳转的指令,为所述目标跳转表预留重定位项;目标跳转表构建模块,用于在翻译完所述被标记的间接跳转指令后,根据所述间接跳转指令的源跳转表构建所述间接跳转指令的目标跳转表;所述翻译模块还用于将构建的所述目标跳转表的地址写入所述预留的重定位项,完成翻译。8.如权利要求7所述的二进制翻译中间接跳转指令的翻译系统,其特征在于,所述间接跳转指令标识模块进一步用于在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是,则对所述间接跳转指令进行标记;获得所述被标记的间接跳转指令的源跳转表的大小,所述源跳转表中记载的各个跳转目标地址,记录计算所述源跳转表索弓I的指令。9.如权利要求8所述的二进制翻译中间接跳转指令的翻译系统,其特征在于,所述翻译模块在所述目标跳转表被构建前进一步用于翻译所述计算源跳转表的索引的指令,在索引所述目标跳转表时使用所述索引;将被标记的间接跳转指令翻译为根据所述索引从待构建的所述间接跳转指令的目标跳转表中获得对应表项,并按所述表项的内容进行跳转的指令;为所述目标跳转表预留重定位项。10.如权利要求8所述的二进制翻译中间接跳转指令的翻译系统,其特征在于,所述目标跳转表构建模块进一步用于翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同;判断源跳转表的表项中的跳转地址是否已被翻译并生成对应的本地码,如果是,将所述对应的本地码的入口地址填入所述目标跳转表对应的表项中,否则,将所述目标跳转表对应的表项填为跳转到翻译控制器的代码入口地址。11.如权利要求8所述的二进制翻译中间接跳转指令的翻译系统,其特征在于,所述系统在所述间接跳转指令标识模块和所述翻译模块之间还包括指令修改模块,用于将被标记的间接跳转指令的翻译中取源跳转表表项内容的指令对应生成的本地码移到跳转寄存器指令之后;所述目标跳转表构建模块进一步用于翻译完所述被标记的间接跳转指令后,构建目标跳转表的大小同源跳转表的大小相同;判断源跳转表的表项中的跳转地址是否已被翻译并生成对应的本地码,如果是,将所述对应的本地码的入口地址填入所述目标跳转表对应的表项中,否则,将所述目标跳转表对应的表项填为所述跳转寄存器指令的下一条指令的地址。12.如权利要求7所述的二进制翻译中间接跳转指令的翻译系统,其特征在于,所述翻译模块还用于对于未被标记的间接跳转指令,按查找哈希表的方法进行翻译。全文摘要本发明涉及二进制翻译中间接跳转指令的翻译方法及系统,方法包括步骤1,在反汇编到间接跳转指令时,根据反汇编出的源指令序列判断所述间接跳转指令是否为多分支语句或虚函数调用,如果是则进行标记,获得被标记的间接跳转指令的源跳转表;步骤2,在翻译时,将被标记的间接跳转指令翻译为根据待构建的所述被标记的间接跳转指令的目标跳转表的内容进行跳转的指令,为所述目标跳转表预留重定位项;步骤3,翻译完所述被标记的间接跳转指令后,根据所述间接跳转指令的源跳转表构建所述间接跳转指令的目标跳转表;步骤4,将构建的所述目标跳转表的地址写入所述重定位项。本发明能够减少了访问内存的开销,提高了二进制翻译的效率。文档编号G06F9/45GK101706734SQ200910237389公开日2010年5月12日申请日期2009年11月10日优先权日2009年11月10日发明者武成岗,王文文申请人:中国科学院计算技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1