内核在线补丁的方法、装置和系统转让专利

申请号 : CN200910077423.2

文献号 : CN101799763B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 戴华飞郑伟

申请人 : 华为技术有限公司

摘要 :

本发明实施例涉及一种内核在线补丁的方法、装置和系统,其中,装置包括:内核在线补丁的管理装置或内核补丁的生成装置;方法包括:在操作系统中加载预先制作的补丁文件,补丁文件包括系统内核的原函数对应的补丁函数,以及原函数的源地址与补丁函数的目的地址的第一对应关系;在原函数的起始执行位置设置第一断点;在系统线程执行原函数、并在线程执行过程中由于第一断点产生断点异常时,根据第一对应关系,修改第一断点的返回执行地址为与原函数对应的补丁函数的目的地址并去除第一断点。本发明实施例内核在线补丁处理过程中,对操作系统的正常运行影响较小,不需要重启操作系统即可实现补丁函数的生效,因此满足电信级产品高可靠性的要求。

权利要求 :

1.一种内核在线补丁的方法,其特征在于,包括:

编译补丁源代码,得到目标文件,根据所述目标文件生成补丁文件;所述补丁文件包括系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系;

所述目标文件包括所述补丁源代码的补丁函数的符号信息和重定位信息;

所述补丁文件还包括:所述符号信息和重定位信息相应的偏移重定位信息、预先确定的缺省补丁加载地址和补丁文件运行空间大小信息;

在操作系统中补丁区内存大小小于所述补丁文件运行空间大小时,为加载所述补丁文件分配新的补丁区内存;

比较所述缺省补丁加载地址和所述新的补丁区内存地址,如果所述缺省补丁加载地址与所述新的补丁区内存地址相同时,将所述补丁文件包括的补丁数据复制到所述新的补丁区内存中;如果不同,根据所述偏移重定位信息对所述补丁文件包括的补丁数据进行重定位,将重定位后的补丁数据复制到所述新的补丁区内存中;

在所述原函数的起始执行位置设置第一断点;

在系统线程执行所述原函数、并在线程执行过程中由于所述第一断点产生断点异常时,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点。

2.根据权利要求1所述的内核在线补丁的方法,其特征在于,在所述原函数的起始执行位置设置第一断点之前,还包括:确定所述原函数中从起始代码处开始,与无条件跳转指令所需的字节数相应的临时代码;

生成所述临时代码对应的等价代码,所述等价代码的结束位置包括所述无条件跳转指令,以使在执行所述等价代码之后,跳转执行所述原函数除所述临时代码外的其他代码;

保存所述等价代码,并建立所述等价代码的目的地址到所述原函数的源地址以及所述补丁函数的目的地址的第二对应关系。

3.根据权利要求2所述的内核在线补丁的方法,其特征在于,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点,包括:获取所述操作系统当前所有的线程;

检查获取的所有线程的调用栈,在检查结果为没有线程正在执行需要打补丁的所述原函数时,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点。

4.根据权利要求3所述的内核在线补丁的方法,其特征在于,还包括:在检查结果为有线程正在执行需要打补丁的所述原函数时,设置第一等待时长;

在设置的所述第一等待时长之后,重复检查相应线程的调用栈。

5.根据权利要求4所述的内核在线补丁的方法,其特征在于,在检查结果为有线程正在执行需要打补丁的所述原函数时,还包括:检查正在执行需要打补丁的原函数的线程的调用栈,在检查结果为当前线程在发生断点异常之前执行过其他原函数时,根据所述第二对应关系,修改所述第一断点的返回执行地址为与发生断点异常的原函数对应的等价代码的目的地址;否则,根据所述第一对应关系,修改所述第一断点的返回执行地址为与发生断点异常的原函数对应的补丁函数的目的地址。

6.根据权利要求2所述的内核在线补丁的方法,其特征在于,在确定所述临时代码之后,还包括:保存所述临时代码;

建立所述临时代码的目的地址到所述等价代码的目的地址、所述原函数的源地址以及所述补丁函数的目的地址的第三对应关系。

7.根据权利要求6所述的内核在线补丁的方法,其特征在于,在接收到将补丁函数恢复成相应的原函数的外部指令时,还包括:在所述补丁函数的起始执行位置设置第二断点;

在系统线程执行所述补丁函数、并在线程执行过程中由于所述第二断点产生断点异常时,根据所述第三对应关系,获取所述补丁函数对应的临时代码;

根据获取的所述临时代码,将所述补丁函数恢复为所述补丁函数对应的原函数。

8.根据权利要求7所述的内核在线补丁的方法,其特征在于,根据所述临时代码,将所述补丁函数恢复为所述原函数,包括:获取所述操作系统当前所有的线程;

检查获取的所有线程的调用栈,在检查结果为没有线程正在执行需要恢复的所述补丁函数时,根据获取的所述临时代码,将所述补丁函数恢复为所述补丁函数对应的原函数。

9.根据权利要求8所述的内核在线补丁的方法,其特征在于,还包括:在检查结果为有线程正在执行需要恢复的所述补丁函数时,设置第二等待时长;

在设置的所述第二等待时长之后,重复检查相应线程的调用栈。

10.根据权利要求9所述的内核在线补丁的方法,其特征在于,在检查结果为有线程正在执行需要恢复的所述补丁函数时,还包括:检查正在执行需要恢复的补丁函数的线程的调用栈,在检查结果为当前线程在发生断点异常之前执行过其他原函数时,根据获取的所述临时代码,将所述补丁函数恢复为所述补丁函数对应的原函数;否则,根据所述第一对应关系,设置所述第二断点的返回执行地址为所述补丁函数的目的地址。

11.一种内核在线补丁的管理装置,其特征在于,包括:

加载模块,用于在操作系统中加载预先制作的补丁文件,所述补丁文件包括系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系;

第一断点设置模块,用于在所述原函数的起始执行位置设置第一断点;

补丁模块,用于在系统线程执行所述原函数、并在线程执行过程中由于所述第一断点产生断点异常时,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点;

等价代码生成模块,用于确定所述原函数中从起始代码处开始,与无条件跳转指令所需的字节数相应的临时代码;生成所述临时代码对应的等价代码,所述等价代码的结束位置包括所述无条件跳转指令,以使在执行所述等价代码之后,跳转执行所述原函数除所述临时代码外的其他代码;

等价代码存储模块,用于保存所述等价代码,并建立所述等价代码的目的地址到所述原函数的源地址以及所述补丁函数的目的地址的第二对应关系。

