一种Linux内核可热插拨内核模块运行时升级方法

文档序号:6548792阅读:313来源:国知局
一种Linux内核可热插拨内核模块运行时升级方法
【专利摘要】本发明提供一种Linux内核可热插拨内核模块运行时升级方法,属于计算机操作系统领域,本发明通过添加一个系统调用,用于更新指定的内核模块,本方法所说的系统调用实现了一个正在运行着的内核模块,在不卸载及重新装载的前提下,更新其代码,用此内核模块新的版本替换旧的版本,并且,最关键的是:在此过程中,此内核模块仍能正常使用,即不中断其提供的服务。
【专利说明】 一种Linux内核可热插拨内核模块运行时升级方法
[0001]【技术领域】
本发明提供一种Linux内核可热插拨内核模块运行时升级方法,属于计算机操作系统领域。通过添加一个新的系统调用,实现更新一个正在使用中的内核动态装载的模块代码到新的版本。
【背景技术】
[0002]Linux内核可热插拨内核模块技术的出现极大的方便了 Linux内核程序的开发,它使得人们在Linux上可以不重启系统的前提下,添加需要用到的内核模块程序,并在不需要时卸载它,也不用重启操作系统,一直以来,人们都认为,这已经非常方便各种应用程序及设备驱动的开发了。但是,近年来,各种高可靠性、高可持续性的服务要求对此特性越来越不满足:我的重要服务在任何状况下都尽可能不要中断业务,但在更新服务软件相关的内核模块时,服务程序不得不暂时停止,等相关的内核模块的新版本被装载进操作系统内核后,再重新启动服务程序提供服务,尽管维护者会尽可能在短时间内完成这些事务性的工作,但是,这个短暂的中断对于要求高可用性的服务仍然有着巨大的不良影响。
[0003]当然,也许有人会说:可以利用双机备份,等多种方式方法来解决这个问题,但是,越发复杂的服务器集群一类的架构不仅增加了大量的金钱浪费,而且也增加了出故障的更多可能,并且维护相关的费用也是无底洞!因此迫切需要出现一种能够以较低的成本,几乎完全不中断服务的方法去更新服务程序相关的内核模块技术。

【发明内容】

[0004]一种Linux内核可热插拨内核模块运行时升级方法。为实现这一目的,本发明的技术解决方案是:通过向Linux操作系统添加一个内核模块升级系统调用,提供更新指定的内核模块的能力。本方法在内核模块升级系统调用实现了一个正在运行着的内核模块,在不卸载及重新装载的前提下,更新其代码,用此内核模块新的版本替换旧的版本,在此过程中,此内核模块仍能正常使用,即不中断该内核模块提供的服务。
[0005]通过在操作系统中新添加的模块升级系统调用,同步地把指定的内核模块由当前版本,升级到一个新的版本,并且这个新的版本可以是比当前版本高或者低的。
[0006]当使用模块升级系统调用升级可热插拨内核模块时,以原模块及新模块全路径为参数,在升级内存中的运行着的该模块的同时升级文件系统中的原模块。
[0007]在升级正在运行中的内核模块的过程为:
a.模块升级系统调用把新版本的内核模块代码添加到正在运行着的内核映像内存中
去;
b.检测旧版本的内核模块函数是否正在使用中,如果没有在使用中,则在它的开始处注入一个跳转指令,从而调用函数的在新版本内核中的实现;
c.如果在使用中,则暂时放弃替换该函数,并睡眠一小会,然后再次尝试b中的动作,重复数次,如果失败,则恢复原状; 在升级文件系统中的原模块的过程为:
a.模块升级系统调用调用文件系统函数把新模块拷贝到原模块目录中,并命名一个新名字;
b.模块升级系统调用调用文件系统函数删除原模块;
c.模块升级系统调用调用文件系统函数把新模块重命名为原模块的名字,完成升级。
[0008]本发明的有益效果是:
本发明提供一种不中断服务的方法去更新服务程序相关的内核模块技术,在内核模块升级系统调用实现了一个正在运行着的内核模块,在不卸载及重新装载的前提下,更新其代码,用此内核模块新的版本替换旧的版本,在此过程中,此内核模块仍能正常使用,即不中断该内核模块提供的服务。实现了能够以较低的成本,几乎完全不中断服务的方法去更新服务程序相关的内核模块技术。
【专利附图】

