一种内核模块编译、加载方法及装置制造方法及图纸

技术编号:18006858 阅读:24 留言:0更新日期:2018-05-21 07:29
本发明专利技术实施例提供一种内核模块编译、加载方法及装置,所述内核模块编译方法包括:获得用于生成第一内核模块的源代码及其对应的编译指令;执行所述编译指令,对所述源代码进行编译,获得所述第一内核模块及其所调用的非导出符号的标识信息;获取在编译内核时所生成的内核符号表;基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;将所述非导出符号表添加到所述第一内核模块中。如此,通过将非导出符号表添加到内核模块中,能够便捷地使得内核模块可以调用所需的非导出符号。

【技术实现步骤摘要】
一种内核模块编译、加载方法及装置
本专利技术涉及计算机
,尤其涉及一种内核模块编译、加载方法及装置。
技术介绍
Linux内核是一个单内核(monolithickernel)。因为所有的内容都集成在一起,单内核的最大优点是效率高,但其缺点是可扩展性和可维护性相对较差。为了弥补这一缺陷,Linux内核采用模块机制来运行。内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(LoadableKernelModule,LKM),也可以简称为模块。Linux内核中将内核符号分为导出符号和非导出符号两种,每个内核模块只能调用导出符号,而不能调用非导出符号。但是,在内核模块功能调试的过程中,为了完成预设功能,内核模块往往可能需要调用部分非导出符号。目前,现有技术的做法是:通过内核宏定义函数,如EXPORT_SYMBOL(符号名)将所需的非导出符号自定义为导出符号,来重新生成自定义的内核导出符号。在通过现有方式来使用非导出符号的过程中,专利技术人发现现有技术中至少存在如下问题:通过内核宏定义函数来重新生成自定义的内核导出符号时,就会修改内核源码,但是,一旦改动内核源码就要重写编译内核,再编译boot镜像,最后重新刷机才能生效。这样,操作十分不便。
技术实现思路
有鉴于此,本专利技术实施例提供一种内核模块编译、加载方法及装置,主要目的在于,能够便捷地使得内核模块可以调用所需的非导出符号。为达到上述目的,本专利技术实施例主要提供如下技术方案:第一方面,本专利技术实施例提供一种内核模块编译方法,所述方法包括:获得用于生成第一内核模块的源代码及其对应的编译指令;执行所述编译指令,对所述源代码进行编译,获得所述第一内核模块及其所调用的非导出符号的标识信息;获取在编译内核时所生成的内核符号表;基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;将所述非导出符号表添加到所述第一内核模块中。第二方面,本专利技术实施例提供一种内核模块加载方法,所述方法包括:获得加载指令,其中,所述加载指令用于将添加有非导出符号表的第二内核模块加载到内核中;执行所述加载指令,通过所述第二内核模块中的非导出符号表,对所述第二内核模块所调用的非导出符号进行解析;如果通过所述非导出符号表对所述非导出符号解析成功,将所述第二内核模块加载到内核中。第三方面,本专利技术实施例提供一种内核模块编译装置,所述装置包括:第一获得单元、第一执行单元、获取单元、生成单元以及添加单元,其中,所述第一获得单元,用于获得用于生成目标内核模块的源代码及其对应的编译指令;所述第一执行单元,用于执行所述编译指令,对所述源代码进行编译,获得所述目标内核模块及其所调用的非导出符号的标识信息;所述获取单元,用于获取在编译内核时所生成的内核符号表;所述生成单元,用于基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;所述添加单元,用于将所述非导出符号表添加到所述目标内核模块中。第四方面,本专利技术实施例提供一种内核模块加载装置,所述装置包括:第二获得单元、第二执行单元以及加载单元,其中,所述第二获得单元,用于获得加载指令,其中,所述加载指令用于将添加有非导出符号表的目标内核模块加载到内核中;所述第二执行单元,用于执行所述加载指令,通过所述目标内核模块中的非导出符号表,对所述目标内核模块所调用的非导出符号进行解析;所述加载单元,用于如果通过所述非导出符号表对所述非导出符号解析成功,将所述目标内核模块加载到内核中。第五方面,本专利技术实施例提供一种存储介质,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行上述方法。第六方面,本专利技术实施例提供一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述方法。本专利技术实施例提供的一种内核模块编译、加载方法及装置,在获得用于生成第一内核模块的源代码及其对应的编译指令之后,首先,执行编译指令,对源代码进行编译,获得第一内核模块及其所调用的非导出符号的标识信息,然后,获取在编译内核时所生成的内核符号表,并基于标识信息,从内核符号表中,导出非导出符号,并生成非导出符号表,最后,将非导出符号表添加到第一内核模块中。这样,由于是通过将内核模块所调用的非导出符号直接添加到内核模块中,来使得内核模块可以使用非导出符号的。这样,就不需要改动内核源码,也就不需要对内核重新进行编译,从而,能够便捷地使得内核模块调用所需的非导出符号。附图说明通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本专利技术的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:图1示出了本专利技术实施例一中的内核模块编译方法的流程示意图;图2示出了本专利技术实施例二中的内核模块加载方法的流程示意图;图3-1示出了本专利技术实施例三中的第二内核模块的结构示意图;图3-2示出了本专利技术实施例三中的内核模块加载方法的流程示意图;图4示出了本专利技术实施例四中的内核模块编译装置的结构示意图;图5示出了本专利技术实施例五中的内核模块加载装置的结构示意图;图6示出了本专利技术实施例六中的内核模块编译设备的结构示意图。具体实施方式下面将参照附图更详细地描述本专利技术的示例性实施例。虽然附图中显示了本专利技术的示例性实施例,然而应当理解,可以以各种形式实现本专利技术而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本专利技术,并且能够将本专利技术的范围完整的传达给本领域的技术人员。实施例一本专利技术实施例提供一种内核模块编译方法,该内核模块编译方法可以应用于在内核模块需要使用非导出符号时,编译出可加载到内核中的该内核模块。下面首先对本专利技术实施例中所提到的技术名词做简要介绍。(1)Linux内核;Linux内核是一个Linux操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。(2)内核模块;内核模块是具有独立功能的程序,它由加载/卸载函数、功能函数以及一系列声明组成,它可以被传入参数,也可以导出它的符号供其它内核模块使用。它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内核空间中运行。Linux内核的整体结构已经非常庞大,而其包含的组件也非常多,一般情况下,为了控制内核大小,内核模块本身不被编译入内核映像,而是单独进行编译,但是在该内核模块的功能需要被使用的时候,其对应的二进制代码可以被动态地加载到内核中,内核模块一旦被加载到内核中后,内核模块就和内核中的其它部分是完全一样的。(3)内核符号、导出符号和非导出符号;内核符号也可以简称为符号,它是指内核源代码或者内核源代码中所使用的变量名(VariableName)或函数名(FunctionName)。Linux内核中将内核符号分为导出符号和非导出符号两种,每个内核模块只能调用导出符号,而不能调用非导出符号。导出符号是指标记为EXPORT的内核符号,可以被内核模块使用;而非导出符号是指未标记为EXPORT的内核符号,不能被内核模块使用。(4)内核符号表(KernelSymbolTable)。内核符号表是用于存储内核中所有内核符号及其本文档来自技高网...
一种内核模块编译、加载方法及装置

