一种基于中间辅助函数的软件动态升级方法及系统的制作方法

文档序号:9765833阅读:383来源:国知局
一种基于中间辅助函数的软件动态升级方法及系统的制作方法
【技术领域】
[0001 ]本发明属于云软件可靠性研究中的安全领域,更具体地,涉及一种基于中间辅助函数的软件动态升级方法及系统。
【背景技术】
[0002]软件在使用过程中需要不断的升级更新来修复漏洞和添加功能,然而传统的软件更新需要先关闭软件,更新完成后再重新启动软件。这样一方面软件服务会宕机一段时间,另一方面软件服务将会丢失更新前的状态。这对于需要7/24小时的软件服务而言,无疑是降低了服务的可用性。但是如果不采用更新的话,无疑会降低软件的安全性和服务可靠性。针对这个问题,软件动态升级方法能够在程序不停止服务的情况下完成程序的更新升级工作,并且能够保证软件更新前后服务状态不丢失,从而提高系统的可用性和可靠性。
[0003]现有的动态软件升级方法中,针对正在调用中函数的更新,一般有两种方法,一种是等待待更新函数返回后再进行更新。另一种方法是基于安全更新点和堆栈重构的方法来完成更新,即等待线程执行到函数中的某个安全更新点时,对线程的函数栈进行堆栈重构工作,使旧版本函数的函数栈转换成新版本函数的函数栈,同时使线程跳转到安全更新点对应的新版本函数位置来进行更新工作。
[0004]然而,上述两种方法都存在一定的不足和局限性。(I)等待待更新函数返回后再进行更新的方法无法更新一些不会返回的函数,例如主循环函数,调度函数等等,这些函数会一直处入函数栈中,如果一直得不到更新也会存在安全隐患;(2)基于检查点和堆栈重构的方法虽然可以在函数调用时更新函数,但是,在多线程程序中,很难使所有线程都达到安全更新点。目前有些方法是借助编译器使程序的所有线程可达到安全检查点。然而,这种方法只能针对于特定编译器编译出的程序,不能对通用编译器编译出的一般程序进行升级更新工作。另外有一些方法采取阻塞线程,使线程都到达检查点后再更新,但是这种方法可能导致死锁问题,虽然可以在死锁处强行更新,但被死锁阻塞的线程可能处于不安全的更新位置,此时如果强行更新会影响程序的安全性和正确性。而堆栈重构的方法对于某些更新往往只有很少的改动。有的动态更新方法的安全更新点只能适用于单线程的程序,而多线程程序无法同时到达安全更新点,从而无法对多线程程序实行动态更新。
[0005]使用堆栈重构更新调用层次很深的函数(例如递归函数中)开销是很大的,可能函数栈只有上层的数个函数有改动需要更新,但是堆栈重构需要重新构造所有堆栈,并且堆栈重构时程序必须暂停运行。多线程程序中每个线程都有自己独立的栈,如果采用堆栈重构的方法,不仅更新时间会变长,更严重的是更新过程中程序会暂停较长时间。
[0006]综上所述,现有的动态软件升级系统的方案存在以下不足:
[0007]有的动态软件升级方法(polus)只能更新不处于函数调用栈中的函数,无法对正在执行的函数进行实时更新,如果一些无法在短时间内返回的函数,如主循环函数和调度函数,将无法更新到下一个版本。有的动态升级方法(upstare)需要特定编译器支持,所以无法对使用通用编译器编译的程序进行动态更新。有的动态软件升级方法(Kitsune)以进程为更新单元,在更新过程中需要存储新版本的全部代码数据而导致额外开销较大,而实际更新往往只有很少的改动。有的动态更新方法的安全更新点只能适用于单线程的程序,而多线程程序无法同时到达安全更新点,从而无法对多线程程序实行动态更新。

【发明内容】

