内核模块编译方法、装置、计算机设备和存储介质与流程

文档序号:28740213发布日期:2022-02-07 21:46阅读:95来源:国知局
内核模块编译方法、装置、计算机设备和存储介质与流程

1.本发明涉及计算机操作系统领域,尤其涉及一种内核模块编译方法、装置、计算机设备和存储介质。


背景技术:

2.在linux操作系统兼容android环境的场景中,存在内核模块在不同内核版本上编译的需求。在linux兼容android环境,android系统在运行时,需要事先加载部分内核模块,例如:ashmem和binder。不同版本的android系统的内核模块,依赖于不同版本的linux内核,例如:android 7.0依赖的linux内核版本为4.4.1,android 8.0依赖的linux内核版本为4.10。android系统的版本是固定的,所以android系统需要的内核模块也是依赖某一个固定版本的linux内核的。由于android系统运行于linux系统上,但是各个linux系统的linux内核不是固定的,这就导致android系统所需要的内核模块,需要在不同版本的linux内核上编译和运行。因此需要解决内核模块在不同内核版本上编译加载的问题。


技术实现要素:

3.为了解决内核模块在不同内核版本上编译加载的问题,本发明提供了一种内核模块编译方法、装置、计算机设备和存储介质。
4.第一方面,本发明提供一种内核模块编译方法,所述方法为:
5.根据不同版本的内核对待编译加载的内核模块源码进行适配;
6.判断在指定路径上是否存在已编译的内核模块;若存在,则比对已编译的内核模块与内核是否匹配:如果匹配则加载已编译的内核模块,如果不匹配则将加密的内核模块源码解密并复制到指定的隐藏目录下;若不存在,则将加密的内核模块源码解密并复制到指定的隐藏目录下;在内核上编译解密后的内核模块源码;加载编译后的内核模块。
7.进一步地,所述方法中根据不同版本的内核对待编译加载的内核模块源码进行适配,包括:
8.根据linux内核版本号对待引用的内核头文件进行适配;
9.根据linux内核版本号对待调用的内核api进行适配;
10.根据linux内核版本号对内核符号表进行适配。
11.进一步地,所述方法还包括:
12.在内核上编译解密后的内核模块源码之后,
13.将编译后的内核模块复制到指定路径下,并删除解密后的内核模块源码。
14.进一步地,所述方法中根据linux内核版本号对待引用的内核头文件进行适配,具体为:
15.在待编译加载的内核模块源码中,通过判断linux_version_code的宏定义来适配不同版本的linux内核,根据linux内核版本号引用不同路径的内核头文件。
16.进一步地,所述方法中根据linux内核版本号对待调用的内核api进行适配,具体
为:
17.在待编译加载的内核模块源码中,根据linux内核版本号对传递到api的函数参数进行设置:对函数参数的类型、个数进行设置。
18.进一步地,所述方法中根据linux内核版本号对内核符号表进行适配,具体为:
19.对拟使用的内核api进行导出,获取拟使用的内核api的地址,以便待编译加载的内核模块源码调用。
20.进一步地,所述方法中比对已编译的内核模块与内核是否匹配,具体为:
21.通过modinfo mymodule.ko指令获取内核模块的vermagic信息,再通过uname