【附图说明】
[0009]图1是Linux可热插拨内核模块运行时升级原理图;
图2是Linux可热插拨内核模块运行时升级流程简图。
【具体实施方式】
[0010]下面按照说明书附图对本发明作详细说明:
本发明的技术解决方案是:通过向Linux操作系统添加一个内核模块升级系统调用,提供更新指定的内核模块的能力。本方法在内核模块升级系统调用实现了一个正在运行着的内核模块,在不卸载及重新装载的前提下,更新其代码,用此内核模块新的版本替换旧的版本,在此过程中,此内核模块仍能正常使用,即不中断该内核模块提供的服务。
[0011]如图1,内核模块升级系统调用,先把新内核模块代码添加到内核映像中去,然后在旧模块要升级的函数入口处,注入跳转指令(X86系统上jmp是跳转指令),跳转到新内核模块的对应于旧模块的函数升级后的新函数去执行新函数的代码,从而实现了旧模块中的代码更新为新模块中的代码。
[0012]在Linux操作系统,添加内核模块升级系统调用,在该系统调用中升级正在运行中的旧内核模块及在文件系统中的旧内核模块,如图2:
在升级正在运行中的内核模块的过程为:
a.校验证新内核模块是否是旧内核模块的升级版本或降级版本;
b.模块升级系统调用把新版本的内核模块代码添加到正在运行着的内核映像内存中
去;
c.检测旧版本的内核模块函数是否正在使用中,如果没有在使用中,则在它的开始处注入一个跳转指令,从而调用函数的在新版本内核中的实现;
d.如果在使用中,则暂时放弃替换该函数,并睡眠一小会,然后再次尝试b中的动作,重复数次,如果失败,则恢复原状;
在升级文件系统中的原模块的过程为:
a.校验证新内核模块是否是旧内核模块的升级版本或降级版本;
b.模块升级系统调用调用文件系统函数把新模块拷贝到原模块目录中,并命名一个新名字;
C.模块升级系统调用调用文件系统函数删除原模块;
d.模块升级系统调用调用文件系统函数把新模块重命名为原模块的名字,完成升级。这样便实现了一个正在运行着的内核模块,在不卸载及重新装载的前提下,更新其代码,用此内核模块新的版本替换旧的版本,在此过程中,此内核模块仍能正常使用,即不中断该内核模块提供的服务。
【权利要求】
1.一种Linux内核可热插拨内核模块运行时升级方法,其特征在于通过添加一个新的系统调用,实现更新一个正在使用中的内核动态装载的模块代码到新的版本,并不中断该模块原来提供的任何服务。
2.如权利要求1所述的一种Linux内核可热插拨内核模块运行时升级方法,其特征在于:通过在操作系统中新添加的模块升级系统调用,同步地把指定的内核模块由当前版本,升级到一个新的版本,并且这个新的版本可以是比当前版本高或者低的。
3.如权利要求2所述的一种Linux内核可热插拨内核模块运行时升级方法,其特征在于:当使用模块升级系统调用升级可热插拨内核模块时,以原模块及新模块全路径为参数,在升级内存中的运行着的该模块的同时升级文件系统中的原模块。
4.如权利要求3所述的一种Linux内核可热插拨内核模块运行时升级方法,其特征在于:在升级正在运行中的内核模块的过程为: a.模块升级系统调用把新版本的内核模块代码添加到正在运行着的内核映像内存中去; b.检测旧版本的内核模块函数是否正在使用中,如果没有在使用中,则在它的开始处注入一个跳转指令,从而调用函数的在新版本内核中的实现; c.如果在使用中,则暂时放弃替换该函数,并睡眠一小会,然后再次尝试b中的动作,重复数次,如果失败,则恢复原状。
5.如权利要求3所述的一种Linux内核可热插拨内核模块运行时升级方法,其特征在于:在升级文件系统中的原模块的过程为: a.模块升级系统调用调用文件系统函数把新模块拷贝到原模块目录中,并命名一个新名字; b.模块升级系统调用调用文件系统函数删除原模块; c.模块升级系统调用调用文件系统函数把新模块重命名为原模块的名字,完成升级。
【文档编号】G06F9/445GK103984585SQ201410248550
【公开日】2014年8月13日 申请日期:2014年6月6日 优先权日:2014年6月6日
【发明者】任元 申请人:浪潮电子信息产业股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1