12.根据权利要求11所述的内核在线补丁的管理装置,其特征在于,所述补丁模块包括:第一线程调用栈检查单元,用于获取所述操作系统当前所有的线程,检查获取的所有线程的调用栈;

补丁生效单元,用于在检查结果为没有线程正在执行需要打补丁的所述原函数时,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点;

补丁延迟生效单元,用于在检查结果为有线程正在执行需要打补丁的所述原函数时,设置第一等待时长;在设置的所述第一等待时长之后,激活所述第一线程调用栈检查单元重复检查相应线程的调用栈;

第一断点异常处理单元,用于检查正在执行需要打补丁的原函数的线程的调用栈,在检查结果为当前线程在发生断点异常之前执行过其他原函数时,根据所述第二对应关系,修改所述第一断点的返回执行地址为与发生断点异常的原函数对应的等价代码的目的地址;否则,根据所述第一对应关系,修改所述第一断点的返回执行地址为与发生断点异常的原函数对应的补丁函数的目的地址。

13.根据权利要求11所述的内核在线补丁的管理装置,其特征在于,还包括:临时代码存储模块,用于保存所述临时代码;建立所述临时代码的目的地址到所述等价代码的目的地址、所述原函数的源地址以及所述补丁函数的目的地址的第三对应关系。

14.根据权利要求13所述的内核在线补丁的管理装置,其特征在于,还包括:第二断点设置模块,用于在所述补丁函数的起始执行位置设置第二断点;

补丁恢复模块,用于在系统线程执行所述补丁函数、并在线程执行过程中由于所述第二断点产生断点异常时,根据所述第三对应关系,获取所述补丁函数对应的临时代码;根据获取的所述临时代码,将所述补丁函数恢复为所述补丁函数对应的原函数。

15.根据权利要求14所述的内核在线补丁的管理装置,其特征在于,所述补丁恢复模块包括:第二线程调用栈检查单元,用于获取所述操作系统当前所有的线程,检查获取的所有线程的调用栈;

补丁恢复单元,用于在检查结果为没有线程正在执行需要恢复的所述补丁函数时,根据获取的所述临时代码,将所述补丁函数恢复为所述补丁函数对应的原函数;

补丁延迟恢复单元,用于在检查结果为有线程正在执行需要恢复的所述补丁函数时,设置第二等待时长;在设置的所述第二等待时长之后,激活所述第二线程调用栈检查单元重复检查相应线程的调用栈;

第二断点异常处理单元,用于检查正在执行需要恢复的补丁函数的线程的调用栈,在检查结果为当前线程在发生断点异常之前执行过其他原函数时,根据获取的所述临时代码,将所述补丁函数恢复为所述补丁函数对应的原函数;否则,根据所述第一对应关系,设置所述第二断点的返回执行地址为所述补丁函数的目的地址。

说明书 :

内核在线补丁的方法、装置和系统

技术领域

[0001] 本发明实施例涉及计算机技术,特别是涉及一种内核在线补丁的方法、装置和系统。

背景技术

[0002] 内核是操作系统的核心,负责管理系统的进程、内存、设备驱动程序、文件和网络系统等,决定着系统的性能和稳定性。由于采用替换内核并重启系统的内核补丁方法,不能满足电信级产品的高可靠性要求,因此,需要一种支持在内核运行过程中可立即升级操作系统内核功能的补丁技术。现有的内核热补丁技术以内存补丁的形式在内核运行过程中对内核功能进行修复,不需要替换整个内核,有利于提高系统的可靠性,因此,内核热补丁技术广泛应用到电信级产品操作系统内核功能的修复中。
[0003] 基于内核热补丁技术的现有技术之一,采用如下方法实现:编译两份源代码(包括内核修改前的源代码和修改后的补丁源代码),并比较编译的两份源代码中所有目标文件的差异,将确定出的具有差异的目标文件与实现自动加载功能的脚本文件(如:ksplice kernel module)连接,生成一个Linux系统可识别的、具有自加载功能的补丁包文件;之后重启Linux系统,通过外部控制命令(如:insmod命令)触发补丁包文件自动加载到Linux系统中并自行生效。在补丁生效过程中,通过Linux系统的stop_machine_run系统函数为系统中的每个CPU创建一个最高优先级的不可中断的线程,在创建的线程中检查系统中所有线程的调用栈,检查系统中是否有现成正在执行原内核中与补丁包文件中定义的补丁函数同名的函数,如果没有,则采用补丁函数替换原函数;否则,先退出每个CPU上运行的最高优先级的不可中断的线程,等待一段时间后重复检查上述创建的线程中执行的函数,如果重复检查的次数超出预设允许次数,则内核打补丁失败。
[0004] 发明人在实现本发明实施过程中发现,现有技术在进行内核热补丁处理过程中,中断系统所有其他线程的运行,操作系统的正常运行受到严重影响,不利于保障电信级产品高可靠性的要求。

发明内容

[0005] 本发明实施例提供一种内核在线补丁的方法、装置和系统,用以实现内核在线补丁处理,并降低内核在线补丁处理对操作系统正常运行的影响。
[0006] 本发明实施例提供了一种内核在线补丁的方法,包括:
[0007] 在操作系统中加载预先制作的补丁文件,所述补丁文件包括系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系;
[0008] 在所述原函数的起始执行位置设置第一断点;
[0009] 在系统线程执行所述原函数、并在线程执行过程中由于所述第一断点产生断点异常时,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点。
[0010] 本发明实施例还提供了一种内核在线补丁的管理装置,包括:
[0011] 加载模块,用于在操作系统中加载预先制作的补丁文件,所述补丁文件包括系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系;
[0012] 第一断点设置模块,用于在所述原函数的起始执行位置设置第一断点;
[0013] 补丁模块,用于在系统线程执行所述原函数、并在线程执行过程中由于所述第一断点产生断点异常时,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点。
[0014] 本发明实施例还提供了一种内核补丁的生成装置,包括:
[0015] 编译模块,用于编译补丁源代码,得到目标文件;
[0016] 补丁文件生成模块,用于根据所述目标文件生成所述补丁文件,所述补丁文件包括:系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系。
[0017] 本发明实施例还提供了一种内核在线补丁的系统,包括:
[0018] 内核补丁的生成装置,用于编译补丁源代码,得到目标文件;根据所述目标文件生成所述补丁文件;所述补丁文件包括系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系;
[0019] 内核在线补丁的管理装置,用于在操作系统中加载所述补丁文件;在所述原函数的起始执行位置设置第一断点;在系统线程执行所述原函数、并在线程执行过程中由于所述第一断点产生断点异常时,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点。
[0020] 本发明实施例提供的内核在线补丁的方法、装置和系统,可在操作系统内核的运行过程中对内核文件进行打补丁(即:在线补丁)处理;由于本发明实施例是通过设置断点以及修改断点返回执行地址的方式实现内核的在线补丁处理,在对内核在线补丁完成后,可在不停止系统运行的情形下进行内核文件的在线补丁,不需要重启操作系统即可实现补丁函数的生效,因此可满足电信级产品高可靠性的要求。

