CN113220303A - 一种内核模块的编译方法和系统 - Google Patents
一种内核模块的编译方法和系统 Download PDFInfo
- Publication number
- CN113220303A CN113220303A CN202110417643.6A CN202110417643A CN113220303A CN 113220303 A CN113220303 A CN 113220303A CN 202110417643 A CN202110417643 A CN 202110417643A CN 113220303 A CN113220303 A CN 113220303A
- Authority
- CN
- China
- Prior art keywords
- kernel
- target
- module
- compiling
- kernel module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种内核模块的编译方法和系统,通过预先生成多版本的内核模块,能够有效提高内核模块与目标内核编译的适配效率,同时,通过引入对内核是否具有头文件包的检测机制,可以进一步扩大内核模块所适配的内核的范围。
Description
技术领域
本发明属于操作系统内核以及内核模块编译时的版本兼容性保证技术领域,具体涉及一种内核模块的编译方法和系统。
背景技术
为了提高操作系统的运行效率,目前多数主流开源操作系统均采用单块内核的结构,例如Linux、FreeBSD等,也就是说整个系统内核都运行在一个单独的保护域中,但是,单块内核的结构存在着可扩展性和可维护性相对较差等问题。为了弥补这一缺陷,现有的单块内核操作系统往往采用模块化的机制来运行,即允许在内核的运行时动态地插入或删除内核模块。
内核模块是操作系统内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能的程序。内核模块可以被单独编译,但不能独立运行,在运行时需要被链接到内核作为内核的一部分在内核空间运行,内核模块之间以及与核心功能之间通过函数调用来实现数据流和计算的传递,内核模块与运行在用户空间的进程是完全不同的。例如,在Linux、FreeBSD系统中,设备驱动、文件系统等扩展功能均采用内核模块的方式实现,与进程管理、内存管理等核心功能协同完成管理硬件设备以及向应用提供服务的功能。
内核模块需要在操作系统内进行编译、链接后才能加载运行。在内核模块的编译阶段一般会包含linux/modversions.h等头文件,因此,在该内核模块中就加入了操作系统内核的版本号,以及编译时所使用的gcc版本、SMP与PREEMPT等配置信息。为了保证内核模块的正常运行,在加载内核模块时操作系统内核通常会采用校验机制来验证内核模块的版本是否匹配,例如,操作系统内核会检查内核模块中反映版本、指令集架构信息的vermagic是否与当前内核的版本匹配。
由于修补缺陷、升级功能等原因,多数操作系统发行版会频繁更新内核,而且更新后的内核往往仅提供最新内核对应的头文件包,那么基于更新后的头文件包编译的内核模块就不能在之前的没有该头文件包的内核版本上编译加载。然而,很多内核模块是需要在不同版本的内核上进行验证的,上述校验机制就会导致内核模块在不同版本的系统内核之间存在兼容性问题,从而影响内核模块的适应性和可用性。
发明内容
有鉴于此,本发明提供了一种内核模块的编译方法和系统,通过采用预先生成多版本的内核模块及检测目标内核等机制,解决了内核模块在不同版本内核中的兼容问题。
本发明提供的一种内核模块的编译方法,具体包括以下步骤:
在不同版本的内核上编译内核模块的源码,得到具有多个版本信息的内核模块;在所述内核模块中查找是否存在具有与目标内核相同的版本信息的内核模块,如果存在,则将匹配的内核模块的版本信息修改为目标内核的版本信息;如果不存在,判断目标内核是否包含头文件包,如果不包含,则为所述目标内核构建头文件包,然后在所述目标内核上编译内核模块;如果包含,则在所述目标内核上编译内核模块;
其中,所述目标内核为待加载内核模块的内核。
进一步地,所述在不同版本的内核上编译内核模块的源码的过程中,在所述内核模块中嵌入设定长度的版本号。
本发明提供的一种内核模块的编译系统,包括:主流内核检测单元、目标内核检测单元、头文件包构建单元、内核模块编译单元及内核模块存储单元;
所述主流内核检测单元,用于获取多个内核的版本信息,检测所述内核是否具有头文件包,如果具有头文件,则输出所述内核及其版本信息;否则,调用所述头文件包构建单元为内核构建头文件包,输出具有头文件包的内核及其版本信息;
所述目标内核检测单元,用于获取目标内核的版本信息,检测目标内核是否具有头文件包,如果具有,则输出目标内核及其版本信息;否则,调用所述头文件包构建单元为目标内核构建头文件包,输出具有头文件包的目标内核及其版本信息;
所述头文件包构建单元,用于为所述主流内核检测单元或目标内核检测单元输出的内核构建头文件包;
所述内核模块编译单元,用于在所述主流内核检测单元输出的所述内核上分别编译内核模块,输出内核模块的二进制文件;根据所述目标内核检测单元输出的目标内核及其版本信息,在内核模块存储单元中匹配内核模块,如果匹配成功,则将匹配到的内核模块的版本信息修改为目标内核的版本信息;否则,在目标内核上编译内核模块的源码。
所述内核模块存储单元,用于存储所述内核模块编译单元输出的内核模块的二进制文件。
进一步地,所述内核模块编译单元在编译所述内核模块时嵌入设定长度的版本号。
有益效果:
本发明通过预先生成多版本的内核模块,能够有效提高内核模块与目标内核编译的适配效率,同时,通过引入对内核是否具有头文件包的检测机制,可以进一步扩大内核模块所适配的内核的范围。
附图说明
图1为本发明提供的一种内核模块的编译方法的流程图。
图2为本发明提供的一种内核模块的编译系统的结构图。
具体实施方式
下面结合附图并举实施例,对本发明进行详细描述。
在Linux 4.4的内核中,linux/vermagic.h中定义了VERMAGIC_STRING变量,变量VERMAGIC_STRING中不仅包含内核版本号,还包含内核使用的gcc版本,SMP与PREEMPT等配置信息。在内核模块的编译过程中,"MODPOST"阶段,会将VERMAGIC_STRING的内容添加到内核模块的modinfo段中。在内核源码目录下的scripts\mod\modpost.c文件中,可以看到内核模块的后续处理部分的代码。此外,内核模块编译生成后,可以采用`modinfomymodule.ko`命令查看该内核模块的vermagic等信息。在Linux4.4内核中的内核模块装载器里保存有该内核的版本信息,在加载内核模块时,装载器会比较其所保存的内核vermagic与待加载内核模块的modinfo段里保存的vermagic信息是否一致,只有当两者一致时,内核模块才能被加载。
本发明提供的一种内核模块的编译方法和系统,其基本思想是:分别在不同版本的内核上编译内核模块的源码,得到具有多个版本信息的内核模块;在所述内核模块中查找是否存在具有与目标内核相同的版本信息的内核模块,如果存在,则将匹配的内核模块的版本信息修改为目标内核的版本信息;如果不存在,判断目标内核是否包含头文件包,如果不包含,则为所述目标内核构建头文件包,然后在所述目标内核上编译内核模块;如果包含,则在所述目标内核上编译内核模块。
本发明提供的一种内核模块的编译方法,流程如图1所示,包括以下步骤:
步骤1、分别在当前主流版本的内核上编译内核模块的源码,得到具有多个版本信息的内核模块的二进制文件。
内核的版本号,通常包括主版本号和次版本号。例如,Linux内核版本号的格式一般为x.yy.zz,其中,x为主版本号,yy为次版本号,zz为修订的版本号,主版本号升级比较慢,修订版本号对内只做较小的改变,所以主要是次版本号,次版本号为奇数时代表开发版本还没正式发行,使用偶数代表稳定版本。因此,对于不包含头文件包的内核,需要根据内核的主版本号和次版本号,可以从kernel.org下载对应内核源码,并为内核构建头文件包。然后,在构建了头文件包的内核上编译内核模块,生成与内核的版本相应的多个内核模块的二进制文件。例如,内核模块的二进制文件为A.ko。
本发明中,为了编译后的内核模块能够适应于更多的内核,在内核模块编译过程中嵌入了具有设定长度的版本号,该设定长度要足够大,一般来说不小于目前已知的版本信息的最大长度值,以容纳所有目前已知内核的版本信息。本发明中,版本信息可以包括内核版本信息、编译器版本信息及其他相关配置信息等相关信息。
步骤2、对于目标内核,提取该目标内核的版本信息,在上述内核模块中查找是否存在具有相同版本信息的内核模块,如果有,则将该内核模块的版本信息修改为目标内核的版本信息;如果没有,则执行步骤3。
例如,通过登录目标Linux后在终端输入“cat/proc/version”命令获取目标内核的版本信息,也可以通过登录目标Linux后在终端输入“uname-a”获取目标Linux的内核版本号。
本发明中,需要比对目标内核及内核模块的主版本号和次版本号,当主版本号和次版本号均相同时,则修改内核模块的版本信息(vermagic)为目标内核的版本信息。
步骤3、判断目标内核是否具有头文件包,如果有,则在目标内核中重新编译内核模块;如果没有,则为目标内核构建头文件包,然后在目标内核上编译内核模块。
基于本发明提供的一种内核模块的编译方法,本发明提供了一种内核模块的编译系统,结构如图2所示,具体包括:主流内核检测单元、目标内核检测单元、头文件包构建单元、内核模块编译单元及内核模块存储单元。
其中,主流内核检测单元,用于获取主流内核的版本信息,检测主流内核是否具有头文件包,如果具有头文件,则输出主流内核及其版本信息;否则,调用头文件包构建单元为主流内核构建头文件包,输出具有头文件包的主流内核及其版本信息。例如,将目标内核输入内核检测单元即可得到能够支持内核模块编译的内核,以及内核的版本信息。
目标内核检测单元,用于获取目标内核的版本信息,检测目标内核是否具有头文件包,如果具有头文件,则输出目标内核及其版本信息;否则,调用头文件包构建单元为目标内核构建头文件包,输出具有头文件包的目标内核及其版本信息。
头文件包构建单元,用于为主流内核检测单元或目标内核检测单元输出的内核构建头文件包。
内核模块编译单元,用于在主流内核检测单元输出的主流内核上分别编译内核模块,输出内核模块的二进制文件;根据目标内核检测单元输出的目标内核及其版本信息,在内核模块存储单元中匹配内核模块,如果匹配成功,则将匹配到的内核模块的版本信息修改为目标内核的版本信息;否则,在目标内核上编译内核模块的源码。
内核模块存储单元,用于存储内核模块编译单元输出的内核模块的二进制文件。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (4)
1.一种内核模块的编译方法,其特征在于,具体包括以下步骤:
在不同版本的内核上编译内核模块的源码,得到具有多个版本信息的内核模块;在所述内核模块中查找是否存在具有与目标内核相同的版本信息的内核模块,如果存在,则将匹配的内核模块的版本信息修改为目标内核的版本信息;如果不存在,判断目标内核是否包含头文件包,如果不包含,则为所述目标内核构建头文件包,然后在所述目标内核上编译内核模块;如果包含,则在所述目标内核上编译内核模块;
其中,所述目标内核为待加载内核模块的内核。
2.根据权利要求1所述的方法,其特征在于,所述在不同版本的内核上编译内核模块的源码的过程中,在所述内核模块中嵌入设定长度的版本号。
3.一种内核模块的编译系统,其特征在于,包括:主流内核检测单元、目标内核检测单元、头文件包构建单元、内核模块编译单元及内核模块存储单元;
所述主流内核检测单元,用于获取多个内核的版本信息,检测所述内核是否具有头文件包,如果具有头文件,则输出所述内核及其版本信息;否则,调用所述头文件包构建单元为内核构建头文件包,输出具有头文件包的内核及其版本信息;
所述目标内核检测单元,用于获取目标内核的版本信息,检测目标内核是否具有头文件包,如果具有,则输出目标内核及其版本信息;否则,调用所述头文件包构建单元为目标内核构建头文件包,输出具有头文件包的目标内核及其版本信息;
所述头文件包构建单元,用于为所述主流内核检测单元或目标内核检测单元输出的内核构建头文件包;
所述内核模块编译单元,用于在所述主流内核检测单元输出的所述内核上分别编译内核模块,输出内核模块的二进制文件;根据所述目标内核检测单元输出的目标内核及其版本信息,在内核模块存储单元中匹配内核模块,如果匹配成功,则将匹配到的内核模块的版本信息修改为目标内核的版本信息;否则,在目标内核上编译内核模块的源码。
所述内核模块存储单元,用于存储所述内核模块编译单元输出的内核模块的二进制文件。
4.根据权利要求3所述的系统,其特征在于,所述内核模块编译单元在编译所述内核模块时嵌入设定长度的版本号。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110417643.6A CN113220303A (zh) | 2021-04-21 | 2021-04-21 | 一种内核模块的编译方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110417643.6A CN113220303A (zh) | 2021-04-21 | 2021-04-21 | 一种内核模块的编译方法和系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113220303A true CN113220303A (zh) | 2021-08-06 |
Family
ID=77087893
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110417643.6A Pending CN113220303A (zh) | 2021-04-21 | 2021-04-21 | 一种内核模块的编译方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113220303A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116243971A (zh) * | 2023-05-10 | 2023-06-09 | 北京麟卓信息科技有限公司 | 一种基于静态依赖自举的内核无关的模块构建方法 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1650264A (zh) * | 2002-04-17 | 2005-08-03 | 计算机联合思想公司 | 用于修改一个内核模块以便在多个内核版本上运行的设备和方法 |
US20090228881A1 (en) * | 2008-03-04 | 2009-09-10 | Atul Mukker | Linux matrix compilation system and method |
CN104407887A (zh) * | 2014-11-06 | 2015-03-11 | 航天科工深圳(集团)有限公司 | 一种嵌入式系统内核模块动态加载程序的方法及装置 |
CN104572235A (zh) * | 2014-12-31 | 2015-04-29 | 北京奇虎科技有限公司 | 一种可加载内核模块的编译方法和装置 |
CN105549965A (zh) * | 2015-12-09 | 2016-05-04 | 浪潮电子信息产业股份有限公司 | 一种将驱动集成到不同Linux内核版本的方法 |
CN105893085A (zh) * | 2016-03-30 | 2016-08-24 | 百度在线网络技术(北京)有限公司 | 内核模块加载方法和装置 |
CN110569068A (zh) * | 2018-06-06 | 2019-12-13 | 南通研祥智能科技有限公司 | 一种Linux驱动加载程序的方法及装置 |
-
2021
- 2021-04-21 CN CN202110417643.6A patent/CN113220303A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1650264A (zh) * | 2002-04-17 | 2005-08-03 | 计算机联合思想公司 | 用于修改一个内核模块以便在多个内核版本上运行的设备和方法 |
US20090228881A1 (en) * | 2008-03-04 | 2009-09-10 | Atul Mukker | Linux matrix compilation system and method |
CN104407887A (zh) * | 2014-11-06 | 2015-03-11 | 航天科工深圳(集团)有限公司 | 一种嵌入式系统内核模块动态加载程序的方法及装置 |
CN104572235A (zh) * | 2014-12-31 | 2015-04-29 | 北京奇虎科技有限公司 | 一种可加载内核模块的编译方法和装置 |
CN105549965A (zh) * | 2015-12-09 | 2016-05-04 | 浪潮电子信息产业股份有限公司 | 一种将驱动集成到不同Linux内核版本的方法 |
CN105893085A (zh) * | 2016-03-30 | 2016-08-24 | 百度在线网络技术(北京)有限公司 | 内核模块加载方法和装置 |
CN110569068A (zh) * | 2018-06-06 | 2019-12-13 | 南通研祥智能科技有限公司 | 一种Linux驱动加载程序的方法及装置 |
Non-Patent Citations (3)
Title |
---|
DDK3000: "编译内核模块ko文件,只需要内核头文件?", 《HTTPS://EXP.NEWSMTH.NET/TOPIC/ARTICLE/FF7BAFD58BAC38717273217AE8A2B0CF》 * |
INVALIDS: "请问什么是内核头文件(Kernel Headers)、工具链(Tool Chain)?", 《HTTPS://WWW.ZHIHU.COM/QUESTION/21319166》 * |
REDCOCO: "关于kernel-devel和kernel-header", 《HTTP://BLOG.SINA.COM.CN/S/BLOG_6C17CAE3010139LM.HTML》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116243971A (zh) * | 2023-05-10 | 2023-06-09 | 北京麟卓信息科技有限公司 | 一种基于静态依赖自举的内核无关的模块构建方法 |
CN116243971B (zh) * | 2023-05-10 | 2023-07-28 | 北京麟卓信息科技有限公司 | 一种基于静态依赖自举的内核无关的模块构建方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11853774B2 (en) | Dynamically loaded plugin architecture | |
US7055146B1 (en) | Method and system for dynamically inserting modifications for identified programs | |
CN109614165B (zh) | 一种com组件的多版本并行运行方法和装置 | |
US8181166B2 (en) | System and method for determining when an EJB compiler needs to be executed | |
US20040107416A1 (en) | Patching of in-use functions on a running computer system | |
EP1548587A2 (en) | Self-describing software image update components | |
US8001518B2 (en) | Configuring a shared library to accommodate relocatable data in a pervasive device | |
US8112745B2 (en) | Apparatus and method for capabilities verification and restriction of managed applications in an execution environment | |
US20080066063A1 (en) | System and method for preparing runtime checks | |
US7320121B2 (en) | Computer-implemented system and method for generating embedded code to add functionality to a user application | |
US20040268301A1 (en) | Adding new compiler methods to an integrated development environment | |
US7770158B2 (en) | Source code translator | |
US10795659B1 (en) | System and method for live patching processes in user space | |
KR100871778B1 (ko) | 중앙집중형 동적 어드레싱 매니저를 이용한 동적 어드레싱방법 및 장치 | |
US20060161898A1 (en) | Method and system for project library dependency management | |
US20080022260A1 (en) | Method for accessing internal states of objects in object oriented programming | |
US7844734B2 (en) | Dynamic addressing (DA) using a centralized DA manager | |
US7904879B2 (en) | Reorganized storing of applications to improve execution | |
CN102364433A (zh) | 在ARM处理器上实现Wine构建工具移植的方法 | |
CN115617687A (zh) | 程序插桩方法、装置、设备和存储介质 | |
CN112363726A (zh) | 一种内核模块的跨内核版本编译方法及系统 | |
CN113220303A (zh) | 一种内核模块的编译方法和系统 | |
CN117707543A (zh) | 一种应用安装包制作和安装方法、计算设备及存储介质 | |
CN111352631B (zh) | 一种接口兼容性检测方法及装置 | |
CN110659022B (zh) | 一种基于Java自动调用Python脚本的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20210806 |
|
RJ01 | Rejection of invention patent application after publication |