CN106445575A - 程序的重写方法和装置 - Google Patents
程序的重写方法和装置 Download PDFInfo
- Publication number
- CN106445575A CN106445575A CN201510498546.9A CN201510498546A CN106445575A CN 106445575 A CN106445575 A CN 106445575A CN 201510498546 A CN201510498546 A CN 201510498546A CN 106445575 A CN106445575 A CN 106445575A
- Authority
- CN
- China
- Prior art keywords
- jump instruction
- springboard code
- indirect jump
- springboard
- code
- 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.)
- Granted
Links
Landscapes
- Executing Machine-Instructions (AREA)
Abstract
本发明提供一种程序的重写方法和装置,该方法包括:为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,所述跳板代码用于将间接跳转指令对应的PC值约束在Kseg0内;将跳板代码段添加至所述待处理程序的地址空间的起始位置,获得新版本程序和映射表;根据映射表,将所述新版本程序中位于所述跳板代码之外的间接跳转指令的目标寄存器修改为所述跳板代码在所述新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到位于跳板代码之外的间接跳转指令所在的地址时,跳转执行所述跳板代码。本发明提供的方法,避免了处理器在错误的PC上进行取指带来的程序终止或死机的技术问题,提高了处理器的执行效率。
Description
技术领域
本发明涉及计算机技术,尤其涉及一种程序的重写方法和装置。
背景技术
处理器在执行程序段时,在执行路径上经常会遇到各种各样的跳转指令,例如,直接跳转指令或间接跳转指令等。当处理器执行到跳转指令后,处理器会跳转到该跳转指令的目标地址上,然后执行该目标地址上的指令。但是,对于间接跳转指令而言,一般的,在程序执行之前,处理器是不知道间接跳转指令要跳转到的目标地址的,而是在程序执行的过程中采用转移猜测的方法去猜测间接跳转指令的目标地址。上述转移猜测的方法能够对跳转是否执行以及跳转的目标地址两方面进行预测,其一般可以对程序执行路径上的多条间接跳转指令进行连续处理和预测,处理器的转移猜测功能可以保证处理器在猜错时能够让处理器回滚到正确状态,继续执行。
对于间接跳转指令,处理器猜测该间接跳转指令的目标地址具体可以为:处理器根据该间接跳转指令的历史跳转信息猜测该间接跳转指令对应的目标寄存器内的程序计数器(Program Counter,简称PC)值,该PC值即就是该间接跳转指令的目标地址,其存储在间接跳转指令的目标寄存器中。当处理器猜测到该PC值后,就会根据该PC值发出取指操作。但是,当猜测的PC值位于处理器不允许进行取指操作的地址空间(例如Kseg1)时,就有可能造成处理器出现状态错误,从而导致程序终止或死机。
因此,如何避免处理器所猜测的PC值超出合法的取指地址空间,以避免程序的终止或死机,成为目前亟待解决的技术问题。
发明内容
本发明提供一种程序的重写方法和装置,用以解决现有技术中无法避免处理器在跳转时,因所猜测的PC值超出合法的取指地址空间,带来的程序终止或死机的技术问题。
第一方面,本发明提供一种程序的重写方法,包括:
为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,所述跳板代码用于将所述间接跳转指令对应的程序计数器PC值约束在Kseg0内;
将所述跳板代码段添加至所述待处理程序的地址空间的起始位置,获得新版本程序和映射表;其中,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系;
根据所述映射表,将所述新版本程序中位于所述跳板代码之外的间接跳转指令的目标寄存器修改为所述跳板代码在所述新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到所述位于所述跳板代码之外的间接跳转指令所在的地址时,跳转执行所述跳板代码。
结合第一方面,在第一方面的第一种可能的实施方式中,所述跳板代码包括第一跳板代码和/或第二跳板代码,所述间接跳转指令包括第一间接指令和/或第二间接跳转指令,所述第一间接跳转指令对应的目标寄存器为R1寄存器,所述第二间接跳转指令对应的目标寄存器为第一寄存器;
所述为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,所述跳板代码用于将所述间接跳转指令对应的程序计数器PC值约束在Kseg0内,包括:
为所述第一间接跳转指令对应的R1寄存器构建所述第一跳板代码,获得所述跳板代码段;或者,
为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,获得所述跳板代码段;或者,
为所述第一间接跳转指令对应的R1寄存器构建所述第一跳板代码,以及,为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,并根据所述第一跳板代码和所述第二跳板代码,获得所述跳板代码段;
其中,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内;所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内。
结合第一方面的第一种可能的实施方式,在第一方面的第二种可能的实施方式中,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系,具体为:
所述映射表包括所述第一跳板代码在所述新版本程序中的地址与所述R1寄存器的对应关系,和/或,所述第二跳板代码在所述新版本程序中的地址与所述第一寄存器的对应关系。
结合第一方面的第二种可能的实施方式,在第一方面的第三种可能的实施方式中,所述位于所述跳板代码之外的间接跳转指令包括:位于所述第一跳板代码之外的第三间接跳转指令,和/或,位于所述第二跳板代码之外的第四间接跳转指令;其中,所述第三间接跳转指令与所述第一间接跳转指令的指令内容相同,且所述第三间接跳转指令的目标寄存器为R1寄存器,所述第四间接跳转指令与所述第二间接跳转指令的指令内容相同,且所述第四间接跳转指令的目标寄存器为第一寄存器;
所述根据所述映射表,将所述新版本程序中位于所述跳板代码之外的间接跳转指令的目标寄存器修改为所述跳板代码在所述新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到所述位于所述跳板代码之外的间接跳转指令时跳转执行所述跳板代码段,包括:
根据所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码;或者,
根据所述映射表,将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码;或者,
根据所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,并将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码,以及,在所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码。
结合第一方面至第一方面的第三种可能的实施方式中的任一项,在第一方面的第四种可能的实施方式中,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内,具体为:
所述第一跳板代码,用于确定所猜测的所述第一PC值是否正确,以将所述第一PC值约束在Kseg0内。
结合第一方面的第四种可能的实施方式,在第一方面的第五种可能的实施方式中,所述第一跳板代码包括至少一条空指令和所述第一间接跳转指令;所述空指令用于确定所猜测的第一PC值是否正确;所述方法还包括:
执行所述改写后的新版本程序,并当执行到所述第三间接跳转指令所在的地址时,跳转执行所述第一跳板代码;
当执行所述空指令后确定所猜测的第一PC值正确时,继续执行所述第一跳板代码中的所述第一间接跳转指令;
当执行所述空指令后确定所猜测的第一PC值错误时,回退至所述第一跳板代码在所述新版本程序中的地址上,以重新执行所述第一跳板代码。
结合第一方面至第一方面的第三种可能的实施方式中的任一项,在第一方面的第六种可能的实施方式中,所述第二跳板代码包括按位与指令和第二间接跳转指令;
所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内,具体为:
所述按位与指令,用于将所述R1寄存器中的立即数0xDFFF,FFFF与所述第二间接跳转指令对应的第一寄存器的地址空间进行按位与,以将所述第二PC值约束在Kseg0内。
结合第一方面的第一种可能的实施方式,在第一方面的第七种可能的实施方式中,所述根据所述第一跳板代码和所述第二跳板代码,获得所述跳板代码段,具体包括:
将所述第一跳板代码和所述第二跳板代码按照所对应的寄存器编号从小到大排列,获得所述跳板代码段。
结合第一方面的第三种可能的实施方式,在第一方面的第八种可能的实施方式中,所述第一间接跳转指令为jr reg1或jalr reg1,所述第二间接跳转指令为jr regN或jalr regN,所述N为大于1小于等于31的正整数,所述第一跳板代码在所述新版本程序中的地址为StubR1,所述第二跳板代码在所述新版本程序中的地址为StubRN;
则所述根据所述映射表,将所述新版本程序中第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,具体包括:
根据所述映射表,将所述新版本程序中第三间接跳转指令jr reg1中的reg1修改为StubR1,或者,将jalr reg1中的reg1修改为StubR1;
所述根据所述映射表,将所述新版本程序中第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,具体包括:
将所述新版本程序中第四间接跳转指令jr regN中的regN修改为StubRN,或者,将jalr regN中的regN修改为StubRN。
结合第一方面的第八种可能的实施方式,在第一方面的第九种可能的实施方式中,当所述第一寄存器为RN时,所述第二跳板代码中的第二间接跳转指令为jr regN或jalr regN。
第二方面,本发明提供一种程序的重写装置,包括:
跳板代码构建模块,用于为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,所述跳板代码用于将所述间接跳转指令对应的程序计数器PC值约束在Kseg0内;
第一获取模块,用于将所述跳板代码构建获取模块所获得的跳板代码段添加至所述待处理程序的地址空间的起始位置,获得新版本程序和映射表;其中,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系;
第二获取模块,用于根据所述第一获取模块获得的所述映射表,将所述新版本程序中位于所述跳板代码之外的间接跳转指令的目标寄存器修改为所述跳板代码在所述新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到所述位于所述跳板代码之外的间接跳转指令所在的地址时,跳转执行所述跳板代码。
结合第二方面,在第二方面的第一种可能的实施方式中,所述跳板代码包括第一跳板代码和/或第二跳板代码,所述间接跳转指令包括第一间接指令和/或第二间接跳转指令,所述第一间接跳转指令对应的目标寄存器为R1寄存器,所述第二间接跳转指令对应的目标寄存器为第一寄存器;
则所述跳板代码构建模块,具体用于为所述第一间接跳转指令对应的R1寄存器构建所述第一跳板代码,获得所述跳板代码段;
或者,所述跳板代码构建模块,具体用于为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,获得所述跳板代码段;
或者,所述跳板代码构建模块,具体用于为所述第一间接跳转指令对应的R1寄存器构建所述第一跳板代码,以及,为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,并根据所述第一跳板代码和所述第二跳板代码,获得所述跳板代码段;
其中,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内;所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内。
结合第二方面的第一种可能的实施方式,在第二方面的第二种可能的实施方式中,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系,具体为:
所述映射表包括所述第一跳板代码在所述新版本程序中的地址与所述R1寄存器的对应关系,和/或,所述第二跳板代码在所述新版本程序中的地址与所述第一寄存器的对应关系。
结合第二方面的第二种可能的实施方式,在第二方面的第三种可能的实施方式中,所述位于所述跳板代码之外的间接跳转指令包括:位于所述第一跳板代码之外的第三间接跳转指令,和/或,位于所述第二跳板代码之外的第四间接跳转指令;其中,所述第三间接跳转指令与所述第一间接跳转指令的指令内容相同,且所述第三间接跳转指令的目标寄存器为R1寄存器,所述第四间接跳转指令与所述第二间接跳转指令的指令内容相同,且所述第四间接跳转指令的目标寄存器为第一寄存器;
则所述第二获取模块,具体用于根据所述第一获取模块获得的所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码;
或者,所述第二获取模块,具体用于根据所述第一获取模块获得的所述映射表,将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码;
或者,所述第二获取模块,具体用于根据所述第一获取模块获得的所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,并将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码,以及,在所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码。
结合第二方面至第二方面的第三种可能的实施方式中的任一项,在第二方面的第四种可能的实施方式中,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内,具体为:
所述第一跳板代码,用于确定所猜测的所述第一PC值是否正确,以将所述第一PC值约束在Kseg0内。
结合第二方面的第四种可能的实施方式,在第二方面的第五种可能的实施方式中,所述第一跳板代码包括至少一条空指令和所述第一间接跳转指令;所述空指令用于确定所猜测的第一PC值是否正确;所述装置还包括:
处理模块,用于执行所述改写后的新版本程序,并当执行到所述第三间接跳转指令所在的地址时,跳转执行所述第一跳板代码;
判断执行模块,用于在执行所述空指令后确定所猜测的第一PC值正确时,指示所述处理模块继续执行所述第一跳板代码中的所述第一间接跳转指令;并用于在执行所述空指令后确定所猜测的第一PC值错误时,指示所述处理模块回退至所述第一跳板代码在所述新版本程序中的地址上,以重新执行所述第一跳板代码。
结合第二方面至第二方面的第三种可能的实施方式中的任一项,在第二方面的第六种可能的实施方式中,所述第二跳板代码包括按位与指令和第二间接跳转指令;
所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内,具体为:
所述按位与指令,用于将所述R1寄存器中的立即数0xDFFF,FFFF与所述第二间接跳转指令对应的第一寄存器的地址空间进行按位与,以将所述第二PC值约束在Kseg0内。
结合第二方面的第一种可能的实施方式,在第二方面的第七种可能的实施方式中,所述跳板代码构建模块,具体用于根据所述第一跳板代码和所述第二跳板代码,获得所述跳板代码段,具体为:
所述跳板代码构建模块,具体用于将所述第一跳板代码和所述第二跳板代码按照所对应的寄存器编号从小到大排列,获得所述跳板代码段。
结合第二方面的第三种可能的实施方式,在第二方面的第八种可能的实施方式中,所述第一间接跳转指令为jr reg1或jalr reg1,所述第二间接跳转指令为jr regN或jalr regN,所述N为大于1小于等于31的正整数,所述第一跳板代码在所述新版本程序中的地址为StubR1,所述第二跳板代码在所述新版本程序中的地址为StubRN;
则所述第二获取模块,具体用于根据所述映射表,将所述新版本程序中第三间接跳转指令jr reg1中的reg1修改为StubR1,或者,将jalr reg1中的reg1修改为StubR1;以及,具体用于将所述新版本程序中第四间接跳转指令jr regN中的regN修改为StubRN,或者,将jalr regN中的regN修改为StubRN。
结合第二方面的第八种可能的实施方式,在第二方面的第九种可能的实施方式中,当所述第一寄存器为RN时,所述第二跳板代码中的第二间接跳转指令为jr regN或jalr regN。
本发明提供的程序的重写方法和装置,通过为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,并将该跳板代码段添加至待处理程序的起始地址空间,获得新版本程序以及映射表,并根据该映射表将新版本程序中位于该跳板代码之外的间接跳转指令的目标寄存器修改为该跳板代码在新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到位于跳板代码之外的间接跳转指令时跳转执行该跳板代码。由于该跳板代码可以将所猜测的PC值约束在Kseg0内,因此避免了处理器在错误的PC上进行取指带来的程序终止或死机的技术问题,提高了处理器的执行效率。
附图说明
图1为本发明提供的程序的重写方法实施例一的流程示意图;
图2为本发明提供的程序的重写方法实施例二的流程示意图;
图3为本发明提供的程序的重写方法实施例三的流程示意图;
图4为本发明提供的程序的重写方法实施例四的流程示意图;
图5为本发明提供的程序的重写方法实施例五的流程示意图;
图6为本发明提供的待处理程序中的间接跳转指令的重写过程示意图;
图7为本发明提供的程序的重写装置实施例一的结构示意图;
图8为本发明提供的程序的重写方装置实施例二的结构示意图。
具体实施方式
本发明涉及的方法可以适用于处理器在执行程序时进行指令跳转的场景,该方法的执行主体可以为处理器,也可以为集成了处理器的通信设备,例如计算机、平板电脑、服务器等。下述实施例以执行主体为处理器为例来进行说明。
需要说明的是,本发明实施例涉及的“A,和/或,B”,可以包括“A”、“B”、“A和B”三种情况。
本发明实施例涉及的方法,旨在解决现有技术中无法避免处理器在跳转时,因所猜测的PC值超出合法的取指地址空间,带来的程序终止或死机的技术问题。
下面以具体地实施例对本发明的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。
图1为本发明提供的程序的重写方法实施例一的流程示意图。本实施例涉及的方法是通过为待处理程序中的间接跳转指令对应的目标寄存器构建跳板代码,并将所构建的跳板代码添加至待处理程序中形成新版本的程序,从而根据跳板代码在新版本程序中的地址对原始的间接跳转指令进行重写,以使计算机在执行到上述间接跳转指令时可以跳转执行对应的跳板代码,进而使得处理器可以通过执行该跳板代码来确保所猜测的PC值位于合法的取指地址空间的具体过程。如图1所示,该方法包括:
S101:为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,所述跳板代码用于将所述间接跳转指令对应的程序计数器PC值约束在Kseg0内。
具体的,待处理程序为处理器即将要执行的程序,该待处理程序中包括至少一条间接跳转指令,该每一条间接跳转指令都对应相应的目标寄存器。需要说明的是,目标寄存器可以为32个通用寄存器中的除R0外的任一个通用寄存器,本实施例中,处理器会对每一条间接跳转指令的目标寄存器构建跳板代码,可选的,当待处理程序中的所包括的间接跳转指令的类型不同时,所构建的跳板代码有可能不同。当处理器对所有间接跳转指令构建完跳板代码后,根据这些跳板代码获得跳板代码段。
一般的,处理器在执行待处理器程序中,对于待处理程序中涉及到的间接跳转指令,处理器一般会猜测该间接跳转指令的目标地址,具体可以为:处理器根据该间接跳转指令的历史跳转信息猜测该间接跳转指令对应的目标寄存器内的PC值,该PC值即就是该间接跳转指令的目标地址,其存储在该间接跳转指令对应的目标寄存器中。当处理器猜测到该PC值后,就会根据该PC值发出取指操作,但是,当猜测的PC值位于处理器不允许进行取指操作的地址空间(例如Kseg1)时,就有可能造成处理器出现状态错误,从而导致程序终止或死机。因此,本实施例中,上述为目标寄存器构建的跳板代码,其主要用于将间接跳转指令的目标地址(即上述PC值)约束在Kseg0内,因此可以确保间接跳转指令可以位于合法的地址空间内,不会造成跳转错误。可选的,该跳板代码可以为具有判断PC值是否位于Kseg0内的功能的指令,或者还可以为经过一定的逻辑运算将PC值限制在Keg0内的指令。
需要说明的是,上述合法地址空间Kseg0的地址空间为(0x8000,0000—0x9FFFF,FFFF),共512M;上述不允许进行取指操作的Kseg1的地址空间为(0xA000,0000—0xBFFFF,FFFF),共512M。
S102:将所述跳板代码段添加至所述待处理程序的地址空间的起始位置,获得新版本程序和映射表;其中,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系。
具体的,当处理器将上述跳板代码段存储至上述待处理程序的起始位置后,处理器会获得一新版本程序和映射表,该新版本程序中包括上述跳板代码段和原来的待处理程序。由于上述跳板代码是与间接跳转指令的目标寄存器对应的,因此上述映射表可以包括该跳板代码在新版本程序中的地址和与该跳板代码对应的间接跳转指令的目标寄存器之间的映射关系,即一个目标寄存器与其对应的跳板代码的地址之间具有映射关系。
S103:根据所述映射表,将所述新版本程序中位于所述跳板代码之外的间接跳转指令的目标寄存器修改为所述跳板代码在所述新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到所述位于所述跳板代码之外的间接跳转指令所在的地址时,跳转执行所述跳板代码。
具体的,当处理器获得新版本的程序和上述映射表之后,处理器对新版本程序中位于跳板代码之外的间接跳转指令进行改写,获得改写后的新版本程序,即处理器将上述新版本程序中位于跳板代码之外的间接跳转指令的目标寄存器修改为该跳板代码在新版本程序中的地址。故,处理器在执行到位于上述跳板代码之外的间接跳转指令时,可以直接跳转执行所述跳板代码。
由于处理器在执行到位于上述跳板代码之外的间接跳转指令时,所猜测的PC值有可能是错误的,因此当处理器执行到位于上述跳板代码之外的间接跳转指令时,可以直接跳转执行所述跳板代码,由于该跳板代码可以将所猜测的PC值约束在合法的地址空间Kseg0内,因此一定程度上避免了处理器在错误的PC上进行取指。故,本发明提供的方法,可以避免处理器在执行跳转指令时,因所猜测的PC值超出合法的取指地址空间,带来的程序终止或死机的技术问题,提高了处理器的执行效率。
本发明提供的程序的重写方法,通过为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,并将该跳板代码段添加至待处理程序的起始地址空间,获得新版本程序以及映射表,并根据该映射表将新版本程序中位于该跳板代码之外的间接跳转指令的目标寄存器修改为该跳板代码在新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到位于跳板代码之外的间接跳转指令时跳转执行该跳板代码。由于该跳板代码可以将所猜测的PC值约束在Kseg0内,因此避免了处理器在错误的PC上进行取指带来的程序终止或死机的技术问题,提高了处理器的执行效率。
图2为本发明提供的程序的重写方法实施例二的流程示意图。本实施例涉及的是当跳板代码包括第一跳板代码,间接跳转指令包括第一间接跳转指令,且上述位于跳板代码之外的间接跳转指令为第三间接跳转指令时,处理器可以通过执行该第一跳板代码来确保所猜测的第一PC值位于合法的取指地址空间的具体过程。其中,该第一间接跳转指令对应的目标寄存器为R1寄存器,所述第三间接跳转指令与所述第一间接跳转指令的指令内容相同,且所述第三间接跳转指令的目标寄存器也为R1寄存器。如图2所示,该方法包括:
S201:为待处理程序中的所述第一间接跳转指令对应的R1寄存器构建第一跳板代码,获得所述跳板代码段,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内。
具体的,本实施例中,将跳转至R1寄存器的间接跳转指令称为第一间接跳转指令,即,第一间接跳转指令与R1寄存器对应。可选的,该第一间接跳转指令可以为jr reg1,还可以为jalr reg1,还可以为其他的跳转指令。当处理器为第一间接跳转指令对应的R1寄存器构建第一跳板代码后,根据该第一跳板代码获得跳板代码段。一般的,处理器在执行待处理器程序中,对于待处理程序中涉及到的间接跳转指令,处理器一般会猜测该间接跳转指令的目标地址,具体可以为:处理器根据该间接跳转指令的历史跳转信息猜测该间接跳转指令对应的目标寄存器内的PC值,该PC值即就是该间接跳转指令的目标地址,其存储在该间接跳转指令对应的目标寄存器中。当处理器猜测到该PC值后,就会根据该PC值发出取指操作,但是,当猜测的PC值位于处理器不允许进行取指操作的地址空间(例如Kseg1)时,就有可能造成处理器出现状态错误,从而导致程序终止或死机。因此,本实施例中,上述为R1寄存器构建的第一跳板代码,其主要用于将处理器所猜测的第一间接跳转指令对应的位于R1寄存器中的第一PC值约束在Kseg0内。因此,由于上述第一跳板代码对处理器所猜测的第一PC值具有约束功能,使得处理器所猜测的第一PC值不会位于不合法的取指空间内。至于第一跳板代码在待处理程序中如何设定以及如何使用,可以参见下述S202和S203的具体描述。
S202:将所述跳板代码段添加至所述待处理程序的地址空间的起始位置,获得新版本程序和映射表;其中,所述映射表包括所述第一跳板代码在所述新版本程序中的地址与所述R1寄存器的对应关系。
S203:根据所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码。
具体的,上述处理器所获得的新版本程序包括第三间接跳转指令、第一跳板代码以及其他指令,该第三间接跳转指令为上述新版本程序中位于所述第一跳板代码之外的间接跳转指令,第三间接跳转指令与第一间接跳转指令的指令内容相同,且所述第三间接跳转指令的目标寄存器为R1寄存器。
当处理器获得新版本的程序和上述映射表之后,处理器对新版本程序中的第三间接跳转指令进行改写,获得改写后的新版本程序,即处理器将上述新版本程序中的第三间接跳转指令的目标寄存器修改为所述第一跳板代码在新版本程序中的地址,故,处理器在执行到第三间接跳转指令所在的地址时可以直接跳转执行所述第一跳板代码。
由于处理器在执行第三间接跳转指令所在的地址时,所猜测的第一PC值有可能是错误的(因为第三间接跳转指令的内容与第一间接跳转指令的内容相同,所以处理器猜测的第三间接跳转指令对应的PC值也是第一PC值),因此当处理器执行到第三间接跳转指令所在的地址时,可以直接跳转执行第一跳板代码,由于该第一跳板代码可以将第一PC值约束在Kseg0内,因此一定程度上避免了处理器在错误的PC上进行取指。故,本发明提供的方法,可以避免处理器在执行跳转指令时,因所猜测的第一PC值超出合法的取指地址空间,带来的程序终止或死机的技术问题,提高了处理器的执行效率。
本发明提供的程序的重写方法,通过为第一间接跳转指令对应的R1寄存器构建第一跳板代码,获得跳板代码段,并将该跳板代码段添加至待处理程序的起始地址空间,获得新版本程序以及映射表,并根据该映射表将新版本程序中第三间接跳转指令的目标寄存器修改为第一跳板代码在新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到第三间接跳转指令时跳转执行第一跳板代码。由于该第一跳板代码可以将第一PC值约束在Kseg0内,因此避免了处理器在错误的PC上进行取指带来的程序终止或死机的技术问题,提高了处理器的执行效率。
图3为本发明提供的程序的重写方法实施例三的流程示意图。本实施例涉及的是当跳板代码包括第二跳板代码,间接跳转指令包括第二间接跳转指令,且上述位于跳板代码之外的间接跳转指令为第四间接跳转指令时,处理器可以通过执行该第二跳板代码来确保所猜测的第二PC值位于合法的取指地址空间的具体过程。其中,该第二间接跳转指令对应的目标寄存器为第一寄存器,该第一寄存器可以为32个通用寄存器中除R0寄存器和R1寄存器之外的一个通用寄存器,所述第四间接跳转指令与所述第二间接跳转指令的指令内容相同,且所述第四间接跳转指令的目标寄存器也为第一寄存器。如图3所示,该方法包括:
S301:为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,获得所述跳板代码段,所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内。
具体的,本实施例中,将跳转至第一寄存器的间接跳转指令称为第二间接跳转指令,即,第二间接跳转指令与第一寄存器对应。在本实施例中,将32个通用寄存器进行分类,其中,R0寄存器中单独的一类寄存器(R0是常值0,不存在间接跳转指令跳转到R0的情况发生),R1寄存器为单独的一类寄存器(R1寄存器为便签寄存器),R2-R31为单独的一类寄存器,统称为第一寄存器。上述第二间接跳转指令可以为jr regN,还可以为jalr regN,其中,N为大于1小于等于31的正整数,第二间接跳转指令还可以为其他的跳转指令。当处理器为第二间接跳转指令对应的第一寄存器构建第二跳板代码后,根据该第二跳板代码获得跳板代码段。一般的,处理器在执行待处理器程序中,对于待处理程序中涉及到的间接跳转指令,处理器一般会猜测该间接跳转指令的目标地址,具体可以为:处理器根据该间接跳转指令的历史跳转信息猜测该间接跳转指令对应的目标寄存器内的PC值,该PC值即就是该间接跳转指令的目标地址,其存储在该间接跳转指令对应的目标寄存器中。当处理器猜测到该PC值后,就会根据该PC值发出取指操作,但是,当猜测的PC值位于处理器不允许进行取指操作的地址空间(例如Kseg1)时,就有可能造成处理器出现状态错误,从而导致程序终止或死机。因此,本实施例中,上述为第一寄存器构建的第二跳板代码,其主要用于将处理器所猜测的第二间接跳转指令对应的位于第一寄存器中的第二PC值约束在Kseg0内。因此,由于上述第二跳板代码对处理器所猜测的第二PC值具有约束功能,使得处理器所猜测的第二PC值不会位于不合法的取指空间内。至于第二跳板代码在待处理程序中如何设定以及如何使用,可以参见下述S302和S303的具体描述。
S302:将所述跳板代码段添加至所述待处理程序的地址空间的起始位置,获得新版本程序和映射表;其中,所述映射表包括所述第二跳板代码在所述新版本程序中的地址与所述第一寄存器的对应关系。
S303:根据所述映射表,将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码。
具体的,上述处理器所获得的新版本程序包括第四间接跳转指令、第二跳板代码以及其他指令,该第四间接跳转指令为上述新版本程序中位于所述第二跳板代码之外的间接跳转指令,第四间接跳转指令与第二间接跳转指令的指令内容相同,且所述第四间接跳转指令的目标寄存器为第一寄存器。
当处理器获得新版本的程序和上述映射表之后,处理器对新版本程序中的第四间接跳转指令进行改写,获得改写后的新版本程序,即处理器将上述新版本程序中的第四间接跳转指令的目标寄存器修改为所述第二跳板代码在新版本程序中的地址,故,处理器在执行到第四间接跳转指令所在的地址时可以直接跳转执行所述第二跳板代码。
由于处理器在执行第四间接跳转指令时,所猜测的第二PC值有可能是错误的(因为第四间接跳转指令的内容与第二间接跳转指令的内容相同,所以处理器猜测的第四间接跳转指令对应的PC值也是第二PC值),因此当处理器执行到第四间接跳转指令所在的地址时,可以直接跳转执行第二跳板代码,由于该第二跳板代码可以将第二PC值约束在Kseg0内,因此一定程度上避免了处理器在错误的PC上进行取指。故,本发明提供的方法,可以避免处理器在执行跳转指令时,因所猜测的第二PC值超出合法的取指地址空间,带来的程序终止或死机的技术问题,提高了处理器的执行效率。
本发明提供的程序的重写方法,通过为第二间接跳转指令对应的第一寄存器构建第二跳板代码,获得跳板代码段,并将该跳板代码段添加至待处理程序的起始地址空间,获得新版本程序以及映射表,并根据该映射表将新版本程序中第四间接跳转指令的目标寄存器修改为第二跳板代码在新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到第四间接跳转指令所在的地址时跳转执行第二跳板代码。由于该第二跳板代码可以将第二PC值约束在Kseg0内,因此避免了处理器在错误的PC上进行取指带来的程序终止或死机的技术问题,提高了处理器的执行效率。
图4为本发明提供的程序的重写方法实施例四的流程示意图。本实施例与上述实施例二和实施例三不同,本实施例涉及的是当跳板代码包括第一跳板代码和第二跳板代码,间接跳转指令包括第一间接跳转指令和第二间接跳转指令,且上述位于跳板代码之外的间接跳转指令包括第三间接跳转指令和第四间接跳转指令时,处理器可以通过执行该第一跳板代码和第二跳板代码来确保所猜测的第一PC值和第二PC值位于合法的取指地址空间的具体过程。其中,该第一间接跳转指令对应的目标寄存器为R1寄存器,所述第三间接跳转指令与所述第一间接跳转指令的指令内容相同,且所述第三间接跳转指令的目标寄存器也为R1寄存器,该第二间接跳转指令对应的目标寄存器为第一寄存器,所述第四间接跳转指令与所述第二间接跳转指令的指令内容相同,且所述第四间接跳转指令的目标寄存器也为第一寄存器。如图4所示,该方法包括:
S401:为待处理程序中的第一间接跳转指令对应的R1寄存器构建第一跳板代码以及为第二间接跳转指令对应的第一寄存器构建第二跳板代码,获得跳板代码段;其中,所述第一跳板代码用于确定所猜测的所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内;所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内。
具体的,本实施例中,为第一间接跳转指令构建第一跳板代码,以及为第二间接跳转指令构建第二跳板代码可以参见上述实施例二和实施例三的具体描述,在此不再赘述。
需要说明的是,当处理器为第一间接跳转指令构建第一跳板代码,以及为第二间接跳转指令构建第二跳板代码之后,获得跳板代码段的过程,具体可以为:处理器可以按照寄存器的编号将第一跳板代码和第二跳板代码顺序排列,形成跳板代码段。
S402:将所述跳板代码段添加至所述待处理程序的地址空间的起始位置,获得新版本程序和映射表;其中,所述映射表包括所述第一跳板代码在所述新版本程序中的地址与所述R1寄存器的对应关系,以及,所述第二跳板代码在所述新版本程序中的地址与所述第一寄存器的对应关系。
具体的,S402的具体过程可以参见上述实施例二和实施例三的具体描述,在此不再赘述。
S403:根据所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,并将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码,以及,在所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码。
具体的,上述处理器所获得的新版本程序包括第三间接跳转指令、第四间接跳转指令、第一跳板代码、第二跳板代码以及其他指令。当处理器获得新版本的程序和上述映射表之后,处理器对新版本程序中的第三间接跳转指令和第四间接跳转指令进行改写,获得改写后的新版本程序,即处理器将上述新版本程序中的第三间接跳转指令的目标寄存器修改为所述第一跳板代码在新版本程序中的地址,并将第四间接跳转指令的目标寄存器修改为所述第二跳板代码在新版本程序中的地址,故,处理器在执行到第三间接跳转指令所在的地址时可以直接跳转执行所述第一跳板代码,以及,在所述处理器执行到所述第四间接跳转指令所在的地址时,可以直接跳转执行所述第二跳板代码。
由于处理器在执行第三间接跳转指令时,所猜测的第一PC值有可能是错误的(因为第三间接跳转指令的内容与第一间接跳转指令的内容相同,所以处理器猜测的第三间接跳转指令对应的PC值也是第一PC值),因此当处理器执行到第三间接跳转指令所在的地址时,可以直接跳转执行第一跳板代码,由于该第一跳板代码可以确定第一PC值是否正确,因此一定程度上避免了处理器在错误的PC上进行取指;另一方面,处理器在执行第四间接跳转指令时,所猜测的第二PC值有可能是错误的(因为第四间接跳转指令的内容与第二间接跳转指令的内容相同,所以处理器猜测的第四间接跳转指令对应的PC值也是第二PC值),因此当处理器执行到第四间接跳转指令所在的地址时,可以直接跳转执行第二跳板代码,由于该第二跳板代码可以将所猜测的第二PC值约束在Kseg0内,因此避免了处理器在错误的PC上进行取指。故,本发明提供的方法,可以避免处理器在执行跳转指令时,因所猜测的PC值超出合法的取指地址空间,带来的程序终止或死机的技术问题,提高了处理器的执行效率。
可选的,本实施例中,该第一间接跳转指令为jr reg1或jalr reg1,第一跳板代码在所述新版本程序中的地址为StubR1,则上述S403中“将所述新版本程序中第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址”具体可以为:将上述新版本程序中的第三间接跳转指令jrreg1中的reg1修改为StubR1,或者,将jalr reg1中的reg1修改为StubR1”,从而将jr reg1修改为j StubR1,或者,将jalr reg1修改为jal StubR1。
可选的,当上述第一寄存器为RN时,第二间接跳转指令可以为jr regN或jalr regN,所述N为大于1小于等于31的正整数;上述第二跳板代码在所述新版本程序中的地址为StubRN。则上述S403中“将所述新版本程序中第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址”具体可以为:将上述新版本程序中的第四间接跳转指令jr regN中的regN,修改为StubRN,或者,将jalr regN中的regN修改为StubRN”,从而将新版本程序中的第四间接跳转指令jr regN修改为j StubRN,或者,将jalr regN修改为jal StubRN。
本发明提供的程序的重写方法,通过为第一间接跳转指令对应的R1寄存器构建第一跳板代码以及为第二间接跳转指令对应的第一寄存器构建第二跳板代码,获得跳板代码段,并将该跳板代码段添加至待处理程序的起始地址空间,获得新版本程序以及映射表,并根据该映射表将新版本程序中第三间接跳转指令的目标寄存器修改为第一跳板代码在新版本程序中的地址,并将新版本程序中第四间接跳转指令的目标寄存器修改为第二跳板代码在新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到第三间接跳转指令所在的地址时跳转执行第一跳板代码,以及,在处理器执行到第四间接跳转指令所在的地址时跳转执行第二跳板代码。由于该第一跳板代码可以确定第一PC值是否正确,第二跳板代码可以将所猜测的第二PC值约束在Kseg0内,因此避免了处理器在错误的PC上进行取指带来的程序终止或死机的技术问题,提高了处理器的执行效率。
为了更好的说明本发明的技术方案,下述实施例中均假设间接跳转指令包括第一间接跳转指令和第二间接跳转指令,跳板代码包括第一跳板代码和第二跳板代码,位于跳板代码之外的间接跳转指令包括位于第一跳板代码之外的第三间接跳转指令和位于第二跳板代码之外的第四间接跳转指令。
进一步地,在上述实施例四的基础上,上述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内,具体为:所述第一跳板代码,用于确定所猜测的所述第一PC值是否正确,以将所述第一PC值约束在Kseg0内。具体的,参见图5所示的实施例五,本实施例涉及的是第一跳板代码确定所猜测的第一PC值是否正确的具体实现方式。本实施例中,第一跳板代码包括至少一条空指令和所述第一间接跳转指令,所述空指令用于确定所猜测的第一PC值是否正确。因此,参见图5所示,该方法还可以包括:
S501:执行所述改写后的新版本程序,并当执行到所述第三间接跳转指令所在的地址时,跳转执行所述第一跳板代码。
S502:当执行所述空指令后确定所猜测的第一PC值正确时,继续执行所述第一跳板代码中的所述第一间接跳转指令。
S503:当执行所述空指令后确定所猜测的第一PC值错误时,回退至所述第一跳板代码在所述新版本程序中的地址上,以重新执行所述第一跳板代码。
具体的,本实施例中,上述第一跳板代码可以包括至少一条空指令和第一间接跳转指令。实际上,待处理程序中,第一间接跳转指令和第三间接跳转指令的目标寄存器均为R1寄存器。对于所形成的新版本程序,第一跳板代码中jr reg1或jalr reg1为第一间接跳转指令,位于第一跳板代码之外的jr reg1或jalr reg1为第三间接跳转指令,第一间接跳转指令和第三间接跳转指令的指令内容是相同的。可选的,上述第一跳板代码可以包括18条空指令。以第一跳板代码包括3条空指令和jr reg1为例,该第一跳板代码的代码序列可以参见表1所示,其中,“ssnop”为本实施例中提到的空指令,“nop”为第一跳板代码的结束指令,表1所示的第一跳板代码在新版本程序中的地址为StubR1。
表1
从程序执行原理来说,当执行完上述S403后,上述S402中的新版本程序变化为改写后的新版本程序,即新版本程序中的第三间接跳转指令的目标寄存器改写为了第一跳板代码在新版本程序中的地址(StubR1),上述新版本程序中第四间接跳转指令的目标寄存器改写为了所述第二跳板代码在新版本程序中的地址,从而获得改写后的新版本程序。因此,当处理器执行该改写后的新版本程序时,即当处理器执行到第三间接跳转指令所在的地址时,由于将第三间接跳转指令的目标寄存器改写为第一跳板代码在新程序中的地址(StubR1),使得处理器在执行到第三间接跳转指令所在的地址时可以直接跳转执行第一跳板代码;但是,由于第一跳板代码中包括第一间接跳转指令,第一间接跳转指令的内容与第三间接跳转指令的内容相同,因此,处理器执行完上述3条空指令(ssnop)后,会确定第一PC值正确,处理器就可以继续执行第一跳板代码中的第一间接跳转指令,相当于经过一个第一PC值的正确与否判断之后,再重新执行第三间接跳转指令。这样的过程可以确保第一PC值的正确,也确保处理器不会造成第三间接跳转指令的执行缺漏。
在上述实施例四和实施例五的基础上,本发明实施例六涉及的是第二跳板代码的具体实现方式。本实施例中,第二跳板代码包括按位与指令和第二间接跳转指令;其中,所述按位与指令,用于将所述R1寄存器中的立即数0xDFFF,FFFF与所述第二间接跳转指令对应的第一寄存器的地址空间进行按位与,以将所述第二PC值约束在Kseg0内。
需要说明的是,当所述第一寄存器为RN时,第二间接跳转指令对应的第一寄存器的地址空间即就是regN的地址空间。处理器将该regN的地址空间与位于R1寄存器中的0xDFFF,FFFF按位与,可以将regN中的第二PC值约束在Kseg0内。
本实施例中,第二跳板代码中的按位与指令用于将所述R1寄存器中的立即数0xDFFF,FFFF与所述第二间接跳转指令对应的第一寄存器的地址空间进行按位与,以将所述第二PC值约束在Kseg0内。实际上,待处理程序中,第二间接跳转指令和第四间接跳转指令的目标寄存器均为第一寄存器。对于所形成的新版本程序,第二跳板代码中jr regN或jalr regN为第二间接跳转指令,位于第二跳板代码之外的jr regN或jalr regN为第四间接跳转指令,第二间接跳转指令和第四间接跳转指令的指令内容是相同的。以第二跳板代码包括上述按位与指令和jr regN为例,第二跳板代码可以参见表2所示,其中,“lui$at,0xdfff ori$at,$at,0xffff”为位于R1寄存器中的立即数0xDFFF,FFFF”,“andregN,regN,$at”为按位与指令”。表2所示的第二跳板代码在新版本程序中的地址为StubRN。
表2
从程序执行原理来说,当执行完上述S403后,上述S402中的新版本程序变化为改写后的新版本程序,即新版本程序中的第三间接跳转指令的目标寄存器改写为了第一跳板代码在新版本程序中的地址(StubR1),上述新版本程序中第四间接跳转指令的目标寄存器改写为了所述第二跳板代码在新版本程序中的地址(StubRN),从而形成改写后的新版本程序。因此,当处理器执行该改写后的新版本程序时,即当处理器执行到第四间接跳转指令所在的地址时,由于将第四间接跳转指令的目标寄存器改写为第二跳板代码在新程序中的地址(StubRN),使得处理器在执行到第四间接跳转指令所在的地址时可以跳转执行第二跳板代码;但是,由于第二跳板代码中包括第二间接跳转指令,第二间接跳转指令的内容与第四间接跳转指令的内容相同,因此,处理器执行完“lui$at,0xdfff ori$at,$at,0xffff and regN,regN,$at”后,会将第二PC值约束在Kseg0内,因此处理器就可以继续执行第二跳板代码中的第二间接跳转指令,相当于经过一个第二PC值的取指空间约束之后,再重新执行第四间接跳转指令。这样的过程可以确保第二PC值的正确,也确保处理器不会造成第四间接跳转指令的执行缺漏。
结合上述实施例,还需要说明的是,对于待处理程序中的每条第一间接跳转指令和第二间接跳转指令都要进行相应的跳板代码的构建、改写等处理。具体可以参见下述图6所示的是待处理程序中的间接跳转指令的重写过程示意图。需要说明的是,下述过程仅是以待处理程序中包括多条第二间接跳转指令为例来进行说明的,当然,下述过程也适用于待处理程序中包括多条第一间接跳转指令,或者包括多条第一间接跳转指令和多条第二间接跳转指令的场景,本发明在此不再赘述。该方法具体包括:
S601:打开并解析待处理程序的elf文件,确定待处理程序在elf文件中的偏移和大小。
S602:判断待处理程序中的每条指令是否改写完毕;若是,则执行S608;若否,则执行S603。
这里的改写实际上包括了上述实施例的处理过程,包括为第一间接跳转指令和第二间接跳转指令构建相应的跳板代码、生成跳板代码段、将跳板代码段添加至待处理程序的起始位置生成新版本程序、将新版本程序中的第三间接跳转指令和第四间接跳转指令的目标寄存器进行改写等过程,将这些过程统称为对待处理程序中的指令的改写。
具体的,从S601确定的偏移位置开始,以4字节为单位,读取待处理程序中的每一条指令,并判断所有的间接跳转指令是否均已改写完毕,若是,则结束流程,若否,则执行下述S603。
S603:判断当前指令是否为jr指令,若是,则执行S604,若否,则执行S606。
S604:判断当前指令的目标寄存器regN是否为R0,若是,则返回执行S602,若否,则执行S605。
S605:将该地址上的jr regN改写为成j StubN,并写入上述elf文件中的对应位置,返回执行S602。
S606:判断当前指令是否为jalr指令且其目标寄存器regN是否为R0,若是,执行S607,若否,则返回执行S602。
S607:将该地址上的jalr regN改写为成jal StubN,并写入上述elf文件中的对应位置,返回执行S602。
S608:所有过程结束,关闭elf文件。
待处理器执行完上述S601至S608之后,整个待处理程序就改写完成,获得改写后的新版本程序。处理器在执行该改写后的新版本程序时,就可以按照上述实施例一至实施例六的过程执行。
为了更好的说明处理器执行上述改写后的新版本程序,通过改写后的新版本程序中的第一跳板代码和第二跳板代码避免PC值取指错误,本发明提供了一实施例七,该实施例七具体是以一个程序重写的完整过程来说明第一跳板代码和第二跳板代码是如何避免PC值取指错误的,具体的:
假设待处理程序中包括第一间接跳转指令jr reg1,第二间接跳转指令jrregN。在执行第一间接跳转指令和第二间接跳转指令之前,CPU不知道该条第一跳转指令跳转到哪一个目标地址上,也不知道第二跳转指令跳转到哪一个目标地址上。因此,在程序执行过程中,CPU会猜测一个位于R1寄存器内(reg1)的第一PC值和位于RN寄存器中的第二PC值,该第一PC值即就是该第一间接跳转指令要跳转到的目标地址,第二PC值即就是第二间接跳转指令要跳转到的目标地址。上述jr reg1指的是要跳转到目标寄存器reg1中的某个地址中去,该某个地址就是第一PC值;上述jr regN指的是要跳转到目标寄存器regN中的某个地址中去,该某个地址就是第二PC值。
首先,本实施例中的方法是对R1寄存器构造一个第一跳板代码,对RN寄存器构造一个第二跳板代码,该第一跳板代码可以为一个或多个,第二跳板代码可以为一个或多个,依待处理程序中的第一间接跳转指令和第二间接跳转指令的个数而定。然后,处理器根据R1寄存器和RN寄存器的编号生成一个跳板代码段。假设该RN寄存器包括R2-R31总共30个第一寄存器,处理器按照R1寄存器、R2-R31共31个寄存器的编号将第一跳板代码和第二跳板代码进行排序,即第一跳板代码在前,R2对应的第二跳板代码随后,R3对应的第二跳板代码次后,以此类推,直至排列到R31对应的第二跳板代码,从而形成跳板代码段。
之后,处理器将所形成的代码段添加至待处理程序的地址空间的起始位置,获得新版本程序和映射表。其中,映射表包括所述第一跳板代码在所述新版本程序中的地址与所述R1寄存器的对应关系,以及,所述第二跳板代码在所述新版本程序中的地址与所述第一寄存器的对应关系,具体可以参见表3所示,具体为:
表3
地址 | 代码内容 |
base | StubR1,处理jr/jalr r1 |
base+80 | StubR2,处理jr/jalr v0 |
base+100 | StubR3,处理jr/jalr v1 |
base+120 | StubR4,处理jr/jalr a0 |
base+140 | StubR5,处理jr/jalr a1 |
base+160 | StubR6,处理jr/jalr a2 |
base+180 | StubR7,处理jr/jalr a3 |
base+200 | StubR8,处理jr/jalr t0 |
base+220 | StubR9,处理jr/jalr t1 |
base+240 | StubR10,处理jr/jalr t2 |
base+260 | StubR11,处理jr/jalr t3 |
base+280 | StubR12,处理jr/jalr t4 |
base+300 | StubR13,处理jr/jalr t5 |
base+320 | StubR14,处理jr/jalr t6 |
base+340 | StubR15,处理jr/jalr t7 |
base+240 | StubR16,处理jr/jalr s0 |
base+260 | StubR17,处理jr/jalr s1 |
base+280 | StubR18,处理jr/jalr s2 |
base+300 | StubR19,处理jr/jalr s3 |
base+320 | StubR20,处理jr/jalr s4 |
base+340 | StubR21,处理jr/jalr s5 |
base+360 | StubR22,处理jr/jalr s6 |
base+380 | StubR23,处理jr/jalr s7 |
base+400 | StubR24,处理jr/jalr k0 |
base+420 | StubR25,处理jr/jalr k1 |
base+440 | StubR26,处理jr/jalr t8 |
base+460 | StubR27,处理jr/jalr t9 |
base+480 | StubR28,处理jr/jalr gp |
base+500 | StubR29,处理jr/jalr sp |
base+520 | StubR30,处理jr/jalr fp |
base+540 | StubR31,处理jr/jalr ra |
表3中,v0对应的是R2寄存器,v1对应的R3寄存器,a0对应的是R4寄存器,a1对应的是R5寄存器,a2对应的是R6寄存器,a3对应的是R7寄存器,t0对应的是R8寄存器,t1对应的是R9寄存器,t2对应的是R10寄存器,t3对应的是R11寄存器,t4对应的是R12寄存器,t5对应的是R13寄存器,t6对应的是R14寄存器,t7对应的是R15寄存器,s0对应的是R16寄存器,s1对应的是R17寄存器,s2对应的是R18寄存器,s3对应的是R19寄存器,s4对应的是R20寄存器,s5对应的是R21寄存器,s6对应的是R22寄存器,s7对应的是R23寄存器,k0对应的是R24寄存器,k1对应的是R25寄存器,t8对应的是R26寄存器,t9对应的是R27寄存器,gp对应的是R28寄存器,sp对应的是R29寄存器,fp对应的是R30寄存器,ra对应的是R31寄存器。
表3中,StubR1为第一跳板代码在新版本程序中的地址,StubR2-StubR31分别为不同的第二跳板代码在新版本程序中的地址。跳板代码段可以通过对链接器(指的是一种软件链接工具)指定链接地址的方式放置在待处理程序的代码空间的起始位置(base),生成新版本程序。之后,对所形成的新版本程序进行改写,修改每一条jr reg1指令中的reg1为StubR1,修改每一条jalr reg1指令中的reg1为StubR1,从而将每一条jr reg1指令修改为j StubR1以及将每一条jalr reg1指令修改为jal StubR1指令,另外,也要修改每一条jr regN指令中的regN为StubRN,修改每一条jalr regN指令中的regN为StubRN,从而将每一条jr regN修改为j StubRN以及将每一条jalr regN指令修改为jal StubRN指令,进而获得改写后的新版本程序。
这样,当处理器执行待处理程序时,实际上是执行新版本程序。该新版本程序包括第三间接跳转指令、第四间接指令、第一跳板代码、第二跳板代码以及其他指令。实际上,待处理程序中,第一间接跳转指令和第三间接跳转指令的目标寄存器均为R1寄存器,第二间接跳转指令和第四间接跳转指令的目标寄存器均为第一寄存器。对于所形成的新版本程序,第一跳板代码中jr reg1或jalr reg1为第一间接跳转指令,位于第一跳板代码之外的jr reg1或jalrreg1为第三间接跳转指令,第一间接跳转指令和第三间接跳转指令的指令内容是相同的;并且,第二跳板代码中jr regN或jalr regN为第二间接跳转指令,位于第二跳板代码之外的jr regN或jalr regN为第四间接跳转指令,第二间接跳转指令和第四间接跳转指令的指令内容是相同的。
从程度的执行原理来说,对于新版本程序中的第三间接跳转指令来说,jr reg1为例,当处理器执行到改写后的新版本程序中的jr reg1所在的地址时,因为改写的原因,此时的jr reg1被改写为j StubR1,因此,处理器就可以跳转到stubR1(该stubR1为第一跳板代码在新版本程序中的地址)上去执行,即执行第一跳板代码,由于第一跳板代码中包括多条ssnop指令,因此,其在执行完一条或者多条ssnop指令后,就会获知之前处理器猜测的第一PC值是否正确。
如果在执行ssnop指令后,处理器确认之前猜测的第一PC值是正确,那么,处理器会继续执行第一跳板代码中的jr reg1(参见表1所示),这样确保了原来的jr reg1指令不会被遗漏掉;如果在执行ssnop指令之后,处理器确认第一PC值是错误的,会回退到第一跳板代码在所述新版本程序中的地址上,即回退到stubR1中,此时这个stubR1中的jr reg1里面的第一PC值是正确的,所以处理器会依次执行stubR1中的第一跳板代码。由这里可以看出,这样子可以避免处理器在猜测第一PC值后直接在所猜测的第一PC值上发出取指操作。
对于新版本程序中的第四间接跳转指令来说,jr regN为例,当处理器执行到改写后的新版本程序中的jr regN所在的地址时,因为改写的原因,此时的jr regN被改写为j StubRN,因此,处理器就可以跳转到StubRN(该StubRN为第二跳板代码在新版本程序中的地址)上去执行,即执行第二跳板代码,由于第二跳板代码中包括用于将所述R1寄存器中的立即数0xDFFF,FFFF与所述第二间接跳转指令对应的第一寄存器的地址空间进行按位与的指令,例如表2中“lui$at,0xdfff ori$at,$at,0xffff”,因此,处理器在执行完该指令后,会将第二PC值约束在Kseg0内,因此处理器就可以继续执行第二跳板代码中的第二间接跳转指令,相当于经过一个第二PC值的取指空间约束之后,再重新执行第四间接跳转指令。这样的过程可以确保第二PC值的正确,也确保处理器不会造成第四间接跳转指令的执行缺漏。
另外,上述实施例中涉及的jr指令、jalr指令、j指令和jal指令,可以参见现有技术的描述,在此不再赘述。
本发明提供的程序的重写方法,通过为第一间接跳转指令对应的R1寄存器构建第一跳板代码以及为第二间接跳转指令对应的第一寄存器构建第二跳板代码,获得跳板代码段后将其添加至待处理程序的起始地址空间,获得新版本程序以及映射表,并根据该映射表将新版本程序中第三间接跳转指令的目标寄存器修改为第一跳板代码在新版本程序中的地址,并将新版本程序中第四间接跳转指令的目标寄存器修改为第二跳板代码在新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到第三间接跳转指令时跳转执行第一跳板代码,以及,在处理器执行到第四间接跳转指令时跳转执行第二跳板代码。由于该第一跳板代码可以确定第一PC值是否正确,第二跳板代码可以将所猜测的第二PC值约束在Kseg0内,因此避免了处理器在错误的PC上进行取指带来的程序终止或死机的技术问题,提高了处理器的执行效率。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
图7为本发明提供的程序的重写装置实施例一的结构示意图。该装置可以集成在计算机中,还可以集成在计算机的处理器中,该装置也可以为独立的计算机。如图7所示,该装置包括:跳板代码构建模块10、第一获取模块11和第二获取模块12。
其中,跳板代码构建模块10,用于为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,所述跳板代码用于将所述间接跳转指令对应的程序计数器PC值约束在Kseg0内;
第一获取模块11,用于将所述跳板代码构建获取模块所获得的跳板代码段添加至所述待处理程序的地址空间的起始位置,获得新版本程序和映射表;其中,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系;
第二获取模块12,用于根据所述第一获取模块11获得的所述映射表,将所述新版本程序中位于所述跳板代码之外的间接跳转指令的目标寄存器修改为所述跳板代码在所述新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到所述位于所述跳板代码之外的间接跳转指令所在的地址时,跳转执行所述跳板代码。
本发明提供的程序的重写装置,可以执行上述方法实施例,其工作原理和技术效果类似,在此不再赘述。
进一步地,所述跳板代码包括第一跳板代码和/或第二跳板代码,所述间接跳转指令包括第一间接指令和/或第二间接跳转指令,所述第一间接跳转指令对应的目标寄存器为R1寄存器,所述第二间接跳转指令对应的目标寄存器为第一寄存器;
则所述跳板代码构建模块10,具体用于为所述第一间接跳转指令对应的R1寄存器构建所述第一跳板代码,获得所述跳板代码段;
或者,所述跳板代码构建模块10,具体用于为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,获得所述跳板代码段;
或者,所述跳板代码构建模块10,具体用于为所述第一间接跳转指令对应的R1寄存器构建所述第一跳板代码,以及,为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,并根据所述第一跳板代码和所述第二跳板代码,获得所述跳板代码段;
其中,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内;所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内。
更进一步地,所述跳板代码构建模块10,具体用于根据所述第一跳板代码和所述第二跳板代码,获得所述跳板代码段,具体为:
所述跳板代码构建模块10,具体用于将所述第一跳板代码和所述第二跳板代码按照所对应的寄存器编号从小到大排列,获得所述跳板代码段。
更进一步地,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系,具体为:
所述映射表包括所述第一跳板代码在所述新版本程序中的地址与所述R1寄存器的对应关系,和/或,所述第二跳板代码在所述新版本程序中的地址与所述第一寄存器的对应关系。
更进一步地,所述位于所述跳板代码之外的间接跳转指令包括:位于所述第一跳板代码之外的第三间接跳转指令,和/或,位于所述第二跳板代码之外的第四间接跳转指令;其中,所述第三间接跳转指令与所述第一间接跳转指令的指令内容相同,且所述第三间接跳转指令的目标寄存器为R1寄存器,所述第四间接跳转指令与所述第二间接跳转指令的指令内容相同,且所述第四间接跳转指令的目标寄存器为第一寄存器;
则所述第二获取模块12,具体用于根据所述第一获取模块11获得的所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码;
或者,所述第二获取模块12,具体用于根据所述第一获取模块11获得的所述映射表,将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码;
或者,所述第二获取模块12,具体用于根据所述第一获取模块11获得的所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,并将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码,以及,在所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码。
所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内,具体为:所述第一跳板代码,用于确定所猜测的所述第一PC值是否正确,以将所述第一PC值约束在Kseg0内。
图8为本发明提供的程序的重写装置实施例二的结构示意图。在本实施例中,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内,具体为:所述第一跳板代码,用于确定所猜测的所述第一PC值是否正确,以将所述第一PC值约束在Kseg0内。更具体的,所述第一跳板代码包括至少一条空指令和所述第一间接跳转指令;所述空指令用于确定所猜测的第一PC值是否正确。故,在上述图7所示实施例的基础上,进一步地,上述装置还可以包括:处理模块13和判断执行模块14。
处理模块13,用于执行所述改写后的新版本程序,并当执行到所述第三间接跳转指令所在的地址时,跳转执行所述第一跳板代码;
判断执行模块14,用于在执行所述空指令后确定所猜测的第一PC值正确时,指示所述处理模块13继续执行所述第一跳板代码中的所述第一间接跳转指令;并用于在执行所述空指令后确定所猜测的第一PC值错误时,指示所述处理模块13回退至所述第一跳板代码在所述新版本程序中的地址上,以重新执行所述第一跳板代码。
本发明提供的程序的重写装置,可以执行上述方法实施例,其工作原理和技术效果类似,在此不再赘述。
进一步地,所述第二跳板代码包括按位与指令和第二间接跳转指令;
所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内,具体为:
所述按位与指令,用于将所述R1寄存器中的立即数0xDFFF,FFFF与所述第二间接跳转指令对应的第一寄存器的地址空间进行按位与,以将所述第二PC值约束在Kseg0内。
更进一步地,所述第一间接跳转指令为jr reg1或jalr reg1,所述第二间接跳转指令为jr regN或jalr regN,所述N为大于1小于等于31的正整数,所述第一跳板代码在所述新版本程序中的地址为StubR1,所述第二跳板代码在所述新版本程序中的地址为StubRN;当所述第一寄存器为RN时,所述第二跳板代码中的第二间接跳转指令为jr regN或jalr regN;
则所述第二获取模块12,具体用于根据所述映射表,将所述新版本程序中第三间接跳转指令jr reg1中的reg1修改为StubR1,或者,将jalr reg1中的reg1修改为StubR1;以及,具体用于将所述新版本程序中第四间接跳转指令jr regN中的regN修改为StubRN,或者,将jalr regN中的regN修改为StubRN。
本发明提供的程序的重写装置,可以执行上述方法实施例,其工作原理和技术效果类似,在此不再赘述。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (20)
1.一种程序的重写方法,其特征在于,包括:
为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,所述跳板代码用于将所述间接跳转指令对应的程序计数器PC值约束在Kseg0内;
将所述跳板代码段添加至所述待处理程序的地址空间的起始位置,获得新版本程序和映射表;其中,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系;
根据所述映射表,将所述新版本程序中位于所述跳板代码之外的间接跳转指令的目标寄存器修改为所述跳板代码在所述新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到所述位于所述跳板代码之外的间接跳转指令所在的地址时,跳转执行所述跳板代码。
2.根据权利要求1所述的方法,其特征在于,所述跳板代码包括第一跳板代码和/或第二跳板代码,所述间接跳转指令包括第一间接指令和/或第二间接跳转指令,所述第一间接跳转指令对应的目标寄存器为R1寄存器,所述第二间接跳转指令对应的目标寄存器为第一寄存器;
所述为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,所述跳板代码用于将所述间接跳转指令对应的程序计数器PC值约束在Kseg0内,包括:
为所述第一间接跳转指令对应的R1寄存器构建所述第一跳板代码,获得所述跳板代码段;或者,
为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,获得所述跳板代码段;或者,
为所述第一间接跳转指令对应的R1寄存器构建所述第一跳板代码,以及,为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,并根据所述第一跳板代码和所述第二跳板代码,获得所述跳板代码段;
其中,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内;所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内。
3.根据权利要求2所述的方法,其特征在于,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系,具体为:
所述映射表包括所述第一跳板代码在所述新版本程序中的地址与所述R1寄存器的对应关系,和/或,所述第二跳板代码在所述新版本程序中的地址与所述第一寄存器的对应关系。
4.根据权利要求3所述的方法,其特征在于,所述位于所述跳板代码之外的间接跳转指令包括:位于所述第一跳板代码之外的第三间接跳转指令,和/或,位于所述第二跳板代码之外的第四间接跳转指令;其中,所述第三间接跳转指令与所述第一间接跳转指令的指令内容相同,且所述第三间接跳转指令的目标寄存器为R1寄存器,所述第四间接跳转指令与所述第二间接跳转指令的指令内容相同,且所述第四间接跳转指令的目标寄存器为第一寄存器;
所述根据所述映射表,将所述新版本程序中位于所述跳板代码之外的间接跳转指令的目标寄存器修改为所述跳板代码在所述新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到所述位于所述跳板代码之外的间接跳转指令时跳转执行所述跳板代码段,包括:
根据所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码;或者,
根据所述映射表,将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码;或者,
根据所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,并将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码,以及,在所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码。
5.根据权利要求1-4任一项所述的方法,其特征在于,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内,具体为:
所述第一跳板代码,用于确定所猜测的所述第一PC值是否正确,以将所述第一PC值约束在Kseg0内。
6.根据权利要求5所述的方法,其特征在于,所述第一跳板代码包括至少一条空指令和所述第一间接跳转指令;所述空指令用于确定所猜测的第一PC值是否正确;所述方法还包括:
执行所述改写后的新版本程序,并当执行到所述第三间接跳转指令所在的地址时,跳转执行所述第一跳板代码;
当执行所述空指令后确定所猜测的第一PC值正确时,继续执行所述第一跳板代码中的所述第一间接跳转指令;
当执行所述空指令后确定所猜测的第一PC值错误时,回退至所述第一跳板代码在所述新版本程序中的地址上,以重新执行所述第一跳板代码。
7.根据权利要求1-4任一项所述的方法,其特征在于,所述第二跳板代码包括按位与指令和第二间接跳转指令;
所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内,具体为:
所述按位与指令,用于将所述R1寄存器中的立即数0xDFFF,FFFF与所述第二间接跳转指令对应的第一寄存器的地址空间进行按位与,以将所述第二PC值约束在Kseg0内。
8.根据权利要求2所述的方法,其特征在于,所述根据所述第一跳板代码和所述第二跳板代码,获得所述跳板代码段,具体包括:
将所述第一跳板代码和所述第二跳板代码按照所对应的寄存器编号从小到大排列,获得所述跳板代码段。
9.根据权利要求4所述的方法,其特征在于,所述第一间接跳转指令为jr reg1或jalr reg1,所述第二间接跳转指令为jr regN或jalr regN,所述N为大于1小于等于31的正整数,所述第一跳板代码在所述新版本程序中的地址为StubR1,所述第二跳板代码在所述新版本程序中的地址为StubRN;
则所述根据所述映射表,将所述新版本程序中第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,具体包括:
根据所述映射表,将所述新版本程序中第三间接跳转指令jr reg1中的reg1修改为StubR1,或者,将jalr reg1中的reg1修改为StubR1;
所述根据所述映射表,将所述新版本程序中第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,具体包括:
将所述新版本程序中第四间接跳转指令jr regN中的regN修改为StubRN,或者,将jalr regN中的regN修改为StubRN。
10.根据权利要求9所述的方法,其特征在于,当所述第一寄存器为RN时,所述第二跳板代码中的第二间接跳转指令为jr regN或jalr regN。
11.一种程序的重写装置,其特征在于,包括:
跳板代码构建模块,用于为待处理程序中的间接跳转指令的目标寄存器构建跳板代码,获得跳板代码段,所述跳板代码用于将所述间接跳转指令对应的程序计数器PC值约束在Kseg0内;
第一获取模块,用于将所述跳板代码构建获取模块所获得的跳板代码段添加至所述待处理程序的地址空间的起始位置,获得新版本程序和映射表;其中,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系;
第二获取模块,用于根据所述第一获取模块获得的所述映射表,将所述新版本程序中位于所述跳板代码之外的间接跳转指令的目标寄存器修改为所述跳板代码在所述新版本程序中的地址,获得改写后的新版本程序,以使处理器在执行到所述位于所述跳板代码之外的间接跳转指令所在的地址时,跳转执行所述跳板代码。
12.根据权利要求11所述的装置,其特征在于,所述跳板代码包括第一跳板代码和/或第二跳板代码,所述间接跳转指令包括第一间接指令和/或第二间接跳转指令,所述第一间接跳转指令对应的目标寄存器为R1寄存器,所述第二间接跳转指令对应的目标寄存器为第一寄存器;
所述跳板代码构建模块,具体用于为所述第一间接跳转指令对应的R1寄存器构建所述第一跳板代码,获得所述跳板代码段;
或者,所述跳板代码构建模块,具体用于为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,获得所述跳板代码段;
或者,所述跳板代码构建模块,具体用于为所述第一间接跳转指令对应的R1寄存器构建所述第一跳板代码,以及,为所述第二间接跳转指令对应的第一寄存器构建所述第二跳板代码,并根据所述第一跳板代码和所述第二跳板代码,获得所述跳板代码段;
其中,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内;所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内。
13.根据权利要求12所述的装置,其特征在于,所述映射表包括所述跳板代码在所述新版本程序中的地址与所述间接跳转指令的目标寄存器之间的映射关系,具体为:
所述映射表包括所述第一跳板代码在所述新版本程序中的地址与所述R1寄存器的对应关系,和/或,所述第二跳板代码在所述新版本程序中的地址与所述第一寄存器的对应关系。
14.根据权利要求13所述的装置,其特征在于,所述位于所述跳板代码之外的间接跳转指令包括:位于所述第一跳板代码之外的第三间接跳转指令,和/或,位于所述第二跳板代码之外的第四间接跳转指令;其中,所述第三间接跳转指令与所述第一间接跳转指令的指令内容相同,且所述第三间接跳转指令的目标寄存器为R1寄存器,所述第四间接跳转指令与所述第二间接跳转指令的指令内容相同,且所述第四间接跳转指令的目标寄存器为第一寄存器;
则所述第二获取模块,具体用于根据所述第一获取模块获得的所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码;
或者,所述第二获取模块,具体用于根据所述第一获取模块获得的所述映射表,将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码;
或者,所述第二获取模块,具体用于根据所述第一获取模块获得的所述映射表,将所述新版本程序中所述第三间接跳转指令的目标寄存器修改为所述第一跳板代码在所述新版本程序中的地址,并将所述新版本程序中所述第四间接跳转指令的目标寄存器修改为所述第二跳板代码在所述新版本程序中的地址,获得所述改写后的新版本程序,以使处理器在执行到所述第三间接跳转指令所在的地址时跳转执行所述第一跳板代码,以及,在所述处理器执行到所述第四间接跳转指令所在的地址时跳转执行所述第二跳板代码。
15.根据权利要求11-14任一项所述的装置,其特征在于,所述第一跳板代码用于将所述第一间接跳转指令对应的位于所述R1寄存器中的第一PC值约束在Kseg0内,具体为:
所述第一跳板代码,用于确定所猜测的所述第一PC值是否正确,以将所述第一PC值约束在Kseg0内。
16.根据权利要求15所述的装置,其特征在于,所述第一跳板代码包括至少一条空指令和所述第一间接跳转指令;所述空指令用于确定所猜测的第一PC值是否正确;所述装置还包括:
处理模块,用于执行所述改写后的新版本程序,并当执行到所述第三间接跳转指令所在的地址时,跳转执行所述第一跳板代码;
判断执行模块,用于在执行所述空指令后确定所猜测的第一PC值正确时,指示所述处理模块继续执行所述第一跳板代码中的所述第一间接跳转指令;并用于在执行所述空指令后确定所猜测的第一PC值错误时,指示所述处理模块回退至所述第一跳板代码在所述新版本程序中的地址上,以重新执行所述第一跳板代码。
17.根据权利要求11-14任一项所述的装置,其特征在于,所述第二跳板代码包括按位与指令和第二间接跳转指令;
所述第二跳板代码用于将所述第二间接跳转指令对应的位于所述第一寄存器中的第二PC值约束在Kseg0内,具体为:
所述按位与指令,用于将所述R1寄存器中的立即数0xDFFF,FFFF与所述第二间接跳转指令对应的第一寄存器的地址空间进行按位与,以将所述第二PC值约束在Kseg0内。
18.根据权利要求12所述的装置,其特征在于,所述跳板代码构建模块,具体用于根据所述第一跳板代码和所述第二跳板代码,获得所述跳板代码段,具体为:
所述跳板代码构建模块,具体用于将所述第一跳板代码和所述第二跳板代码按照所对应的寄存器编号从小到大排列,获得所述跳板代码段。
19.根据权利要求14所述的装置,其特征在于,所述第一间接跳转指令为jr reg1或jalr reg1,所述第二间接跳转指令为jr regN或jalr regN,所述N为大于1小于等于31的正整数,所述第一跳板代码在所述新版本程序中的地址为StubR1,所述第二跳板代码在所述新版本程序中的地址为StubRN;
所述第二获取模块,具体用于根据所述映射表,将所述新版本程序中第三间接跳转指令jr reg1中的reg1修改为StubR1,或者,将jalr reg1中的reg1修改为StubR1;以及,具体用于将所述新版本程序中第四间接跳转指令jr regN中的regN修改为StubRN,或者,将jalr regN中的regN修改为StubRN。
20.根据权利要求19所述的装置,其特征在于,当所述第一寄存器为RN时,所述第二跳板代码中的第二间接跳转指令为jr regN或jalr regN。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510498546.9A CN106445575B (zh) | 2015-08-13 | 2015-08-13 | 程序的重写方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510498546.9A CN106445575B (zh) | 2015-08-13 | 2015-08-13 | 程序的重写方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106445575A true CN106445575A (zh) | 2017-02-22 |
CN106445575B CN106445575B (zh) | 2019-12-31 |
Family
ID=58093760
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510498546.9A Active CN106445575B (zh) | 2015-08-13 | 2015-08-13 | 程序的重写方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106445575B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101697131A (zh) * | 2009-11-04 | 2010-04-21 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
CN102156634A (zh) * | 2011-04-20 | 2011-08-17 | 北京北大众志微系统科技有限责任公司 | 一种实现值关联间接跳转预测的方法 |
US20130067246A1 (en) * | 2008-10-10 | 2013-03-14 | Apple Inc. | Dynamic Trampoline and Structured Code Generation in a Signed Code Environment |
CN103955354A (zh) * | 2014-05-09 | 2014-07-30 | 龙芯中科技术有限公司 | 重定位方法和装置 |
-
2015
- 2015-08-13 CN CN201510498546.9A patent/CN106445575B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130067246A1 (en) * | 2008-10-10 | 2013-03-14 | Apple Inc. | Dynamic Trampoline and Structured Code Generation in a Signed Code Environment |
CN101697131A (zh) * | 2009-11-04 | 2010-04-21 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
CN102156634A (zh) * | 2011-04-20 | 2011-08-17 | 北京北大众志微系统科技有限责任公司 | 一种实现值关联间接跳转预测的方法 |
CN103955354A (zh) * | 2014-05-09 | 2014-07-30 | 龙芯中科技术有限公司 | 重定位方法和装置 |
Non-Patent Citations (2)
Title |
---|
RICHARD WARTELL等: ""Securing Untrusted Code via Compiler-Agnostic"", 《PROCEEDINGS OF THE 28TH ANNUAL COMPUTER SECURITY APPLICATIONS CONFERENCE》 * |
邱吉等: ""基于二进制插桩的共享指令集异构多核处理器进程迁移方法"", 《髙技术通讯》 * |
Also Published As
Publication number | Publication date |
---|---|
CN106445575B (zh) | 2019-12-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Fiterău-Broştean et al. | Combining model learning and model checking to analyze TCP implementations | |
Song et al. | Normal forms for some classes of sequential spiking neural P systems | |
Wells | Typability and type checking in System F are equivalent and undecidable | |
Jensen et al. | Colored Petri nets: a graphical language for formal modeling and validation of concurrent systems | |
Aarts et al. | Learning i/o automata | |
CN110169012B (zh) | 使用多个区块链交易来执行计算机实现的任务的方法和装置 | |
Song et al. | Small universal spiking neural P systems with anti-spikes | |
CN103049710B (zh) | 用于sm2数字签名验证算法的fpga芯片 | |
JP6361837B2 (ja) | 訓練装置、訓練方法、及び訓練プログラム | |
Koomen | The design of communicating systems: a system engineering approach | |
Song et al. | The darpa cyber grand challenge: A competitor's perspective, part 2 | |
CN104049947B (zh) | 基于动态重命名的矢量寄存器堆的寄存器重新配置 | |
JP2011048581A (ja) | ソースコード解析システム | |
CN106155855B (zh) | 对微处理器进行功能验证的方法及服务器 | |
CN101290589B (zh) | 一种并发指令操作方法和装置 | |
CN102567556A (zh) | 一种面向调试的处理器验证方法及验证设备 | |
CN106445575A (zh) | 程序的重写方法和装置 | |
CN103942035B (zh) | 处理指令的方法、编译器及指令处理器 | |
Schoolderman et al. | Efficient Verification of Optimized Code: Correct High-speed X25519 | |
CN200941211Y (zh) | 用于密码学运算的微处理器内核 | |
CN105264519B (zh) | 一种列式数据库处理方法及装置 | |
CN101819608B (zh) | 一种微处理器指令级随机验证中加速取指的装置和方法 | |
Kuru et al. | Verifying programs under snapshot isolation and similar relaxed consistency models | |
Aung et al. | A tool for model checking eventual model checking in a stratified way | |
Armstrong et al. | Formalisation of MiniSail in the Isabelle theorem prover |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CP01 | Change in the name or title of a patent holder | ||
CP01 | Change in the name or title of a patent holder |
Address after: 100095 Building 2, Longxin Industrial Park, Zhongguancun environmental protection technology demonstration park, Haidian District, Beijing Patentee after: Loongson Zhongke Technology Co.,Ltd. Address before: 100095 Building 2, Longxin Industrial Park, Zhongguancun environmental protection technology demonstration park, Haidian District, Beijing Patentee before: LOONGSON TECHNOLOGY Corp.,Ltd. |