附图说明

[0021] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0022] 图1为本发明第一实施例提供的内核在线补丁的方法流程图;
[0023] 图2为本发明第二实施例提供的补丁文件制作框图;
[0024] 图3为本发明第三实施例提供的内核补丁生效控制流程图;
[0025] 图4为本发明第四实施例提供的等价代码生成方法流程图;
[0026] 图5为本发明第五实施例提供的补丁延迟生效控制方法流程图;
[0027] 图6为本发明内核补丁生效控制过程中断点异常处理应用场景示意图;
[0028] 图7为本发明第六实施例提供的断点异常处理方法流程图;
[0029] 图8为本发明第七实施例提供的补丁函数恢复方法流程图;
[0030] 图9为本发明第八实施例提供的补丁延迟恢复控制方法流程图;
[0031] 图10为本发明第九实施例提供的在补丁函数恢复过程中断点异常处理方法流程图;
[0032] 图11为本发明第十实施例提供的内核在线补丁的管理装置结构示意图;
[0033] 图12为本发明第十一实施例提供的内核在线补丁的管理装置结构示意图;
[0034] 图13为本发明第十二实施例提供的内核补丁的生成装置结构示意图;
[0035] 图14为本发明第十三实施例提供的内核在线补丁的系统结构示意图。

具体实施方式

