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

技术编号:14620882 阅读:44 留言:0更新日期:2017-02-10 12:41
本发明专利技术公开了一种基于中间辅助函数的软件动态升级方法,通过分析整合后的新/旧版本代码源文件中的待更新函数,生成中间辅助函数;利用中间辅助函数及二进制重写机制,分别对处于函数调用栈的待更新函数、未处于函数调用栈的待更新函数及待更新静态变量进行更新。相应地,本发明专利技术还提出了对应的系统。本发明专利技术有效解决了插入多个检查点带来的系统损耗和死锁问题,在确保更新升级安全性的同时,能够对程序进行实时动态更新,显著降低了用户的操作复杂性及系统开销,同时,可在更新出现任何异常时完成回滚,保证更新过程的可靠性。本发明专利技术适用于需要高可靠持续性需求的应用服务,能够减少因版本更新导致系统重启引起的损失。

【技术实现步骤摘要】

本专利技术属于云软件可靠性研究中的安全领域,更具体地,涉及一种基于中间辅助函数的软件动态升级方法及系统
技术介绍
软件在使用过程中需要不断的升级更新来修复漏洞和添加功能,然而传统的软件更新需要先关闭软件,更新完成后再重新启动软件。这样一方面软件服务会宕机一段时间,另一方面软件服务将会丢失更新前的状态。这对于需要7/24小时的软件服务而言,无疑是降低了服务的可用性。但是如果不采用更新的话,无疑会降低软件的安全性和服务可靠性。针对这个问题,软件动态升级方法能够在程序不停止服务的情况下完成程序的更新升级工作,并且能够保证软件更新前后服务状态不丢失,从而提高系统的可用性和可靠性。现有的动态软件升级方法中,针对正在调用中函数的更新,一般有两种方法,一种是等待待更新函数返回后再进行更新。另一种方法是基于安全更新点和堆栈重构的方法来完成更新,即等待线程执行到函数中的某个安全更新点时,对线程的函数栈进行堆栈重构工作,使旧版本函数的函数栈转换成新版本函数的函数栈,同时使线程跳转到安全更新点对应的新版本函数位置来进行更新工作。然而,上述两种方法都存在一定的不足和局限性。(1)等待待更新函数返回后再进行更新的方法无法更新一些不会返回的函数,例如主循环函数,调度函数等等,这些函数会一直处入函数栈中,如果一直得不到更新也会存在安全隐患;(2)基于检查点和堆栈重构的方法虽然可以在函数调用时更新函数,但是,在多线程程序中,很难使所有线程都达到安全更新点。目前有些方法是借助编译器使程序的所有线程可达到安全检查点。然而,这种方法只能针对于特定编译器编译出的程序,不能对通用编译器编译出的一般程序进行升级更新工作。另外有一些方法采取阻塞线程,使线程都到达检查点后再更新,但是这种方法可能导致死锁问题,虽然可以在死锁处强行更新,但被死锁阻塞的线程可能处于不安全的更新位置,此时如果强行更新会影响程序的安全性和正确性。而堆栈重构的方法对于某些更新往往只有很少的改动。有的动态更新方法的安全更新点只能适用于单线程的程序,而多线程程序无法同时到达安全更新点,从而无法对多线程程序实行动态更新。使用堆栈重构更新调用层次很深的函数(例如递归函数中)开销是很大的,可能函数栈只有上层的数个函数有改动需要更新,但是堆栈重构需要重新构造所有堆栈,并且堆栈重构时程序必须暂停运行。多线程程序中每个线程都有自己独立的栈,如果采用堆栈重构的方法,不仅更新时间会变长,更严重的是更新过程中程序会暂停较长时间。综上所述,现有的动态软件升级系统的方案存在以下不足:有的动态软件升级方法(polus)只能更新不处于函数调用栈中的函数,无法对正在执行的函数进行实时更新,如果一些无法在短时间内返回的函数,如主循环函数和调度函数,将无法更新到下一个版本。有的动态升级方法(upstare)需要特定编译器支持,所以无法对使用通用编译器编译的程序进行动态更新。有的动态软件升级方法(Kitsune)以进程为更新单元,在更新过程中需要存储新版本的全部代码数据而导致额外开销较大,而实际更新往往只有很少的改动。有的动态更新方法的安全更新点只能适用于单线程的程序,而多线程程序无法同时到达安全更新点,从而无法对多线程程序实行动态更新。
技术实现思路
针对现有技术的缺陷或改进需求,本专利技术提供了一种基于中间辅助函数的软件动态升级方法及系统,其目的在于,解决现有针对已经部署的多线程应用程序进行动态升级方法中出现的上述局限和不足,保证了多线程应用程序动态更新的安全性、实时性和有效性。为实现上述目的,按照本专利技术的一个方面,提出了一种基于中间辅助函数的软件动态升级方法,其特征在于,所述方法包括:(1)获取并整合旧版本代码源文件和新版本代码源文件,得到整合后的旧版本代码源文件和新版本代码源文件;(2)通过对比整合后的旧版本代码源文件和新版本代码源文件,生成初级动态升级补丁;(3)静态分析对比整合后的旧版本代码源文件和新版本代码源文件中的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时根据待更新函数,生成中间辅助函数;(4)根据用户的初始化请求,将步骤(2)中生成的初级动态升级补丁注入到正在运行的待更新程序中;(5)注入动态升级补丁后,根据待更新函数符号名和待更新静态变量符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;(6)根据用户发出的更新请求,暂停所有与更新相关的进程,并根据获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更新函数是否位于函数调用栈,若是,则利用中间辅助函数对位于函数调用栈的待更新函数进行更新;否则直接对未在函数调用栈的待更新函数进行更新;(7)恢复因更新而被暂停的进程,更新过程结束。作为进一步优选的,所述步骤(3)具体包括:(3-1)分析待更新函数的语义,获取并记录待更新函数的安全更新指令集合,生成函数语义映射表;(3-2)将待更新函数的参数作为中间辅助函数的参数,构造生成中间辅助函数,所述中间辅助函数包含控制内容、待更新函数新版本内容和待更新函数旧版本内容;其中,所述控制内容用于将待更新函数旧版本的局部变量和参数转换成新版本的局部变量和参数,还用于根据运行时线程执行地址来判断该线程是否处于安全更新指令集合,若是,则跳转入待更新函数新版本内容,执行待更新函数新版本内容后返回;否则,跳转入待更新函数旧版本内容,当执行到安全更新指令集合中任意一条指令,则跳转入待更新函数新版本内容;(3-3)对所述中间辅助函数的待更新函数旧版本内容进行修改,使其利用转换函数访问新版本数据。作为进一步优选的,若一段指令中任意一条指令前的所有执行路径都能保证新旧版本语义一致,则该段指令为安全更新指令集合。作为进一步优选的,所述步骤(6)具体包括:(6-1)根据用户发出的更新请求,暂停所有与更新相关的进程,将所有的旧版本待更新静态变量转换成新版本静态变量;(6-2)查看待更新函数是否位于函数调用栈,若是,根据步骤(3)的函数语义映射表,修改线程当前执行位置后的下一条二进制指令,将线程当前执行位置入栈,然后跳转到步骤(3)中生成中间辅助函数的入口地址,利用中间辅助函数进行更新;否则,对于未处于函数调用栈的待更新函数,使用修改函数入口地址的方法进行更新。作为进一步优选的,所述方法还包括:(1)在程序更新前保存待更新程序的检查点本文档来自技高网
...