【技术保护点】
一种内核模块编译方法,其特征在于,所述方法包括:获得用于生成第一内核模块的源代码及其对应的编译指令;执行所述编译指令,对所述源代码进行编译,获得所述第一内核模块及其所调用的非导出符号的标识信息;获取在编译内核时所生成的内核符号表;基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;将所述非导出符号表添加到所述第一内核模块中。

【技术特征摘要】
1.一种内核模块编译方法,其特征在于,所述方法包括:获得用于生成第一内核模块的源代码及其对应的编译指令;执行所述编译指令,对所述源代码进行编译,获得所述第一内核模块及其所调用的非导出符号的标识信息;获取在编译内核时所生成的内核符号表;基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;将所述非导出符号表添加到所述第一内核模块中。2.根据权利要求1所述的方法,其特征在于,所述将所述非导出符号表添加到所述第一内核模块中,包括:从所述第一内核模块中的数据模块中,获取原始符号表,其中,所述原始符号表为在添加所述非导出符号表前,所述第一内核模块中的数据模块中原有的符号表;按照预设数据结构,对所述非导出符号表和所述原始符号表进行处理,更新所述数据模块。3.根据权利要求1或2所述的方法,其特征在于,对所述源代码进行编译,获得所述第一内核模块所调用的非导出符号的标识信息,包括:对所述源代码进行编译,获取编译过程中生成的编译告警信息;对所述编译警告信息中每一条警告数据的警告原因进行分析,根据警告原因符合预设条件的警告数据,获取所述非导出符号对应的标识信息。4.根据权利要求1所述的方法,其特征在于,在所述将所述非导出符号表添加到所述第一内核模块中之后,所述方法还包括:获得加载指令,其中,所述加载指令用于将添加所述非导出符号表后的第一内核模块加载到内核中;执行所述加载指令,通过所述非导出符号表,对所述非导出符号进行解析;如果通过所述非导出符号表对所述非导出符号解析成功,将所述添加所述非导出符号表后的第一内核模块加载到内核中。5.一种内核模块加载方法,其特征在于,所述方法包括:获得加载指令,其中,所述加载指令用于将添加有非导出符号表的第二内核模块加载到内核中;执行所述加载指令,通过所述第二内核模块中的非导出符号表,对所述第二内核模块所调用的非导出符号进行解析;如果通过所述非导出符号表对所述非导出...

【专利技术属性】
技术研发人员:刘天张建新
申请(专利权)人:北京奇虎科技有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1