使用补丁对软件进行动态升级与控制的方法和装置的制作方法

文档序号:6578969阅读:213来源:国知局
专利名称:使用补丁对软件进行动态升级与控制的方法和装置的制作方法
技术领域
本发明涉及补丁升级方法,更具体地,涉及使用补丁对软件进行动态升级与控制 的方法和装置。
背景技术
随着软件规模和维护复杂度的不断增加,人们很难获得一个零错误的软件,这就 需要在发布版本之后,对可能存在的错误,采用提供新软件或者通过发布软件补丁的方式 进行修复。对于软件运行稳定性要求比较高的行业,特别是电信行业,需要在不影响原有业 务正常运行的情况下,完成对系统软件错误修复的整个过程,即在软件运行过程中,用补丁 模块替换存在软件错误的模块,而不能打断原有程序代码的正常运行。这种动态补丁升级软件的主要方法是采用函数替换的方法,来实现动态打补丁, 其工作原理是通过替换被补丁函数的第一条指令为跳转到替换函数中的指令,使程序跳转 到新函数所在位置处执行,当替换函数中的补丁代码执行完毕后,回到调用老函数的代码 中,从而完成整个调用过程。在公开号为CN1475909的中国申请专利文件中,公开了一种嵌入式系统补丁软件 的实现和控制方法。此方法分为两步骤执行1)用补丁制作工具分析补丁目标文件的符号 段,并将补丁目标文件的代码段和数据段提取出来,联同函数替换表以补丁单元的形式生 成补丁文件。2)补丁控制部分加载控制补丁软件到希望被补丁修改的缓冲区中,根据函数 替换表构造函数跳转指令,将被补丁函数地址上的第一条指令替换为跳转到补丁函数起始 地址的函数跳转指令,使CPU执行到被补丁函数时,跳转到补丁函数地址,执行补丁函数。该专利中关于动态补丁升级软件实现与控制的方法,存在如下缺陷1)该专利在软件补丁制作过程中,把整个目标文件的代码段和数据段都提取出 来,然后构造成补丁文件,并在补丁加载时全部写入内存空间。这种方法会造成内存空间的 浪费,也会增加加载过程的复杂度,甚至同一个函数或变量在内存中有多个拷贝,可能会造 成函数调用或变量引用的不一致,严重的会导致系统崩溃。2)该专利在补丁控制模块加载补丁文件到缓冲区中后,根据函数替换表构造函数 跳转指令,动态的构造从被补丁函数跳转到替换函数的跳转指令。这种在目标机上构造跳 转指令的做法会增加目标机侧代码维护的难度,并降低代码可移植性。3)该专利没有提供完整的补丁控制方法,即没有提供打补丁失败后,恢复到原先 状态的实现方法以及显示补丁是否升级成功等。