【技术保护点】
一种基于中间辅助函数的软件动态升级方法,其特征在于,所述方法包括:(1)获取并整合旧版本代码源文件和新版本代码源文件,得到整合后的旧版本代码源文件和新版本代码源文件;(2)通过对比整合后的旧版本代码源文件和新版本代码源文件,生成初级动态升级补丁;(3)静态分析对比整合后的旧版本代码源文件和新版本代码源文件中的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时根据待更新函数,生成中间辅助函数;(4)根据用户的初始化请求,将步骤(2)中生成的初级动态升级补丁注入到正在运行的待更新程序中;(5)注入动态升级补丁后,根据待更新函数符号名和待更新静态变量符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;(6)根据用户发出的更新请求,暂停所有与更新相关的进程,并根据获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更新函数是否位于函数调用栈,若是,则利用中间辅助函数对位于函数调用栈的待更新函数进行更新;否则直接对未在函数调用栈的待更新函数进行更新;(7)恢复因更新而被暂停的进程,更新过程结束。

【技术特征摘要】
1.一种基于中间辅助函数的软件动态升级方法,其特征在于,所述方
法包括:
(1)获取并整合旧版本代码源文件和新版本代码源文件,得到整合后
的旧版本代码源文件和新版本代码源文件;
(2)通过对比整合后的旧版本代码源文件和新版本代码源文件,生成
初级动态升级补丁;
(3)静态分析对比整合后的旧版本代码源文件和新版本代码源文件中
的待更新函数,分析待更新函数的语义,生成函数语义映射表,同时根据
待更新函数,生成中间辅助函数;
(4)根据用户的初始化请求,将步骤(2)中生成的初级动态升级补
丁注入到正在运行的待更新程序中;
(5)注入动态升级补丁后,根据待更新函数符号名和待更新静态变量
符号名获得待更新程序中对应的待更新函数和待更新静态变量地址;
(6)根据用户发出的更新请求,暂停所有与更新相关的进程,并根据
获取的待更新静态变量地址对待更新静态变量进行更新;同时,查看待更
新函数是否位于函数调用栈,若是,则利用中间辅助函数对位于函数调用
栈的待更新函数进行更新;否则直接对未在函数调用栈的待更新函数进行
更新;
(7)恢复因更新而被暂停的进程,更新过程结束。
2.如权利要求1所述的方法,其特征在于,所述步骤(3)具体包括:
(3-1)分析待更新函数的语义,获取并记录待更新函数的安全更新指
令集合,生成函数语义映射表;
(3-2)将待更新函数的参数作为中间辅助函数的参数,构造生成中间
辅助函数,所述中间辅助函数包含控制内容、待更新函数新版本内容和待

