CN113220303A - 一种内核模块的编译方法和系统 - Google Patents

一种内核模块的编译方法和系统 Download PDF

Info

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
Application number
CN202110417643.6A
Other languages
English (en)
Inventor
温研
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Linzhuo Information Technology Co Ltd
Original Assignee
Beijing Linzhuo Information Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Linzhuo Information Technology Co Ltd filed Critical Beijing Linzhuo Information Technology Co Ltd
Priority to CN202110417643.6A priority Critical patent/CN113220303A/zh
Publication of CN113220303A publication Critical patent/CN113220303A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version 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所述的系统,其特征在于,所述内核模块编译单元在编译所述内核模块时嵌入设定长度的版本号。
CN202110417643.6A 2021-04-21 2021-04-21 一种内核模块的编译方法和系统 Pending CN113220303A (zh)

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)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116243971A (zh) * 2023-05-10 2023-06-09 北京麟卓信息科技有限公司 一种基于静态依赖自举的内核无关的模块构建方法

Citations (7)

* Cited by examiner, † Cited by third party
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驱动加载程序的方法及装置

Patent Citations (7)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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