一种突破内核模块版本控制解决方法
【专利摘要】本发明提供一种突破内核模块版本控制解决方法,根据要加载内核模块的环境修改elf内核模块的header信息,其具体实现过程为:首先打开elf文件,通过mmap将其映射到内存中,通过索引index搜索segment结构中的函数符号表,查找“__versions”的字段,该字段包括所有引用函数的符号表的值,并通过修改为当前内核symvers中的值,来使模块合法化。该一种突破内核模块版本控制解决方法和现有技术相比,支持多个版本,跳出内核检测带来的局限性,突破其限制,实用性强,适用范围广泛,易于推广。
【专利说明】一种突破内核模块版本控制解决方法
【技术领域】
[0001]本发明涉及计算机【技术领域】,具体的说是一种突破内核模块版本控制解决方法。【背景技术】
[0002]随着Linux的蓬勃发展和普及,深入开发内核技术人员越来越多,使Linux内核技术发展很快,升级很快,Linux内核版本很多,2个小内核版本中内核函数的定义可能都不一样,为了确保不一致的驱动程序导致kernel oops,开发者加入了模块验证机制。它在加载内核模块的时候对模块进行校验,如果模块与主机的一些环境不一致,就会加载不成功,这就极大局限了驱动模块的通用性,而且每一次内核版本不一致都要从新编译,这是一个非常琐碎的事情,这样反而带来了系统功能升级的局限性。
[0003]面对Linux未来美好的前景,很多公司加入了开发Linux的项目或产品,面对于商业公司,他们都有以二进制方式出售产品,但是客户的环境千变万化。例如=Linux 2.6.32kernel内核版本,就有几个升级版本,如果我们想把模块添加到所有的2.6.32版本上,我们必须要在所有版本上进行编译,这样才能添加成功,因为校验的初衷就是某些数据结构和某些函数发生变化,而进行的校验的,但是我们开发的模块不依赖或者所依赖的数据结构和函数都是确定的,没有发生变化,我们就应该去掉繁琐的编译,这样达到一次编译,支持多个版本,我们就应该跳出内核检测带来的局限性,突破这样的限制,使我们的驱动和应用层一样,具有更好的平台支持性,打破因为客户环境小小的差异带来的产品局限性。基于此,现提供一种突破内核模块版本控制解决方法。
【发明内容】
[0004]本发明的技术任务是解决现有技术的不足,提供一种实用性强、突破内核模块版本控制解决方法。
[0005]本发明的技术方案是按以下方式实现的,该一种突破内核模块版本控制解决方法,根据要加载内核模块的环境修改elf内核模块的header信息,其具体实现过程为:
首先打开elf文件,通过_ap将其映射到内存中,通过索引index搜索segment结构中的函数符号表,查找“—versions”的字段,该字段包括所有引用函数的符号表的值,并通过修改为当前内核symvers中的值,来使模块合法化。
[0006]所述解决过程的详细步骤为:
一、获取当前系统对应运行的symvers文件,打开symvers文件;
二、打开当前驱动elf文件,mmap映射到内存中;
三、校验文件的合法性;
四、查找内核模块头header中的—versions的地址;
五、将所有引用函数的crc的值通过查找symvers进行更新;
六、替换完成,保存文件,关闭操作;
七、insmod加载模块。[0007]所述步骤三中校验文件的合法性的步骤为:
检测驱动elf文件格式,是否是驱动文件;
检测驱动elf文件,是64bit还是32bit。
[0008]本发明与现有技术相比所产生的有益效果是:
本发明的一种突破内核模块版本控制解决方法不用从新编译内核模块来达到内核模块的成功,实现一次编译,保证系统稳定;通过symvers动态更新模块的“—versions”的字段的函数值,来突破内核加载时的检测;支持多个版本,跳出内核检测带来的局限性,突破其限制,实用性强,适用范围广泛,易于推广。
【专利附图】
【附图说明】
[0009]附图1是本发明的实现示意图。
【具体实施方式】
[0010]下面结合附图对本发明的一种突破内核模块版本控制解决方法作以下详细说明。
[0011]本发明的目的在于提供突破内核模块版本控制解决方法,根据新内核中的函数信息更新内核模块中elf的header的函数符号表值来实现。基于此,如附图1所示,现提供一种突破内核模块版本控制解决方法,根据要加载内核模块的环境修改eIf内核模块的header信息,即获取 当前运行的系统符号表;将驱动elf文件打开,更新为新的符号文件。
[0012]在开发的模块不依赖或者所依赖的数据结构和函数都是确定的,没有发生变化前提下,我们就应该去掉繁琐的编译,这样达到一次编译,支持多个版本,我们就应该跳出内核检测带来的局限性,突破这样的限制。基于此,本方法的具体实现过程为:
首先打开elf文件,通过_ap将其映射到内存中,通过索引index搜索segment结构中的函数符号表,查找“—versions”的字段,该字段包括所有引用函数的符号表的值,并通过修改为当前内核symvers中的值,来使模块合法化。
[0013]所述解决过程的详细步骤为:
I)获取当前运行的 symvers,如:/boot/symvers_2.6.18-92.el5PAE。
[0014]2)将驱动elf文件打开,mmap映射到内存中。
[0015]3)检测驱动elf文件格式,是否是驱动文件。
[0016]4)检测驱动elf文件,是64bit还是32bit。
[0017]5)查找内核模块头header中的—versions的地址。
[0018]6)将所有引用函数的crc的值通过查找symvers进行更新。
[0019]7)替换完成,保存文件,关闭操作。
[0020]8) insmod 加载模块。
[0021]实施例:
在实际应用中,模块版本结构如下所示: struct modversion_info {
unsigned long crc;
char name [MODULE—NAME—LEN];
【权利要求】
1.一种突破内核模块版本控制解决方法,其特征在于根据要加载内核模块的环境修改elf内核模块的header信息,其具体实现过程为: 首先打开elf文件,通过_ap将其映射到内存中,通过索引index搜索segment结构中的函数符号表,查找“—versions”的字段,该字段包括所有引用函数的符号表的值,并通过修改为当前内核symvers中的值,来使模块合法化。
2.根据权利要求1所述的一种突破内核模块版本控制解决方法,其特征在于:所述解决过程的详细步骤为: 一、获取当前系统对应运行的symvers文件,打开symvers文件; 二、打开当前驱动elf文件,mmap映射到内存中; 三、校验文件的合法性; 四、查找内核模块头header中的—versions的地址; 五、将所有引用函数的crc的值通过查找symvers进行更新; 六、替换完成,保存文件,关闭操作; 七、insmod加载模块。
3.根据权利要求2所述的一种突破内核模块版本控制解决方法,其特征在于:所述步骤三中校验文件的合法性的步骤为: 检测驱动elf文件格式,是否是驱动文件; 检测驱动elf文件,是64bit还是32bit。
【文档编号】G06F9/445GK104021023SQ201410284719
【公开日】2014年9月3日 申请日期:2014年6月24日 优先权日:2014年6月24日
【发明者】黄玉龙 申请人:浪潮电子信息产业股份有限公司