发明内容
为解决上述缺陷,本发明提出了使用补丁对软件进行动态升级的方法,包括以下 步骤将替换函数的预定参数从目标文件中提取出来,组成仅包含替换函数的新目标文件; 以及根据新目标文件和内核镜像原文件生成补丁。其中,预定参数包括代码段、数据段、重定位表和符号表中的至少一个。
其中,所述的提取预定参数的步骤包括读取目标文件的头部信息,并根据头部信 息将每个节头读取到内存中;以及提取替换函数的代码段,收集替换函数的重定位的信息, 并提取替换函数的只读数据,其中,将只读数据节合并为新只读数据节。其中,使用验证模块读取新目标文件,以验证新目标文件的正确性。其中,所述的生成补丁的步骤还包括读取新目标文件的头部信息,并根据头部信 息将每个节头读取到内存中;合并新目标文件的代码段和只读数据节;读取内核镜像原文件 的预留补丁区域地址和符号地址表;根据符号地址表对新目标文件的符号进行重定位;根据 预留补丁区域地址构造函数替换指令表,用于指示对替换函数进行替换;以及生成补丁。此外,本发明还提出了使用补丁对软件进行动态升级与控制的装置包括替换函 数提取模块,设置在主机侧,用于将替换函数的预定参数从目标文件中提取出来,组成仅包 含替换函数的新目标文件;补丁生成模块,设置在主机侧,用于根据新目标文件和内核镜像 原文件生成补丁 ;以及补丁控制模块,设置在目标机侧,用于控制补丁的状态的转换,并用 于查询补丁的状态。其中,替换函数提取模块包括头部信息读取子模块,用于读取目标文件的头部信 息,并根据头部信息将每个节头读取到内存中;预定参数提取子模块,用于提取预定参数; 以及文件重组子模块,用于组成仅包含替换函数的新目标文件。其中,补丁生成模块在生成补丁的过程中,根据从内核镜像原文件读取的预留补 丁区域地址构造函数替换指令表。其中,补丁控制模块包括补丁加载子模块,读取函数替换指令表,根据预留补丁 区域地址加载补丁,并将补丁的非激活状态写入配置文件中;补丁激活子模块,根据函数替 换指令表,从原函数跳转至替换函数,并将补丁的激活状态写入配置文件中;补丁自动激活 子模块,使补丁自动生效,并将补丁的自动运行状态写入配置文件中;补丁去激活子模块, 根据函数替换指令表,从替换函数跳转回原函数,并将补丁的非激活状态写入配置文件;补 丁卸载子模块,释放补丁的存储空间,从替换函数跳转回原函数,并将补丁的初始状态写入 配置文件;以及补丁状态查询子模块,用于读取配置文件以查看补丁的状态。其中,补丁包含如下信息中的至少一个补丁的版本信息、目标机的信息、用于对 替换函数进行替换的指令表以及替换函数的预定参数在目标机中的加载地址。本发明的技术效果在于1)在制作软件补丁时,根据需要打补丁的函数,把代码段的提取细化到函数级,这 样可以减少补丁的尺寸,以及加载补丁所需要的预留内存空间,并且便于管理,避免函数调 用的不一致性。2)从补丁函数跳转到替换函数的跳转指令在制作补丁的时候完成,并存储在补丁 文件中。这样可以把与平台相关的处理全部放在主机侧制作补丁时实现,而目标机上只要 做加载的动作,这样可避免由于目标机上处理器的不同而增加编码的复杂度,降低移植性。3)提供完整的目标机侧补丁控制模块功能,可以根据要求加载,激活,去激活,卸 载,显示补丁信息等。