[0036] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0037] 图1为本发明第一实施例提供的内核在线补丁的方法流程图。如图1所示,本实施例包括:
[0038] 步骤11、在操作系统中加载预先制作的补丁文件,所述补丁文件包括系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系。
[0039] 可预先对源代码进行编译生成需要打补丁的目标文件,根据目标文件制作成被加载后可运行的补丁文件。补丁文件包括:系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系。将制作好的补丁文件加载到操作系统中。
[0040] 在将补丁文件加载到操作系统中,可对操作系统中的补丁区进行动态扩展,例如:在系统中补丁区内存大小小于所述补丁文件运行空间大小时,为加载所述补丁文件分配新的补丁区内存;比较所述缺省补丁加载地址和所述新的补丁区内存地址,如果所述缺省补丁加载地址与所述新的补丁区内存地址相同时,将所述补丁文件包括的补丁数据复制到所述新的补丁区内存中;如果不同,根据所述偏移重定位信息对所述补丁文件包括的补丁数据进行目的地址的重定位,将重定位后的补丁数据复制到所述新的补丁区内存中;所述补丁数据包括:系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系。
[0041] 当完成向操作系统中加载补丁文件的处理之后,可通过步骤12和步骤13进行补丁文件的生效控制,即在操作系统内核运行过程中,采用补丁文件中的补丁函数替代系统内核的相应原函数,从而通过补丁函数进行内核文件的缺陷修复或功能升级。
[0042] 步骤12、在所述原函数的起始执行位置设置断点,该断点即为本发明实施例的第一断点。
[0043] 设置第一断点的主要目的是为了生效补丁函数。
[0044] 可通过在操作系统中创建一个普通优先级的内核线程对补丁文件的生效进行控制。为了实现在内核运行过程中对内核进行补丁处理(即:在线补丁处理),可在原函数的起始位置设置断点,当线程执行需要打补丁的函数时,会发生断点异常,对该断点异常进行处理可进行补丁文件的生效控制。
[0045] 步骤13、在系统线程执行所述原函数、并在线程执行过程中由于第一断点产生断点异常时,根据所述第一对应关系,修改第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点。
[0046] 在线程执行设置有断点的原函数并发生第一断点产生的断点异常时,可将第一断点的返回执行地址修改为需要打补丁的原函数对应的补丁函数的目的地址,这样,当该线程或其他线程执行该函数时,会自动跳转执行原函数对应的补丁函数,从而完成对原函数的补丁生效处理。
[0047] 本实施例可在操作系统内核的运行过程中对内核文件进行在线补丁处理,在内核在线补丁的处理过程中通过创建普通线程即可实现,不需要为系统中每个CPU专门创建一个最高优先级的线程而造成系统原有线程的运行中断,有利于缩短系统线程响应时间,从而对操作系统的正常运行影响较小;由于实施例是通过设置断点以及修改断点返回执行地址的方式实现内核的在线补丁处理,在对内核在线补丁完成后,不需要重启操作系统即可实现补丁函数的生效,因此可满足电信级产品高可靠性的要求。
[0048] 本实施例的执行主体可为一个可被操作系统识别的、并具有加载补丁文件功能的补丁内核管理模块。操作系统首先加载补丁内核管理模块,通过补丁内核管理模块对补丁文件进行加载、生效和恢复处理等控制。因此,即使不支持热补丁的操作系统,也可加载补丁内核管理模块,通过补丁内核管理模块采用本实施例技术方案实现内核的在线补丁,从而提高了内核在线补丁的在不同操作系统中的适用性。
[0049] 图2为本发明第二实施例提供的补丁文件制作框图。采用本实施例技术方案可制作应用到本发明第一实施例中的补丁文件。如图2所示,本实施例包括:
[0050] 步骤21、获得补丁源代码信息。
[0051] 当操作系统运行的内核出现功能不足或缺陷的情形时,可针对导致内核功能不足或缺陷的源代码首先进行源代码的修改,修改后的源代码即为本发明实施例的补丁源代码。
[0052] 步骤22、对补丁源代码进行编译,得到目标文件,该目标文件可以包括补丁源代码的补丁函数的符号信息和重定位信息。
[0053] 本实施例可仅对补丁源代码进行编译,如在编译内核映像的编译环境上编译,输出一个目标文件,该目标文件中包括有补丁源代码的补丁函数的符号信息和重定位信息,根据符号信息和重定位信息可确定需要打补丁的函数,其中符号信息可包括函数的名称、大小、存储地址等;重定位信息可包括重定位指令的位置,需要的符号信息等。
[0054] 步骤23、根据所述目标文件生成所述补丁文件,所述补丁文件包括:所述符号信息和重定位信息相应的偏移重定位信息、预先确定的缺省补丁加载地址、补丁文件运行空间大小信息、系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系。
[0055] 在制作补丁时,为补丁文件预先确定缺省补丁加载地址;并可以缺省补丁加载地址为基准,将目标文件中所有的符号信息和重定位信息转换成偏移重定位信息,将偏移重定位信息写入补丁文件。补丁文件中还可携带补丁文件运行所需的空间大小信息,以便补丁内核管理模块在向操作系统中加载补丁文件之前,保证系统中有足够支持补丁文件运行的内存空间(即:补丁区空间)。
[0056] 通过步骤21-23可完成补丁文件的制作。
[0057] 为了提高下一次制作补丁文件的方便性,在制作补丁文件过程中,还可包括步骤24:
[0058] 步骤24、根据预先获取的操作系统的内核映像输出下一次制作补丁使用的绝对地址符号文件,以及根据预先获取的内核模块中的符号信息输出下一次制作补丁使用的相对地址符号文件。
[0059] 输出的绝对地址符号文件和相对地址符号文件可进行存储,以供下一次制作补丁文件时确定缺省补丁加载地址,以及计算偏移重定位信息时参考。其中,绝对地址符号文件包括:内核映像中所有的符号信息;相对地址符号文件包括:所有内核模块中的符号信息。
[0060] 本实施例的执行主体可为一个补丁制作工具,通过该补丁制作工具仅对一份源代码(即:内核修改前的源代码)进行编译获得目标文件,而不需要对二份源代码(即:内核修改前的源代码和修改后的补丁源代码)都进行编译,有利于缩短源代码的编译时间,从而降低编译成本;此外,在进行补丁文件的制作过程中,还同时输出下一次制作补丁文件所需的符号文件信息,从而有利于提高下一次制作补丁文件的方便性。
[0061] 图3为本发明第三实施例提供的内核补丁生效控制流程图。本实施例通过一个普通优先级的内核线程进行内核补丁的生效控制,该线程称为:补丁生效线程。如图3所示,当补丁生效线程运行时,执行如下步骤:
[0062] 步骤31、当补丁生效线程运行时根据补丁文件中包括的需要打补丁的函数信息,在系统内核的相应原函数的起始执行位置写入断点;执行步骤32。
[0063] 步骤31可包括步骤311-步骤313。
[0064] 步骤311、在原函数中写入第一断点之前,确定所述原函数中从起始代码处开始,与无条件跳转指令(jmp指令)所需的字节数相应的代码,确定的这些代码即为本发明实施例的临时代码。
[0065] 无条件跳转指令包括操作码和操作数,操作码用于表征该指令用于进行无条件跳转,操作数确定了跳转的目的地址。在原函数中写入jmp指令,会覆盖原函数的部分原代码,被覆盖的原代码即为本发明实施例的临时代码,可对临时代码进行备份。
[0066] 步骤312、根据确定的所有需要打补丁的函数中的临时代码,为各补丁函数生成相应的补丁替换前的等价代码,并分别保存等价代码和临时代码。
[0067] 临时代码和等价代码二者之间既有区别又有联系:保存的等价代码以备对原函数进行补丁生效中使用,执行等价代码之后通过jmp指令跳转执行原函数中未被jmp指令覆盖的其他代码;保存的临时代码以备后续处理中将补丁函数恢复成原函数中使用,临时代码仅为原函数被jmp指令覆盖的原指令的备份。
[0068] 建立所述等价代码的目的地址、所述原函数的源地址以及所述补丁函数的目的地址的第二对应关系;建立所述临时代码、所述等价代码的目的地址、所述原函数的源地址以及所述补丁函数的目的地址的第三对应关系。
[0069] 等价代码在将补丁函数替换原函数过程中,与调用或执行原函数过程中所需的临时代码可实现相同的功能。本步骤在断点设置之前,分别为各需要打补丁的原函数生成和保存临时代码对应等价代码的好处在于:可根据实际需要返回执行原函数,使得生效补丁线程中执行的各函数之间满足原子性的要求,其中,所谓原子性即为保证某一线程在调用多个函数过程中,所调用的函数的版本的一致性,例如:当前线程调用的多个函数均为原函数,或者,当前线程调用的多个函数均为补丁函数,从而避免当前线程调用的函数版本不同造成的调用失败。
[0070] 而本实施例在断点设置之前,分别为各需要打补丁的原函数确定和保存临时代码的好处在于,在补丁函数生效后,根据保存的临时代码,将补丁函数恢复成打补丁处理之前的原函数。
[0071] 等价代码可用于保证线程执行的原子性,临时代码可在恢复补丁函数时使用。关于等价代码生成的具体实现方式可参见图4对应实施例的记载;关于等价代码在生效补丁函数过程中,当线程调用有多个函数过程时,保证调用的多个函数之间的原子性的具体实现方式看参见图7b对应实施例的记载;关于利用临时代码恢复补丁函数的具体实现方式可参见图8对应实施例的记载。
[0072] 步骤313、将第一断点分别写入将要需要打补丁的原函数的开始执行位置。
[0073] 在某一线程调用增加了第一断点的原函数时,可通过第一断点触发中断,之后对断点异常进行处理可进行补丁文件的生效控制。
[0074] 步骤32、获取系统当前包括的所有线程(以下称为:系统线程),逐个检查系统线程的调用栈。
[0075] 对当前系统线程的调用栈逐个进行检查,有利于保证对需要打补丁的完整性。
[0076] 步骤33、根据线程的调用栈判断系统线程是否正在执行需要打补丁的原函数,如果是,执行步骤34;否则,执行步骤35。
[0077] 为了不中断系统线程的正常运行,需要针对系统线程是否正在执行需要打补丁的原函数的不同情况,确定原函数打补丁的时机。
[0078] 步骤34、创建用于进行补丁延迟生效控制的内核线程,即用于将补丁函数延迟替换相应的原函数的内核线程(以下称为补丁延迟生效线程),通过补丁延迟生效线程选择合适的时间进行补丁延迟生效控制;补丁生效线程退出,结束本流程。
[0079] 如果系统线程正在执行需要打补丁的原函数,则保证系统线程执行的优先性,待系统线程执行结束时再进行原函数的打补丁处理,从而有利于保证当前系统线程的正常运行,以及提高打补丁的成功率。关于补丁延迟生效控制的具体实现方式可参见图6对应实施例的记载。
[0080] 步骤35、将无条件跳转指令(jmp指令)的操作数写入该函数断点指令后面;jmp指令的操作数为原函数的源地址与补丁函数的目标地址的偏移;之后,将jmp指令的操作码替换原函数在先写入的断点指令;补丁生效线程退出,结束本流程。
[0081] 如果系统线程没有执行需要打补丁的原函数时,可对原函数进行打补丁。如果某一线程调用增加有jmp指令的函数时,将根据jmp指令的操作数,无条件跳转执行补丁函数。
[0082] 本步骤在需要打补丁的原函数中先写jmp指令的操作数,之后再写jmp指令的操作码,可有效避免中断系统当前线程的执行,并且可有效保证在jmp指令写入过程中,不会导致线程调用正在打补丁的函数时导致的跳转失败。
[0083] 通过上述流程,在当前系统线程都没有执行需要打补丁的原函数时,补丁生效线程将原函数中的断点替换jmp指令,且该jmp指令包括的操作数为原函数的源地址和补丁函数的目的地址之间的偏移;否则,补丁生效线程创建另一具有普通优先级的线程,对补丁延迟生效的流程进行控制,有利于提高了内核在线补丁的成功率。
[0084] 本实施例在内核在线补丁的处理过程中,通过普通优先级线程实现对内核在线补丁进行生效控制,不会停止系统原有CPU线程运行,有利于缩短系统线程响应时间,从而对操作系统的正常运行影响较小;由于实施例是通过设置断点以及修改断点返回执行地址的方式实现内核的在线补丁处理,在对内核在线补丁完成后,不需要重启操作系统即可实现补丁函数的生效,因此可满足电信级产品高可靠性的要求。
[0085] 图4为本发明第四实施例提供的等价代码生成方法流程图。本实施例可通过补丁生效线程生成原函数的等价代码。如图4所示,本实施例包括:
[0086] 步骤41、在操作系统中分配内存,该部分内存用于保存确定的需要打补丁的原函数中的临时代码对应的等价代码,其中,执行等价代码与执行临时代码可实现相同的功能,区别在于,保存的等价代码以备对原函数进行补丁生效中使用,执行等价代码之后通过jmp指令跳转执行原函数中未被jmp指令覆盖的其他代码;保存的临时代码以备后续处理中将补丁函数恢复成原函数中使用,临时代码仅为原函数被jmp指令覆盖的原指令的备份。
[0087] 假设需要打补丁的原函数中包括的n个指令,n为大于0的整数,Xj表示第j个指令的长度;Y表示预先确定的无条件跳转指令的长度。
[0088] 步骤42、令j=1。
[0089] 本步骤表示从函数开始位置逐条分析函数的指令。
[0090] 步骤43、判断以下条件是否满足:
[0091] 其中,1≤j≤n,如果满足,执行步骤410;否则,执行步骤44。本步骤表示函数中从第1个指令到第j个指令的指令总长度 是否大于无条件跳转指令的长度Y。
[0092] 步骤44、判断函数中第j个指令的类型,如果第j个指令的类型为非转移指令或绝对地址转移指令,执行步骤45;如果第j个指令的类型为相对转移指令,执行步骤46。
[0093] 步骤45、复制第j个指令到步骤41分配的内存中,执行步骤49。
[0094] 非转移指令或绝对地址转移指令不需要根据用于存储等价代码的内存地址进行目的地址重定位,因此,可直接将非转移指令或绝对地址转移指令复制到步骤41分配的内存中。
[0095] 步骤46、获取第j个指令的目的地址。相对转移指令由于存储地址发生变化,需要根据变化后的存储地址进行相应的变化,即:需重新确定相对转移指令的存储地址与相对转移指令需要转移到的目的地址的相对关系。
[0096] 步骤47、根据步骤41分配的内存中保存等价代码的地址和第j个指令的目的地址,重新生成转移到该目的地址的新的指令。
[0097] 本步骤可完成相对转移指令的存储地址与相对转移指令需要转移到的目的地址的相对关系的更新。
[0098] 步骤48、将新生成的指令复制到步骤41分配的内存中,执行步骤49。
[0099] 步骤49、j=j+1,执行步骤43。
[0100] 步骤410、根据复制到内存中的指令生成等价代码,在该等价代码的指令结束位置处设置有jmp指令,以使在执行等价代码之后,跳转执行所述原函数除所述等价代码相应代码外的其他代码。
[0101] 步骤411、建立等价代码的目的地址、所述原函数的源地址以及所述补丁函数的目的地址的第二对应关系。
[0102] 通过上述步骤可完成原函数的等价代码的生成,结束本流程。
[0103] 本实施例在需要打补丁的原函数中设置断点时,需将原函数中将被无条件跳转指令覆盖的代码生成等价代码以便在系统线程在补丁文件生效过程中,如果系统线程调用多个函数,多个函数之间能够保证原子性。此外,还可将被无条件跳转指令覆盖的代码(即:本发明实施例确定的临时代码)进行备份,该部分临时代码也可存储在步骤41分配的内存中,以便根据备份的临时代码,可根据实际需要将已打补丁的补丁函数恢复成打补丁前的原函数。
[0104] 图5为本发明第五实施例提供的补丁延迟生效控制方法流程图。本实施例可通过一个普通优先级的线程进行补丁延迟生效控制,该线程以下称为:补丁延迟生效线程。如图5所示,在运行补丁延迟生效线程时,执行以下步骤:
[0105] 步骤51、获取系统中当前包括的所有线程。
[0106] 在获取当前所有系统线程之后,逐个检查获取的系统线程的调用栈。假设获取的系统线程共m个线程,m为大于0的整数,k表示当前分析的线程序号。
[0107] 步骤52、令k=1。
[0108] 步骤53、根据补丁文件判断第k个系统线程是否正在执行需要打补丁的函数,如果是,执行步骤58;否则,执行步骤54。
[0109] 步骤54、判断k<m是否满足,如果满足,执行步骤55;否则,执行步骤56。
[0110] 步骤55、k=k+1,执行步骤53。
[0111] 步骤56、将jmp指令的操作数写入需要打补丁的各原函数断点指令后面。其中,jmp指令的操作数包括:需要打补丁的原函数的源地址和补丁文件中补丁函数的目标地址的偏移。
[0112] 步骤57、在完成jmp指令写入过程之后,采用写入的jmp指令的操作码替换原函数在先写入的断点指令,结束本流程。
[0113] 步骤58、设置第k个系统线程补丁生效的第一等待时长,并在设置的第一等待时长之后,重复执行步骤53。
[0114] 系统线程补丁生效的第一等待时长可根据线程执行该函数所需的时间或CPU调度频率等因素确定,例如,将补丁生效的第一等待时长设置为10ms。
[0115] 本实施例当系统线程正在执行当前需要打补丁的函数时,可通过设置补丁延迟生效的第一等待时长,在系统线程没有调用当前需要打补丁的函数时,进行补丁的生效流程,从而避免了在补丁生效过程导致系统线程的中断,有利于缩短系统中断的响应时间,从而提高系统性能。
[0116] 图6为本发明内核补丁生效控制过程中断点异常处理应用场景示意图。如图6所示,
[0117] 假设生效补丁线程在进行系统线程的调用栈检查过程中,获知:系统线程1正常执行过程中可调用二个函数,即函数1(Func1)和函数2(Func2)。系统线程1正常执行流程包括:执行函数1→调用函数2→执行函数2→调用函数1→执行函数1,如此循环运行。
[0118] 生效补丁线程在进行补丁生效控制过程中,在函数1和函数2的开始执行位置中分别增加有断点。由于生效补丁线程在进行补丁生效控制过程中,没有中断线程,因此,生效补丁线程当前执行的函数1或函数2可能是修改前的原函数(以下称为原函数1和原函数2),还可能是修改后的补丁函数(以下称为补丁函数1和补丁函数2)。
[0119] 由于生效补丁线程在函数中写入了断点,但在某些应用场景下,如在生效补丁线程在进行原函数和补丁函数的在线替换过程中,需要保证生效补丁线程调用或执行函数的原子性,需要调用或执行无断点的原函数。
[0120] 所谓的原子性即为:当前线程中执行的函数的版本相同,以保证在线程运行过程中调用参数信息的同步性。在保证原子性的条件下,生效补丁线程执行的函数1和函数2的版本信息需保持同步,即:生效补丁线程执行原函数1和原函数2,或者,生效补丁线程执行补丁函数1和补丁函数2,依次保证函数1和函数2之间的参数信息同步。如果生效补丁线程执行的函数1为原函数1,而执行的函数2为补丁函数2,则可能因函数2和补丁函数2之间的参数信息不同步,导致调用函数2发生错误,从而线程执行失败。
[0121] 图7为本发明第六实施例提供的断点异常处理方法流程图。如果在延迟生效补丁线程设置的延迟生效期间(如:在延迟生效补丁线程设置的第一等待时长内),当图6所示的应用场景中的系统线程运行过程中,发生由于生效补丁过程中设置的第一断点产生的断点异常时,可采用本实施例所示的方法进行断点异常处理。
[0122] 假设系统当前线程正常执行过程中可调用二个函数,即函数1(Func1)和函数2(Func2)。系统当前线程正常执行流程包括:执行函数1→调用函数2→执行函数2→调用函数1→执行函数1,如此循环运行。
[0123] 本实施例在系统当前线程过程中,执行以下步骤:
[0124] 步骤71、假设系统当前线程在执行函数2的过程中发现断点。
[0125] 步骤72、判断断点异常产生的原因,如果断点异常是由于需要打补丁时设置的断点产生的,则执行步骤74;否则,执行步骤73。
[0126] 步骤73、采用现有技术系统对断点异常进行处理的方法进行断点异常处理,处理结束后,执行步骤78。
[0127] 步骤74、检查系统当前线程的调用栈。
[0128] 如果对断点异常进行处理的结果是为了用补丁函数“替换”原函数(即:生效补丁),那么在执行步骤74之后,还包括执行步骤75。
[0129] 步骤75、根据系统当前线程的调用栈,判断系统当前线程在发生断点异常之前是否已执行了其他原函数(如:原函数1),如果是,执行步骤76;否则,执行步骤77。
[0130] 步骤76、修改断点处理返回地址为产生断点异常的函数(如:函数2)的等价代码的目的地址,执行步骤78。
[0131] 步骤77、修改断点处理返回地址为产生断点异常的函数对应的补丁区中补丁函数(补丁函数2)的地址,执行步骤78。
[0132] 步骤78、断点异常处理返回。
[0133] 本实施例可保证线程在进行多个函数同时替换时,通过对将替换的原函数生成等价代码,根据线程在先调用函数的版本(即:根据线程在线调用的函数是原函数还是补丁函数),将断点之后的地址修改为执行等价代码的地址,或执行补丁函数的地址,有效保证了线程在调用多个函数过程中多个函数之间的原子性,即:线程在先调用原函数,断点处理后返回原函数的等价代码执行地址;如果线程在先调用其他函数的补丁函数,断点处理后返回补丁函数的执行地址,从而避免了线程交替执行原函数和补丁函数,从而可能因原函数和该原函数的补丁函数之间的参数信息不同步,导致线程执行失败。
[0134] 图8为本发明第七实施例提供的补丁函数恢复方法流程图。在补丁函数生效之后,本发明实施例还可实现将已生效的补丁函数恢复成打补丁之前的原函数。实际上,内核运行过程中将补丁函数恢复成原函数的实现方法,与在内核运行过程中将原函数“替换”成补丁函数的实现方法相似,可通过在创建一个具有普通优先级的线程,通过在补丁函数中设置断点,据保存的原函数的临时代码(如图3对应实施例中步骤312的记载),进行补丁函数的恢复控制,该线程称为补丁恢复线程。如图8所示,在运行生效补丁线程过程中,执行以下步骤:
[0135] 步骤81、在需要恢复的补丁函数的起始执行位置设置断点,该断点即为本发明实施例的第二断点。
[0136] 步骤82、获取系统当前包括的所有线程(以下称为:系统线程),逐个检查系统线程的调用栈。
[0137] 步骤83、根据线程的调用栈判断系统线程是否正在执行需要恢复的补丁函数,如果是,执行步骤84;否则,执行步骤85。
[0138] 步骤84、创建用于进行补丁延迟恢复控制的内核线程,即用于将补丁函数延迟恢复成相应的原函数的内核线程(以下称为补丁延迟恢复线程),通过补丁延迟恢复线程选择合适的时间进行补丁延迟恢复控制;补丁恢复线程退出,结束本流程。
[0139] 关于补丁延迟恢复控制的具体实现方式可参见图9对应实施例的记载。
[0140] 步骤85、根据已建立的临时代码、所述原函数的源地址以及所述补丁函数的目的地址的第三对应关系,获取所述补丁函数对应的临时代码,根据获取的临时代码替换第二断点之后补丁函数中的jmp指令,之后,去除第二断点,从而实现补丁函数恢复为所述原函数;补丁恢复线程退出,结束本流程。
[0141] 本实施例为内核打完补丁之后,如果需要对所打的补丁进行撤销,可通过本实施例提供的技术方案,在内核运行过程中,将已生效的补丁函数恢复成打补丁之前的原函数,因而提高了在线补丁处理的灵活性。
[0142] 图9为本发明第八实施例提供的补丁延迟恢复控制方法流程图。本实施例可通过创建一个普通优先级的线程进行补丁延迟恢复控制,即:补丁延迟恢复线程。如图9所示,在运行补丁延迟恢复线程时,执行以下步骤:
[0143] 步骤91、获取系统中当前包括的所有线程。
[0144] 在获取当前所有系统线程之后,逐个检查获取的系统线程的调用栈。假设获取的系统线程共m个线程,m为大于0的整数,k表示当前分析的线程序号。
[0145] 步骤92、令k=1。
[0146] 步骤93、根据补丁文件判断第k个系统线程是否正在执行需要恢复的补丁函数,如果是,执行步骤97;否则,执行步骤94。
[0147] 步骤94、判断k<m是否满足,如果满足,执行步骤95;否则,执行步骤96。
[0148] 步骤95、k=k+1,执行步骤93。
[0149] 步骤96、根据已建立的临时代码、所述原函数的源地址以及所述补丁函数的目的地址的第三对应关系,获取所述补丁函数对应的临时代码,根据获取的临时代码替换第二断点之后补丁函数中的jmp指令,之后,去除第二断点,从而实现补丁函数恢复为所述原函数;补丁延迟恢复线程退出,结束本流程。
[0150] 步骤97、设置第k个系统线程补丁生效的第二等待时长,并在设置的第二等待时长之后,重复执行步骤93。
[0151] 系统线程补丁恢复的第二等待时长可根据线程执行该函数所需的时间或CPU调度频率等因素确定,例如,将补丁恢复的第二等待时长设置为10ms。
[0152] 本实施例当系统线程正在执行当前需要恢复的补丁函数时,可通过设置补丁延迟恢复的第二等待时长,在系统线程没有调用当前需要恢复的补丁函数时,进行补丁的恢复流程,从而避免了在补丁恢复过程导致系统线程的中断,有利于缩短系统中断的响应时间,从而提高系统性能。
[0153] 图10为本发明第九实施例提供的在补丁函数恢复过程中断点异常处理方法流程图。如果在补丁延迟恢复线程设置的延迟恢复期间(如:在补丁延迟恢复线程设置的第二等待时长内),当图6所示的应用场景中的系统线程运行过程中,发生由于恢复补丁过程中设置的第二断点产生的断点异常时,可采用本实施例所示的方法进行断点异常处理。如图10所示,本实施例包括:
[0154] 本实施例在系统当前线程过程中,执行以下步骤:
[0155] 步骤101、假设系统当前线程在执行函数2的过程中发现断点。
[0156] 步骤102、判断断点异常产生的原因,如果断点异常是由于恢复补丁函数而设置的第二断点产生的,则执行步骤104;否则,执行步骤103。
[0157] 步骤103、采用现有技术系统对断点异常进行处理的方法进行断点异常处理,处理结束后,执行步骤108。
[0158] 步骤104、检查系统当前线程的调用栈。
[0159] 步骤105、根据系统当前线程的调用栈,判断系统当前线程在发生断点异常之前是否已执行了其他补丁函数(如:补丁函数1),如果是,执行步骤107;否则,执行步骤106。
[0160] 步骤106、根据已建立的临时代码、所述原函数的源地址以及所述补丁函数的目的地址的第三对应关系,获取所述补丁函数对应的临时代码,根据获取的临时代码替换第二断点之后补丁函数中的jmp指令,之后,去除第二断点,从而实现补丁函数恢复为所述原函数,执行步骤108。
[0161] 步骤107、修改断点处理返回地址为产生断点异常的函数对应的补丁区中补丁函数(补丁函数2)的地址,执行步骤108。
[0162] 步骤108、断点异常处理返回。
[0163] 本实施例有效保证了线程在恢复多个补丁函数过程中多个函数之间的原子性,避免了线程交替执行原函数和补丁函数,从而可能因原函数和该原函数的补丁函数之间的参数信息不同步,导致线程执行失败。
[0164] 本实施例当系统线程正在执行当前需要恢复的补丁函数时,可通过设置补丁延迟恢复的第二等待时长,在系统线程没有调用当前需要恢复的补丁函数时,进行补丁函数的恢复流程,从而避免了在补丁恢复过程导致系统线程的中断,有利于所短系统中断的响应时间,从而提高系统性能。
[0165] 图11为本发明第十实施例提供的内核在线补丁的管理装置结构示意图。如图11所示,本实施例内核在线补丁的管理装置包括:加载模块111、第一断点设置模块112和补丁模块113。
[0166] 加载模块111用于在操作系统中加载预先制作的补丁文件,所述补丁文件包括系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系。
[0167] 第一断点设置模块112用于在所述原函数的起始执行位置设置第一断点。
[0168] 补丁模块113用于在系统线程执行所述原函数、并在线程执行过程中由于所述第一断点产生断点异常时,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点。
[0169] 本实施例有利于缩短系统线程响应时间,对操作系统的正常运行影响较小;由于本实施例是通过设置断点以及修改断点返回执行地址的方式实现内核的在线补丁处理,在对内核在线补丁完成后,不需要重启操作系统即可实现补丁函数的生效,因此可满足电信级产品高可靠性的要求。
[0170] 本实施例可为一个可被操作系统识别的、并具有加载补丁文件功能模块加载到操作系统中,通过本实施例对补丁文件进行加载、生效和恢复处理等控制。因此,本实施例提高了内核在线补丁的在不同操作系统中的适用性。
[0171] 图12为本发明第十一实施例提供的内核在线补丁的管理装置结构示意图。本实施例与图11对应实施例的区别在于,本实施例内核在线补丁的管理装置还包括:等价代码生成模块114和等价代码存储模块115。
[0172] 等价代码生成模块114用于确定所述原函数中从起始代码处开始,与无条件跳转指令所需的字节数相应的临时代码;生成所述临时代码对应的等价代码,所述等价代码的结束位置包括所述无条件跳转指令,以使在执行所述等价代码之后,跳转执行所述原函数除所述临时代码外的其他代码。有关等价代码生成的具体实现方式可参见图3对应实施例的记载,不再赘述。
[0173] 等价代码存储模块115用于保存所述等价代码,并建立所述等价代码的目的地址、所述原函数的源地址以及所述补丁函数的目的地址的第二对应关系。
[0174] 在上述技术方案的基础上,为了保证在补丁函数生效过程中不会影响原有系统线程的正常运行,且保证在调用至少二个函数的线程在补丁函数生效过程中所调用函数的原子性,本实施例补丁模块113包括:第一线程调用栈检查单元1131、补丁生效单元1132、补丁延迟生效单元1133和第一断点异常处理单元1134。
[0175] 第一线程调用栈检查单元1131用于获取所述操作系统当前所有的线程,检查获取的所有线程的调用栈。
[0176] 补丁生效单元1132用于在检查结果为没有线程正在执行需要打补丁的所述原函数时,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址。有关补丁生效控制的实现方式详见图3对应实施例的记载,不再赘述。
[0177] 补丁延迟生效单元1133用于在检查结果为有线程正在执行需要打补丁的所述原函数时,设置第一等待时长;在设置的所述第一等待时长之后,激活所述第一线程调用栈检查单元1131重复检查相应线程的调用栈。有关补丁生效控制的实现方式详见图5对应实施例的记载,不再赘述。
[0178] 第一断点异常处理单元1134用于检查正在执行需要打补丁的原函数的线程的调用栈,在检查结果为当前线程在发生断点异常之前执行过其他原函数时,根据所述第二对应关系,修改所述第一断点的返回执行地址为与发生断点异常的原函数对应的等价代码的目的地址;否则,根据所述第一对应关系,修改所述第一断点的返回执行地址为与发生断点异常的原函数对应的补丁函数的目的地址。有关第一断点异常处理的实现方式详见图7对应实施例的记载,不再赘述。
[0179] 在上述技术方案的基础上,本实施例还可包括:临时代码存储模块116。
[0180] 临时代码存储模块116用于保存所述临时代码;建立所述临时代码、所述等价代码的目的地址、所述原函数的源地址以及所述补丁函数的目的地址的第三对应关系。
[0181] 在上述技术方案的基础上,为了实现将已生效的补丁函数恢复成打补丁前的原函数,本实施例还可包括:第二断点设置模块117和补丁恢复模块118。
[0182] 第二断点设置模块117用于在所述补丁函数的起始执行位置设置第二断点。
[0183] 补丁恢复模块118用于在系统线程执行所述补丁函数、并在线程执行过程中由于所述第二断点产生断点异常时,根据所述第三对应关系,获取所述补丁函数对应的临时代码;根据获取的所述临时代码,将所述补丁函数恢复为所述补丁函数对应的原函数。
[0184] 在上述技术方案的基础上,为了保证在补丁函数恢复过程中不会影响原有系统线程的正常运行,且保证在调用至少二个函数的线程在补丁函数恢复过程中所调用函数的原子性,本实施例补丁恢复模块118可包括:第二线程调用栈检查单元1181、补丁恢复单元1182、补丁延迟恢复单元1183和第二断点异常处理单元1184。
[0185] 第二线程调用栈检查单元1181用于获取所述操作系统当前所有的线程,检查获取的所有线程的调用栈。
[0186] 补丁恢复单元1182用于在检查结果为没有线程正在执行需要恢复的所述补丁函数时,根据获取的所述临时代码,将所述补丁函数恢复为所述原函数。有关补丁恢复的实现方式可参见图8对应实施例的记载,不再赘述。
[0187] 补丁延迟恢复单元1183用于在检查结果为有线程正在执行需要恢复的所述补丁函数时,设置第二等待时长;在设置的所述第二等待时长之后,激活所述第二线程调用栈检查单元重复检查相应线程的调用栈。有关补丁延迟恢复的实现方式可参见图9对应实施例的记载,不再赘述。
[0188] 第二断点异常处理单元1184用于检查正在执行需要恢复的补丁函数的线程的调用栈,在检查结果为当前线程在发生断点异常之前执行过其他原函数时,根据获取的所述临时代码,将所述补丁函数恢复为所述原函数;否则,根据所述第一对应关系,设置所述第二断点的返回执行地址为所述补丁函数的目的地址。有关第二断点异常处理的实现方式可参见图10对应实施例的记载,不再赘述。
[0189] 本实施例在需要打补丁的原函数中设置断点时,需将原函数中将被无条件跳转指令覆盖的代码生成等价代码以便在系统线程在补丁文件生效过程中,如果系统线程调用多个函数,多个函数之间能够保证原子性。此外,还可将被无条件跳转指令覆盖的原函数中的代码(即:本发明实施例的临时代码)进行备份,通过保存的临时代码将已打生效的补丁函数恢复成原函数,从而提高了内核在线补丁的灵活性。
[0190] 图13为本发明第十二实施例提供的内核补丁的生成装置结构示意图。如图13所示,本实施例内核补丁的生成装置包括:编译模块131和补丁文件生成模块132。
[0191] 编译模块131用于编译补丁源代码,得到目标文件。
[0192] 补丁文件生成模块132用于根据所述目标文件生成所述补丁文件,所述补丁文件包括:系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系。
[0193] 本实施例内核补丁的生成装置可对一份源代码(即:内核修改前的源代码)进行编译获得目标文件,而不需要对二份源代码(即:内核修改前的源代码和修改后的补丁源代码)都进行编译,有利于缩短源代码的编译时间,从而降低编译成本。关于内核补丁的生成装置生成补丁文件的具体过程可参见图2对应实施例的记载,不再赘述。
[0194] 图14为本发明第十三实施例提供的内核在线补丁的系统结构示意图。如图14所示,本实施例内核在线补丁的系统包括:内核补丁的生成装置141和内核在线补丁的管理装置142。
[0195] 内核补丁的生成装置141用于编译补丁源代码,得到目标文件;根据所述目标文件生成所述补丁文件;所述补丁文件包括系统内核的原函数对应的补丁函数,以及所述原函数的源地址与所述补丁函数的目的地址的第一对应关系。有关内核补丁的生成装置的细化结构可参见图13对应实施例的记载,不再赘述。
[0196] 内核在线补丁的管理装置142用于在操作系统中加载所述补丁文件;在所述原函数的起始执行位置设置第一断点;在系统线程执行所述原函数、并在线程执行过程中由于所述第一断点产生断点异常时,根据所述第一对应关系,修改所述第一断点的返回执行地址为与所述原函数对应的所述补丁函数的目的地址并去除所述第一断点。有关内核在线补丁的管理装置的细化结构可参见图11-12对应实施例的记载,不再赘述。
[0197] 本实施例不需要为系统中每个CPU专门创建一个最高优先级的线程而造成系统原有线程的运行中断,有利于缩短系统线程响应时间,对操作系统的正常运行影响较小,不需要重启操作系统即可实现补丁函数的生效,因此可满足电信级产品高可靠性的要求;此外,通过本实施例对补丁文件进行加载、生效和恢复处理等控制,还有利于提高内核在线补丁的在不同操作系统中的适用性。
[0198] 本领域普通技术人员可以理解:附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。
[0199] 本领域普通技术人员可以理解:实施例中的装置中的模块可以按照实施例描述分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
[0200] 上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0201] 本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
[0202] 最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围。