[0008]针对现有技术的缺陷或改进需求,本发明提供了一种基于中间辅助函数的软件动态升级方法及系统,其目的在于,解决现有针对已经部署的多线程应用程序进行动态升级方法中出现的上述局限和不足,保证了多线程应用程序动态更新的安全性、实时性和有效性。
[0009]为实现上述目的,按照本发明的一个方面,提出了一种基于中间辅助函数的软件动态升级方法,其特征在于,所述方法包括:
[0010](I)获取并整合旧版本代码源文件和新版本代码源文件,得到整合后的旧版本代码源文件和新版本代码源文件;
[0011](2)通过对比整合后的旧版本代码源文件和新版本代码源文件,生成初级动态升级补丁;
[0012](3)静态分析对比整合后的旧版本代码源文件和新版本代码源文件中的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时根据待更新函数,生成中间辅助函数;
[0013](4)根据用户的初始化请求,将步骤(2)中生成的初级动态升级补丁注入到正在运行的待更新程序中;
[0014](5)注入动态升级补丁后,根据待更新函数符号名和待更新静态变量符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;
[0015](6)根据用户发出的更新请求,暂停所有与更新相关的进程,并根据获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更新函数是否位于函数调用栈,若是,则利用中间辅助函数对位于函数调用栈的待更新函数进行更新;否则直接对未在函数调用栈的待更新函数进行更新;
[0016](7)恢复因更新而被暂停的进程,更新过程结束。
[0017]作为进一步优选的,所述步骤(3)具体包括:
[0018](3-1)分析待更新函数的语义,获取并记录待更新函数的安全更新指令集合,生成函数语义映射表;
[0019](3-2)将待更新函数的参数作为中间辅助函数的参数,构造生成中间辅助函数,所述中间辅助函数包含控制内容、待更新函数新版本内容和待更新函数旧版本内容;其中,
[0020]所述控制内容用于将待更新函数旧版本的局部变量和参数转换成新版本的局部变量和参数,还用于根据运行时线程执行地址来判断该线程是否处于安全更新指令集合,若是,则跳转入待更新函数新版本内容,执行待更新函数新版本内容后返回;否则,跳转入待更新函数旧版本内容,当执行到安全更新指令集合中任意一条指令,则跳转入待更新函数新版本内容;
[0021](3-3)对所述中间辅助函数的待更新函数旧版本内容进行修改,使其利用转换函数访问新版本数据。
[0022]作为进一步优选的,若一段指令中任意一条指令前的所有执行路径都能保证新旧版本语义一致,则该段指令为安全更新指令集合。
[0023]作为进一步优选的,所述步骤(6)具体包括:
[0024](6-1)根据用户发出的更新请求,暂停所有与更新相关的进程,将所有的旧版本待更新静态变量转换成新版本静态变量;
[0025](6-2)查看待更新函数是否位于函数调用栈,若是,根据步骤(3)的函数语义映射表,修改线程当前执行位置后的下一条二进制指令,将线程当前执行位置入栈,然后跳转到步骤(3)中生成中间辅助函数的入口地址,利用中间辅助函数进行更新;否则,对于未处于函数调用栈的待更新函数,使用修改函数入口地址的方法进行更新。
[0026]作为进一步优选的,所述方法还包括:
[0027](I)在程序更新前保存待更新程序的检查点;
[0028](2)在更新过程中,通过监控程序实时监控待更新程序状态,若待更新程序发生异常时,使用所述检查点进行回滚,将其还原到更新之前的状态。
[0029]按照本发明的另一个方面,提出了一种基于中间辅助函数的软件动态升级系统,其特征在于,所述系统包括:
[0030]整合模块,用于获取并整合旧版本代码源文件和新版本代码源文件,得到整合后的旧版本代码源文件和新版本代码源文件;
[0031 ]补丁生成模块,用于通过对比整合后的旧版本代码源文件和新版本代码源文件,生成初级动态升级补丁;
[0032]分析模块,用于静态分析对比整合后的旧版本代码源文件和新版本代码源文件中的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时用于根据待更新函数,生成中间辅助函数;
[0033]注入模块,用于根据用户的初始化请求,将生成的初级动态升级补丁注入到正在运行的待更新程序中;
[0034]获取模块,用于在注入动态升级补丁后,根据待更新函数符号名和待更新静态变量符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;
[0035]更新模块,用于根据用户发出的更新请求,暂停所有与更新相关的进程,并根据获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更新函数是
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1