a指令获取内核的版本号,比较内核的版本信息与内核模块中的vermagic信息,确认已编译的内核模块与内核是否匹配。
22.第二方面,本发明提供一种内核模块编译装置,所述装置包括:
23.存储器,用于存储程序;
24.处理器,用于执行所述存储器中存储的程序,当所述存储器中存储的程序被执行时,所述处理器用于执行上述方法的步骤。
25.第三方面,本发明提供一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机可读指令,所述计算机可读指令被所述处理器执行时,使得所述处理器执行上述方法的步骤。
26.第四方面,本发明提供一种存储有计算机可读指令的存储介质,所述计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行上述方法的步骤。
27.本发明与现有技术相比,具有以下优点:
28.在linux兼容android环境中,能彻底地解决内核模块在不同内核版本编译的问题,实现了内核模块在不同版本的内核间能够正常编译和运行。
附图说明
29.图1为本发明实施例提供的一种内核模块编译方法示意图;
30.图2为本发明实施例提供的一种内核模块编译装置组成示意图。
具体实施方式
31.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
32.对于在linux操作系统上兼容运行android的环境来说,android运行环境是运行在容器中的。
33.通过容器技术可以在linux系统运行一个新的linux系统(包括其他基于linux系统定制的系统,如android),容器使得客户机系统和主机系统相互隔离。与传统的基于虚拟机技术的方案不同,在容器技术中,客户系统与主机系统共享cpu、内存、存储等资源,资源开销很低。此外,通过适当的配置,还能使客户系统直接访问主机的硬件资源,进一步提升客户系统的性能。
34.图1为本发明实施例提供的一种内核模块编译方法示意图,所述方法为:
35.根据不同版本的内核对待编译加载的内核模块源码进行适配;
36.判断在指定路径上是否存在已编译的内核模块;若存在,则比对已编译的内核模块与内核是否匹配:如果匹配则加载已编译的内核模块,如果不匹配则将加密的内核模块源码解密并复制到指定的隐藏目录下;若不存在,则将加密的内核模块源码解密并复制到指定的隐藏目录下;在内核上编译解密后的内核模块源码;加载编译后的内核模块。
37.进一步地,所述方法中根据不同版本的内核对待编译加载的内核模块源码进行适配,包括:
38.根据linux内核版本号对待引用的内核头文件进行适配;
39.根据linux内核版本号对待调用的内核api进行适配;
40.根据linux内核版本号对内核符号表进行适配。
41.进一步地,所述方法还包括:
42.在内核上编译解密后的内核模块源码之后,
43.将编译后的内核模块复制到指定路径下,并删除解密后的内核模块源码。
44.在内核上编译解密后的内核模块源码,并将编译好的内核模块复制到指定路径下,待下次需要执行本方法的在指定路径查询是否有编译好的内核模块时,可以查询到编译好的内核模块。
45.由于内核模块源码存放在linux平台的指定路径下,从源码安全的角度考虑,需要将内核模块源码进行加密。当需要编译内核源码时,再从指定路径下将加密过的内核模块源码进行解密后复制到指定的隐藏目录下。复制到指定的隐藏目录也是从源码安全的角度考虑的,将内核模块源码复制到linux系统的隐藏目录后,用户使用文件管理器无法查看到这个隐藏目录。待内核模块编译完成后,会生成内核模块的ko文件,再将解密后的内核模块源码删除,防止用户查看到没有经过加密的内核模块源码,确保源码安全。
46.进一步地,所述方法中根据linux内核版本号对待引用的内核头文件进行适配,具体为:
47.在待编译加载的内核模块源码中,通过判断linux_version_code的宏定义来适配不同版本的linux内核,根据linux内核版本号引用不同路径的内核头文件。
48.由于内核模块源码需要在不同版本的内核上编译和运行,而不同版本的linux内核存在一些差异,所以内核模块源码需要对不同版本的内核进行适配。为了适配不同版本的内核,主要使用了如下方法:
49.根据linux内核版本号对需要引用的内核头文件做适配。
50.linux内核版本可以在linux平台上通过uname-r指令进行查看。在linux内核模块源码中,通过包含linux/version.h头文件,使用linux/version.h头文件中的linux_version_code来获linux内核版本信息。由于不同的linux内核版本,其头文件的路径可能会发生变化,所以需要根据linux内核版本对需要引用的内核头文件做适配。
51.本方法中,在内核模块源码中,以下代码是根据linux内核版本号对需要引用的内核头文件做适配的示例代码:
52.#include《linux/version.h》
53.#if linux_version_code》=kernel_version(4,11,0)
54.#include《linux/sched/signal.h》
55.#include《linux/sched/mm.h》
56.#else
57.#include《linux/signal.h》
58.#include《linux/mm.h》
59.#endif
60.以上代码表示,包含了linux/version.h头文件。通过判断linux_version_code的宏定义来适配不同版本的linux内核。
61.#if和#else,#endif是c语言中的一种条件编译的语法,表示根据不同的条件来编译不同的代码。
62.由于linux内核版本从4.11.0开始,signal.h和mm.h头文件的路径发生了变化,所以linux内核版本大于等于4.11.0、linux内核版本小于4.11.0的内核上,需要引用不同路径的头文件,否则编译会出错并提示找不到头文件。具体的,如果linux内核版本大于等于4.11.0,则触发条件编译,仅仅编译以下两行:
63.#include《linux/sched/signal.h》
64.#include《linux/sched/mm.h》
65.即引用linux/sched/signal.h和linux/sched/mm.h头文件。如果linux内核版本小于4.11.0,则触发条件编译,仅仅编译以下两行:
66.#include《linux/signal.h》
67.#include《linux/mm.h》
68.即引用linux/signal.h和linux/mm.h头文件。
69.进一步地,所述方法中根据linux内核版本号对待调用的内核api进行适配,具体为:
70.在待编译加载的内核模块源码中,根据linux内核版本号对传递到api的函数参数进行设置:对函数参数的类型、个数进行设置。
71.由于不同的linux内核版本,其内核api可能会发生变化。有可能在某个版本的linux内核上新增了某个api,也有可能修改了内核api的参数类型或者参数个数。为保证内核模块能在不同版本的linux内核上编译和运行,则需要根据linux内核版本号对调用的内核api做适配,从而保证针对相应版本的linux内核,正确调用到相应的内核api。
72.本方法中,在内核模块源码中,以下代码是根据linux内核版本号对调用的内核api做适配的示例代码:
73.#include《linux/version.h》
74.#if linux_version_code》=kernel_version(4,11,0)
75.zap_page_range(vma,page_addr,page_size);
76.#else
77.zap_page_range(vma,page_addr,page_size,null);
78.#endif
79.以上代码表示,包含了linux/version.h头文件。通过判断linux_version_code的宏定义来适配不同版本的linux内核。
80.由于linux内核版本从4.11.0开始,zap_page_range接口的函数参数由四个减少
为三个。如果在不同的linux内核版本上对调用zap_page_range接口的参数没有进行适配,则会编译出错,且提示函数参数太多或者太少。所以,如果linux内核版本大于等于4.11.0,则触发条件编译,仅仅编译以下源码:zap_page_range(vma,page_addr,page_size);即调用zap_page_range(vma,page_addr,page_size);传递三个函数给api接口。如果linux内核版本小于4.11.0,则触发条件编译,仅仅编译以下源码:zap_page_range(vma,page_addr,page_size,null);即调用zap_page_range(vma,page_addr,page_size,null);传递四个参数给api接口。
81.进一步地,所述方法中根据linux内核版本号对内核符号表进行适配,具体为:
82.对拟使用的内核api进行导出,获取拟使用的内核api的地址,以便待编译加载的内核模块源码调用。
83.linux内核符号表是指就是在内核的内部函数或变量中,可供外部引用的函数和变量的符号表。其实就是一个索引文件,它存在的目的就是让外部软件获知kernel文件内部实际分配的位置。从linux内核的2.6版本开始,内核引入了导出符号的机制。只有在内核中使用export_symbol或export_symbol_gpl导出的符号才能在内核模块中直接使用。export_symbol或export_symbol_gpl标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在内核模块中直接调用,即使用export_symbol或export_symbol_gpl可以将一个函数以符号的方式导出给其他模块使用。然而,内核中并非所有函数或者符号都有export_symbol或export_symbol_gpl标签,即内核中并没有导出所有的符号。例如,在3.8.0的内核中,do_page_fault就没有被导出。
84.本方法中,内核模块中需要使用到的部分内核api并没有被导出,导致内核模块中无法直接使用这些api。为了适配各种不同版本的linux内核,则需要将内核模块中所使用的没有导出的内核api进行导出,即获取这些api的地址,供内核模块进行调用。
85.进一步地,所述方法中比对已编译的内核模块与内核是否匹配,具体为:
86.通过modinfo mymodule.ko指令获取内核模块的vermagic信息,再通过uname

a指令获取内核的版本号,比较内核的版本信息与内核模块中的vermagic信息,确认已编译的内核模块与内核是否匹配。
87.执行本步骤的主要目的是为了解决linux目标平台系统升级后,linux目标平台的内核版本发生改变,导致编译好的内核模块和内核不匹配,从而编译好的内核模块在内核中无法加载。执行本步骤后,就能识别到编译好的内核模块和内核不匹配,从而在升级的目标内核上重新编译内核模块。
88.图2为本发明实施例提供的一种内核模块编译装置组成示意图,所述装置包括:
89.存储器,用于存储程序;
90.处理器,用于执行所述存储器中存储的程序,当所述存储器中存储的程序被执行时,所述处理器用于执行上述方法的步骤。
91.此外,本发明实施例提供一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机可读指令,所述计算机可读指令被所述处理器执行时,使得所述处理器执行上述方法的步骤。
92.本发明实施例提供一种存储有计算机可读指令的存储介质,所述计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行上述方法的步骤。
93.最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1