此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的限定。在附图中图1是根据本发明示例性实施例的嵌入式系统动态补丁升级软件总体框图;图2是根据本发明示例性实施例的替换函数提取过程的流程图;图3是根据本发明示例性实施例的补丁生成过程的流程图;以及图4示出了根据本发明示例性实施例的补丁状态转化的示意图。
具体实施例方式下面结合附图对使用补丁对软件进行动态升级与控制的方法和装置进行说明。嵌入式系统动态补丁升级软件分为主机侧和目标机侧两个部分,一共包括3个模 块替换函数提取模块,补丁生成模块,补丁控制模块。其中替换函数提取模块,补丁生成模 块运行在主机侧,补丁控制模块运行在目标机侧,如图1。(一)替换函数提取模块为动态补丁升级软件的第一个模块,用来在ELF格式目标 文件中提取替换函数的代码段,重定位表,符号表等,并重构成新的ELF格式目标文件。该模块的输入为ELF格式的目标文件和需要提取的替换函数名列表,输出为只含 有单个替换函数代码段,只读数据节,符号表等的ELF格式目标文件。在构造的过程中,需根据重定位的类型,把以.text (程序代码)、.bss (全局变 量)、.rodata (只读数据)、.data (定值数据)作为基地址的偏移量addend的重定位方法, 替换为直接查找符号的方式。这样在下一个模块补丁制作模块中,只需要通过查找镜像文 件中符号的真实地址,去替换ELF目标文件中符号,就可以完成重定位的工作,把函数调用 和变量引用链接起来。该模块的实施步骤为(可参考图2)1.读取ELF结构目标文件中的头部,并根据ELF头部信息提供的节头addr (地址) 和size (尺寸),读取各节头。2.根据节头信息,读取各节到内存中3.在.text节中抽取替换函数的代码段4.在.rodata节中抽取替换函数引用到的只读数据,并合并成一个新的rodata 节。5.在替换函数代码所在的地址空间,收集所有需要重定位的信息。6.根据重定位的类型,符号的属性以及尺寸大小等着手,把替换函数代码中所有 以.text、.bss,. rodata,. data作为基地址的偏移量addend的重定位方法,替换为直接查 找符号的方法7.重新构造只包含替换函数代码段,rodata节,符号节的ELF结构目标文件,并设 置重新各节头部的addr以及size8.用readelf或者objdump工具读取新构造出的ELF结构目标文件,验证其重 构是否正确,如果代码段,只读数据和原目标文件的一致,且所有引用方法都是符号直接引 用,则可判断其是正确的输出。( 二)补丁制作模块的输入为替换函数提取模块生成的目标文件以及内核镜象原 文件,输出为补丁文件。该模块需根据补丁加载的预留地址空间,重定位输入目标文件中的 替换函数所引用的符号地址,并把多个输入目标文件的.text、. rodata节进行合并,最后生成的补丁文件中需包含1)版本信息,目标机信息以及补丁文件信息2)函数替换表,含 有从补丁函数跳转到替换函数的跳转指令表以及替换函数的数据段,代码段以及BSS段在 目标机内存中加载地址表3)替换函数的只读数据段以及代码段4)校验和5)创建日期等 fn息该模块的实施步骤为(可参考图3)1.根据输入目标文件的ELF文件头部信息,读取各节头。2.根据节头信息,读取各节到内存中3.合并多个输入目标文件的text节以及rodata节4.读取内核镜像原文件中的预留补丁区域,符号表以及对应的符号地址表5.根据符号地址表,把输入目标文件中所引用的符号地址重定位成真实的内存调 用地址6.根据预留补丁区域地址,在主机侧构造函数替换指令表7.构造整个补丁文件,包含版本信息,目标机信息,补丁信息,函数替换表,以及代 码段,只读数据段,创建日期等,并最后增加检验和字段,用以检查补丁加载到目标机的正 确性。(三)补丁控制模块本模块主要控制补丁的状态转换,并提供对补丁状态的查询功能等。为了实现运 行时动态升级,同时考虑到升级后有恢复,因此补丁需要五个基本状态加载,激活,补丁自 动激活,去激活,卸载。其状态转化图如下所示。补丁状态转换控制采用命令驱动的方式运 行,其处理流程如下图4所示。具体实现中,每个补丁的状态转换可以用状态机来控制,保证状态迁移正确性。该模块的具体实施步骤为1.补丁加载流程首先判断补丁和系统软件的版本号是否符合一致,如果不一致 直接退出;如果一致,则将补丁文件加载写入到flash中,然后读取该文件中函数替换表, 根据需要加载补丁预留区域的地址,把替换函数的代码段,只读数据段写入到内存中。补丁 加载后,补丁的状态为非激活状态,并把补丁的状态写入到相应的配置文件中。2.补丁激活根据指令替换表,将被补丁函数地址处的指令改成跳转到替换函数 的指令,并把补丁的状态写入到配置文件中。3.补丁自动激活将补丁状态修改为自动激活状态,保存在补丁配置文件中,下 次重起时会加载补丁继续生效,并把补丁的状态写入到配置文件中。4.补丁去激活根据指令替换表,将被补丁函数地址处的跳转指令替换为原来的 指令。成功后,补丁状态修改为非激活状态,并把补丁的状态写入到配置文件中。5.补丁卸载释放补丁文件所占用的flash空间,以及内存空间,并把补丁函数 地址处的跳转指令替换为原来的指令,并把补丁的状态写入到配置文件中。6.补丁状态查询通过读取配置文件,可以查看当前补丁所处的状态。以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技 术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修 改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
一种使用补丁对软件进行动态升级的方法,其特征在于,包括以下步骤将替换函数的预定参数从目标文件中提取出来,组成包含所述替换函数的新目标文件;以及根据所述新目标文件和所述替换函数的内核镜像原文件生成补丁。
2.根据权利要求1所述的方法,其特征在于,所述预定参数包括代码段、数据段、重定 位表和符号表中的至少一个。
3.根据权利要求2所述的方法,其特征在于,所述的提取预定参数包括读取所述目标文件的头部信息,并根据所述头部信息将每个节头读取到内存中;以及 提取所述替换函数的代码段,收集所述替换函数的重定位的信息,并提取所述替换函 数的只读数据节,其中,将所述只读数据节合并为新只读数据节。
4.根据权利要求3所述的方法,其特征在于,还包括以下步骤使用验证模块读取所述 新目标文件,以验证所述新目标文件的正确性。
5.根据权利要求3所述的方法,其特征在于,所述的生成补丁的步骤包括 读取所述新目标文件的头部信息,并根据所述头部信息将每个节头读取到内存中; 合并所述新目标文件的代码段和只读数据节;读取所述内核镜像原文件的预留补丁区域地址和符号地址表; 根据所述符号地址表对所述新目标文件的符号进行所述重定位; 根据所述预留补丁区域地址构造函数替换指令表,用于指示对所述替换函数进行替 换;以及生成所述补丁。
6.一种使用补丁对软件进行动态升级与控制的装置,其特征在于,包括替换函数提取模块,设置在主机侧,用于将替换函数的预定参数从目标文件中提取出 来,组成包含所述替换函数的新目标文件;补丁生成模块,设置在主机侧,用于根据所述新目标文件和内核镜像原文件生成补丁;以及补丁控制模块,设置在目标机侧,用于控制所述补丁的状态的转换,并用于查询所述补 丁的状态。
7.根据权利要求6所述的装置,其特征在于,所述替换函数提取模块包括头部信息读取子模块,用于读取所述目标文件的头部信息,并根据所述头部信息将每 个节头读取到内存中;预定参数提取子模块,用于提取所述预定参数;以及 文件重组子模块,用于组成仅包含所述替换函数的新目标文件。
8.根据权利要求6所述的装置,其特征在于,所述补丁生成模块在生成补丁的过程中, 根据从所述内核镜像原文件读取的预留补丁区域地址构造函数替换指令表。
9.根据权利要求8所述的装置,其特征在于,所述补丁控制模块包括补丁加载子模块,读取所述函数替换指令表,根据所述预留补丁区域地址加载补丁,并 将所述补丁的非激活状态写入配置文件中;补丁激活子模块,根据所述函数替换指令表,从原函数跳转至所述替换函数,并将所述 补丁的激活状态写入所述配置文件中;补丁自动激活子模块,使所述补丁自动生效,并将所述补丁的自动运行状态写入所述 配置文件中;补丁去激活子模块,根据所述函数替换指令表,从所述替换函数跳转回所述原函数,并 将所述补丁的非激活状态写入所述配置文件;补丁卸载子模块,释放所述补丁的存储空间,从所述替换函数跳转回所述原函数,并将 所述补丁的初始状态写入所述配置文件;以及补丁状态查询子模块,用于读取所述配置文件以查看所述补丁的状态。
10.根据权利要求6至9中任一项所述的装置,其特征在于,所述补丁包含如下信息中 的至少一个所述补丁的版本信息、所述目标机的信息、用于对所述替换函数进行替换的指 令表以及所述替换函数的所述预定参数在所述目标机中的加载地址。
全文摘要
本发明提出了使用补丁对软件进行动态升级的方法,包括以下步骤将替换函数的预定参数从目标文件中提取出来,组成仅包含替换函数的新目标文件;以及根据新目标文件和内核镜像原文件生成补丁。此外,本发明还提出了使用补丁对软件进行动态升级与控制的装置。通过实施本发明,可以大大减少加载补丁时所需的内存空间。
文档编号G06F9/445GK101937340SQ200910151508
公开日2011年1月5日 申请日期2009年6月29日 优先权日2009年6月29日
发明者朱怀云, 李进波, 邱静, 黄忠华 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1