补丁处理的方法和设备以及生成补丁的方法和设备的制造方法_2

文档序号:9810318阅读:来源:国知局
存第一调用指令的返回地址的指令,并且,在补丁文件还具有用于保存第一函数的表地址与第一调用指令的返回地址的预留空间。因此,一方面,中间代码调用第三函数时丢失的第一函数的表地址,可以在执行完第三函数返回第一函数之前从预留空间恢复,因此,返回第一函数之后,在执行第一函数的过程中可以按照已恢复的表地址从第一函数的表结构中查找调用对象的地址,从而避免了从第三函数返回第一函数之后再执行第一函数时无法查找到第一函数的调用对象,避免了软件的运行出现故障,减少了软件运行出现中断的情况;另一方面,虽然中间代码调用第三函数时第一调用指令的返回地址被替换成了第二调用指令的返回地址,但在执行完第三函数返回第一函数之前可以从预留空间中恢复第一调用指令的返回地址,按照已恢复的第一调用指令的返回地址可以返回第一函数,从而避免了第三函数执行完之后无法返回第一函数继续后续指令的执行,避免了软件的运行出现故障,减少了软件运行出现中断的情况;再一方面,在补丁文件中留出预留空间来保存第一函数的表地址和第一调用指令的返回地址,所保存的表地址和返回地址不会占用栈帧结构,从而保证了第三函数的调用与第二函数的调用具有相同的栈帧结构,避免了栈帧结构改变所造成的信息获取错误,进而避免了信息获取错误导致的软件运行中断。由此可见,通过本发明实施例,补丁文件对软件进行更新之后,导致软件中断运行的许多因素得以避免,因此,软件运行中断的可能性大大降低。
【附图说明】
[0055]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
[0056]图1为现有技术中的补丁处理方式;
[0057]图2为本发明实施例中一种补丁处理方法的流程示意图;
[0058]图3为本发明实施例中设备执行代码指令的流程示意图;
[0059]图4为本发明实施例中一种补丁文件的处理流程示意图;
[0060]图5为本发明实施例中一种生成补丁文件的方法的流程示意图;
[0061 ]图6为本发明实施例中一种补丁处理设备的结构示意图;
[0062]图7为本发明实施例中一种生成补丁文件的设备的结构示意图。
【具体实施方式】
[0063]为了使本技术领域的人员更好地理解本发明中的方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。
[0064]发明人经过研究发现,在图1所示的现有技术中,在执行第一函数的过程中,为了完成第一函数对各调用对象的调用指令,需要通过第一函数的表结构来查找第一函数的各调用对象的地址。而第一函数的表结构需要通过第一函数的表地址来查找。但是,当第一函数调用第二函数时,在第二函数的第一条指令下设备会跳转到补丁文件中的第三函数,在第三函数的执行过程中第一函数的表地址会丢失,因此,当第三函数执行完返回第一函数时,第一函数后续指令的执行过程中第一函数的表结构是无法查找到的,第一函数后续指令也就无法实现对调用对象的调用,因此,软件的运行就会出现故障,从而导致软件的运行出现中断。
[0065]为了解决现有技术的上述问题,在本发明实施例中,补丁文件包括第三函数、中间代码和预留空间,其中,在中间代码中,用于跳转至第三函数的第二调用指令之前具有用于保存第一函数的表地址的指令和用于保存第一调用指令的返回地址的指令,第二调用指令之后具有用于恢复第一函数的表地址的指令和用于保存第一调用指令的返回地址的指令,并且,预留空间用于保存第一函数的表地址与第一调用指令的返回地址。因此,中间代码调用第三函数时丢失的第一函数的表地址,可以在执行完第三函数返回第一函数之前从预留空间恢复,因此,返回第一函数之后,在执行第一函数后续指令的过程中第一函数的表结构能够被查找到,第一函数后续指令也就能够实现对调用对象的调用,从而避免了软件的运行出现故障,减少了软件运行出现中断的情况。此外,虽然中间代码调用第三函数时第一调用指令的返回地址被替换成了第二调用指令的返回地址,但在执行完第三函数返回第一函数之前可以从预留空间中恢复第一调用指令的返回地址并据此返回第一函数,从而避免了软件的运行出现故障,减少了软件运行出现中断的情况。再此外,第一函数的表地址和第一调用指令的返回地址保存在补丁文件中留出的预留空间中,所保存的表地址和返回地址不会改变栈帧结构,从而避免了栈帧结构改变所造成的信息获取错误,进而避免了信息获取错误导致的软件运行中断。由此可见,通过本发明实施例,补丁文件对软件进行更新之后,导致软件中断运行的许多因素得以避免,因此,软件运行中断的可能性大大降低。
[0066]下面结合附图,通过实施例来详细说明本发明中启动操作系统的方法、相关设备和系统的实现方式。
[0067]参见图2,示出了本发明实施例中一种补丁处理方法的流程示意图。在本实施例中,所述方法可以应用于运行软件的设备,所述软件是需要补丁处理的软件,所述设备例如可以是通信设备。该方法例如具体可以包括如下步骤:
[0068]S201、响应于执行到第一函数中的第一调用指令,跳转到第二函数。
[0069]其中,所述第一函数可以是软件的进程创建的函数,如主函数。所述第二所述第二函数能够被所述第一函数调用,也即,在所述第一函数的指令中包括有用于调用所述第二函数的第一调用指令。可以理解的是,所述第二函数是软件在加载补丁文件之前已经具有的函数,也即,所述第二函数是软件未补丁的原函数。在本实施例中,所述补丁处理可以是对所述第二函数进行的更新处理。
[0070]当设备运行软件的进程时,所述设备按照所述第一函数的指令顺序依次执行所述第一函数的各个指令。当执行到所述第一函数中用于调用所述第二函数的第一调用指令时,所述设备从所述第一函数的所述第一调用指令跳转到所述第二函数,开始按照所述第二函数的指令顺序执行所述第二函数的指令。
[0071 ]需要说明的是,当所述设备执行到所述第一函数的所述第一调用指令时,在跳转到所述第二函数之前,可以将所述第一函数中所述第一调用指令的下一条指令的地址记录为返回地址,以便在跳转到所述第二函数之后所述处理器能够返回到所述第一函数继续执行所述第一函数中所述第一调用指令之后的指令。
[0072]S202、响应于执行到所述第二函数的第一条指令,跳转到补丁文件的中间代码。
[0073]所述设备响应于所述第一函数的所述第一调用指令而跳转到所述第二函数之后,执行所述第二函数的第一条指令。在软件加载补丁文件之后,所述第二函数的第一条指令是用于调用所述补丁文件的中间代码的调用指令。所述设备执行到所述第二函数的第一条指令,所述设备从所述第二函数的第一条指令跳转到所述补丁文件的中间代码,开始执行所述中间代码的指令。可以理解的是,当所述设备执行到所述第二函数的第一条指令时,所述设备记录的返回地址不变。也即,在所述设备跳转到所述中间代码之后,所述设备记录的返回地址依然是所述第一函数中所述第一调用指令的下一条指令的地址令的地址。因此,在软件加载所述补丁文件之后,所述设备实际上不再执行软件未加载所述补丁文件之前所述第二函数中的所有指令,而是执行所述补丁文件中的指令。
[0074]需要说明的是,在软件加载到所述补丁文件的过程中,需要更新的所述第二函数中可以增加一条用于调用所述补丁文件提供的代码的指令,作为所述第二函数的第一条指令。此后,所述设备在调用所述第二函数时可以跳转到补丁文件提供的函数而不再执行所述第二函数的原有指令,因此,补丁文件就实现了对第二函数的更新。具体地,为了实现软件加载所述补丁文件,本实施例如还可以包括:获取所述补丁文件,并按照所述补丁文件获取所述第二函数的地址;根据所述第二函数的地址,在所述第二函数中添加用于跳转到所述中间代码的指令,作为所述第二函数的第一条指令。在【具体实施方式】中,所述补丁文件中记录有所述第二函数的标识或地址。所述设备在将所述补丁文件加载到软件的过程中可以根据所述补丁文件中的所述第二函数的标识或地址,确定所述补丁文件用于对所述第二函数进行更新,并获取所述第二函数的地址。根据所述第二函数的地址查找到所述第二函数,生成一条用于条状到所述补丁文件的中间代码的指令,并将这一条指令添加到所述第二函数作为所述第二函数的第一条指令。
[0075]S203、按照所述中间代码的指令,将所述第一函数的表地址和所述第一调用指令的返回地址保存到所述补丁文件的预留空间,所述第一函数的表地址为所述第一函数的表结构的地址,所述第一函数的表结构用于记录所述第一函数的调用对象的地址。
[0076]具体地,补丁文件中具有用于保存表地址和返回地址的预留空间,并且,所述补丁文件的中间代码包含有用于保存表地址的指令和用于保存返回地址的指令。所述设备响应于所述第二函数的第一条指令而跳转到所述中间代码之后,执行所述中间代码的用于保存表地址的指令和用于保存返回地址的指令,将当前记录的所述第一函数的表地址和所述第一调用指令的返回地址保存到所述补丁文件的预留空间。
[0077]可以理解的是,在执行所述第一函数的过程中,为了实现第一函数中的各调用指令,所述设备需要在内存中记录有所述第一函数的表地址。具体地,所述设备按照所述第一函数的表地址查找到所述第一函数的表
当前第2页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1