内核模块的构建方法及装置、电子设备、存储介质与流程

摘要: 本公开涉及计算机开发,具体而言,涉及一种内核模块的构建方法及装置、电子设备、存储介质。背景技术:1、目前,linux内核模块(loadablekernelmod...
内核模块的构建方法及装置、电子设备、存储介质与流程

本公开涉及计算机开发,具体而言,涉及一种内核模块的构建方法及装置、电子设备、存储介质。

背景技术:

1、目前,linux内核模块(loadable kernel module,lkm)的构建通常依赖与内核环境相匹配的专用构建系统,如kbuild系统,该类专用构建系统能够根据内核配置、源码组成以及构建规则完成内核模块的编译和链接,并生成可加载的内核模块目标文件。

2、然而,相关技术专用构建系统无法自动导出包含内核复杂宏定义及头文件路径的编译元数据,主流集成开发环境(integrated development environment,ide)通常依赖编译数据库提供代码补全、定义跳转及静态分析功能,而专用构建系统无法生成此类数据库,使得开发者在编写内核模块时面临大量虚假语法错误提示,代码导航功能失效,严重降低了开发效率与代码可维护性。

3、需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。

技术实现思路

1、本公开实施例的目的在于提供一种内核模块的构建方法及装置、电子设备、存储介质,进而能够提升构建过程的一致性与可控性,并增强开发过程中代码解析与分析的准确性。

2、根据本公开实施例的第一方面,提供了一种内核模块的构建方法,包括:获取待构建的目标内核模块对应的内核源码信息和构建环境信息,内核源码信息包括目标内核模块的源码列表及目标内核模块与所依赖对象之间的依赖,构建环境信息包括目标内核模块的内核构建路径以及编译上下文信息;根据源码列表及依赖,生成符合内核模块构建规范的内核构建中间数据;将编译上下文信息关联至与源码列表关联的索引目标,生成用于代码索引的编译元数据;基于内核构建中间数据和内核构建路径,调用内核模块构建系统执行针对目标内核模块的编译操作,构建目标内核模块;以及在执行编译操作的过程中,基于索引目标同步导出编译元数据,以供集成开发环境进行代码解析与索引。

3、在本公开的一些示例实施例中,基于前述方案,内核构建中间数据包括中间构建文件;根据源码列表及依赖,生成符合内核模块构建规范的内核构建中间数据,包括:根据源码列表及依赖,确定目标内核模块对应的模块组成关系,模块组成关系用于表征目标内核模块与参与编译的源文件之间的对应关系;按照内核模块构建系统可识别的语法形式,将模块组成关系写入中间构建文件,得到符合内核模块构建规范的内核构建中间数据。

4、在本公开的一些示例实施例中,基于前述方案,根据源码列表及依赖,确定目标内核模块对应的模块组成关系,包括:根据源码列表生成模块目标定义信息;根据源码列表中各源文件生成目标文件映射关系;根据依赖生成依赖目标声明信息;根据模块目标定义信息、目标文件映射关系和依赖目标声明信息,确定目标内核模块对应的模块组成关系。

5、在本公开的一些示例实施例中,基于前述方案,在基于内核构建中间数据和内核构建路径,调用内核模块构建系统执行针对目标内核模块的编译操作之前,该方法还包括:基于源码列表及依赖,构建用于执行编译操作的实体构建目标;将内核构建中间数据关联至实体构建目标,以通过实体构建目标触发内核模块构建系统执行编译操作。

6、在本公开的一些示例实施例中,基于前述方案,索引目标包括虚拟索引目标;将编译上下文信息关联至与源码列表关联的索引目标,生成用于代码索引的编译元数据之前,该方法还包括:创建对象类型的构建目标,并将对象类型的构建目标设置为不参与默认构建流程;将源码列表关联至对象类型的构建目标,得到虚拟索引目标。

7、在本公开的一些示例实施例中,基于前述方案,编译上下文信息包括内核头文件路径及内核编译宏定义参数;将编译上下文信息关联至与源码列表关联的索引目标,生成用于代码索引的编译元数据,包括:将内核头文件路径设置为索引目标的头文件搜索路径;将内核编译宏定义参数及预设内核标识宏添加至索引目标的编译参数中;根据头文件搜索路径及编译参数,生成用于代码索引的编译元数据。

8、在本公开的一些示例实施例中,基于前述方案,基于内核构建中间数据和内核构建路径,调用内核模块构建系统执行针对目标内核模块的编译操作,构建目标内核模块,包括:响应于用于调用内核模块构建系统的编译指令,触发内核模块构建系统读取内核构建中间数据并执行针对目标内核模块的编译操作;其中,编译指令携带内核构建路径及内核构建中间数据对应的中间构建文件路径。

9、在本公开的一些示例实施例中,基于前述方案,执行针对目标内核模块的编译操作,构建目标内核模块,包括:基于内核构建中间数据,对源码列表中的各源文件进行编译,生成中间目标文件;基于中间目标文件进行链接处理,生成目标内核模块对应的内核模块目标文件;基于内核模块目标文件,构建目标内核模块。

10、在本公开的一些示例实施例中,基于前述方案,编译元数据包括结构化编译元数据文件;在执行编译操作的过程中,基于索引目标同步导出编译元数据,包括:在执行编译操作的过程中,记录索引目标对应的编译命令及编译参数;基于编译命令及编译参数构建编译数据库结构;根据编译数据库结构,生成并导出结构化编译元数据文件;其中,结构化编译元数据文件用于提供源文件对应的头文件路径、宏定义参数及编译选项,以支持代码解析、跳转及自动补全功能。

11、在本公开的一些示例实施例中,基于前述方案,获取待构建的目标内核模块对应的构建环境信息,包括:获取目标内核模块对应的运行环境的处理器架构信息;基于处理器架构信息确定目标内核模块的构建架构参数;在构建架构参数的基础上,根据预设搜索路径或用户指定路径搜索内核构建路径;以及解析内核构建路径中的配置文件,提取编译上下文信息。

12、在本公开的一些示例实施例中,基于前述方案,编译上下文信息包括内核头文件路径及内核编译宏定义参数,配置文件包括自动配置文件;解析内核构建路径中的配置文件,提取编译上下文信息,包括:解析内核构建路径中的自动配置文件,获取与目标内核模块相关的配置宏;将配置宏转换为内核模块构建系统可识别的宏定义参数集合,得到内核编译宏定义参数;以及基于内核构建路径确定内核头文件路径。

13、在本公开的一些示例实施例中,基于前述方案,获取待构建的目标内核模块对应的内核源码信息,包括:接收针对目标内核模块的模块定义指令;对模块定义指令进行解析,得到源码列表以及目标内核模块与所依赖对象之间的依赖。

14、根据本公开实施例的第二方面,提供了一种内核模块的构建装置,包括:内核环境探测模块,用于获取待构建的目标内核模块对应的内核源码信息和构建环境信息,内核源码信息包括目标内核模块的源码列表及目标内核模块与所依赖对象之间的依赖,构建环境信息包括目标内核模块的内核构建路径以及编译上下文信息;中间文件生成模块,用于根据源码列表及依赖,生成符合内核模块构建规范的内核构建中间数据;索引元数据生成模块,用于将编译上下文信息关联至与源码列表关联的索引目标,生成用于代码索引的编译元数据;编译执行模块,用于基于内核构建中间数据和内核构建路径,调用内核模块构建系统执行针对目标内核模块的编译操作,构建目标内核模块;元数据导出模块,用于在执行编译操作的过程中,基于索引目标同步导出编译元数据,以供集成开发环境进行代码解析与索引。

15、根据本公开实施例的第三方面,提供了一种电子设备,包括:处理器;以及存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时实现第一方面中的内核模块的构建方法。

16、根据本公开实施例的第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现第一方面中的内核模块的构建方法。

17、本公开实施例提供的技术方案可以包括以下有益效果:

18、本公开的示例实施例中的内核模块的构建方法,一方面,通过在内核模块构建过程中待构建的目标内核模块对应的内核源码信息和构建环境信息进行预先获取,并围绕源码列表、目标内核模块与所依赖对象之间的依赖、内核构建路径以及编译上下文信息进行统一组织,使得原本依赖构建系统内部动态推导的编译上下文信息能够在构建流程中以显式形式参与处理,并进一步结合源码列表及依赖生成符合内核模块构建规范的内核构建中间数据,从而使编译行为与其依赖信息之间建立稳定的对应关系,减少隐式依赖带来的不确定性,提升构建过程的一致性与可控性;另一方面,通过基于源码列表及依赖生成符合内核模块构建规范的内核构建中间数据,并据此调用内核模块构建系统执行针对目标内核模块的编译操作以构建目标内核模块,使得模块目标定义、源文件映射关系以及依赖结构能够以规则化方式进行表达与调度,从而在多文件、多依赖场景下保持构建逻辑的清晰性与可追溯性,降低构建脚本复杂度对开发过程的影响,提升构建过程的规范化程度与维护效率;再一方面,通过在构建流程中将编译上下文信息关联至与源码列表关联的索引目标,生成用于代码索引的编译元数据,在编译执行过程中基于索引目标同步导出编译元数据,使得分散于构建系统内部的编译关键信息能够形成统一表达,从而为开发环境获取完整且一致的编译上下文信息提供基础,提升代码解析过程中上下文信息的一致性与完整性,增强开发过程中的代码理解能力与分析准确性。

19、应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。