\t更新函数旧版本内容;其中,
所述控制内容用于将待更新函数旧版本的局部变量和参数转换成新版
本的局部变量和参数,还用于根据运行时线程执行地址来判断该线程是否
处于安全更新指令集合,若是,则跳转入待更新函数新版本内容,执行待
更新函数新版本内容后返回;否则,跳转入待更新函数旧版本内容,当执
行到安全更新指令集合中任意一条指令,则跳转入待更新函数新版本内容;
(3-3)对所述中间辅助函数的待更新函数旧版本内容进行修改,使其
利用转换函数访问新版本数据。
3.如权利要求2所述的方法,其特征在于,若一段指令中任意一条指
令前的所有执行路径都能保证新旧版本语义一致,则该段指令为安全更新
指令集合。
4.根据权利要求1或2所述的方法,其特征在于,所述步骤(6)具
体包括:
(6-1)根据用户发出的更新请求,暂停所有与更新相关的进程,将所
有的旧版本待更新静态变量转换成新版本静态变量;
(6-2)查看待更新函数是否位于函数调用栈,若是,根据步骤(3)的
函数语义映射表,修改线程当前执行位置后的下一条二进制指令,将线程
当前执行位置入栈,然后跳转到步骤(3)中生成中间辅助函数的入口地址;
否则,对于未处于函数调用栈的待更新函数,使用修改函数入口地址的方
法进行更新。
5.如权利要求1-3任一项所述的方法,其特征在于,所述方法还包括:
(1)在程序更新前保存待更新程序的检查点;
(2)在更新过程中,通过监控程序实时监控待更新程序状态,若待更
新程序发生异常时,使用所述检查点进行回滚,将其还原到更新之前的状
态。
6.一种基于中间辅助函数的软件动态升级系统,其特征在于,所述系

\t统包括:
整合模块,...

【专利技术属性】
技术研发人员:邹德清代炜琦陈志坤金海
申请(专利权)人:华中科技大学
类型:发明
国别省市:湖北;42

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1