CN108052327A - 一种内核模块编译、加载方法及装置 - Google Patents
一种内核模块编译、加载方法及装置 Download PDFInfo
- Publication number
- CN108052327A CN108052327A CN201711311770.8A CN201711311770A CN108052327A CN 108052327 A CN108052327 A CN 108052327A CN 201711311770 A CN201711311770 A CN 201711311770A CN 108052327 A CN108052327 A CN 108052327A
- Authority
- CN
- China
- Prior art keywords
- kernel
- export
- symbol table
- kernel module
- symbol
- 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
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
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例提供一种内核模块编译、加载方法及装置,所述内核模块编译方法包括:获得用于生成第一内核模块的源代码及其对应的编译指令;执行所述编译指令,对所述源代码进行编译,获得所述第一内核模块及其所调用的非导出符号的标识信息;获取在编译内核时所生成的内核符号表;基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;将所述非导出符号表添加到所述第一内核模块中。如此,通过将非导出符号表添加到内核模块中,能够便捷地使得内核模块可以调用所需的非导出符号。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种内核模块编译、加载方法及装置。
背景技术
Linux内核是一个单内核(monolithic kernel)。因为所有的内容都集成在一起,单内核的最大优点是效率高,但其缺点是可扩展性和可维护性相对较差。为了弥补这一缺陷,Linux内核采用模块机制来运行。内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),也可以简称为模块。
Linux内核中将内核符号分为导出符号和非导出符号两种,每个内核模块只能调用导出符号,而不能调用非导出符号。但是,在内核模块功能调试的过程中,为了完成预设功能,内核模块往往可能需要调用部分非导出符号。目前,现有技术的做法是:通过内核宏定义函数,如EXPORT_SYMBOL(符号名)将所需的非导出符号自定义为导出符号,来重新生成自定义的内核导出符号。
在通过现有方式来使用非导出符号的过程中,发明人发现现有技术中至少存在如下问题:通过内核宏定义函数来重新生成自定义的内核导出符号时,就会修改内核源码,但是,一旦改动内核源码就要重写编译内核,再编译boot镜像,最后重新刷机才能生效。这样,操作十分不便。
发明内容
有鉴于此,本发明实施例提供一种内核模块编译、加载方法及装置,主要目的在于,能够便捷地使得内核模块可以调用所需的非导出符号。
为达到上述目的,本发明实施例主要提供如下技术方案:
第一方面,本发明实施例提供一种内核模块编译方法,所述方法包括:获得用于生成第一内核模块的源代码及其对应的编译指令;执行所述编译指令,对所述源代码进行编译,获得所述第一内核模块及其所调用的非导出符号的标识信息;获取在编译内核时所生成的内核符号表;基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;将所述非导出符号表添加到所述第一内核模块中。
第二方面,本发明实施例提供一种内核模块加载方法,所述方法包括:获得加载指令,其中,所述加载指令用于将添加有非导出符号表的第二内核模块加载到内核中;执行所述加载指令,通过所述第二内核模块中的非导出符号表,对所述第二内核模块所调用的非导出符号进行解析;如果通过所述非导出符号表对所述非导出符号解析成功,将所述第二内核模块加载到内核中。
第三方面,本发明实施例提供一种内核模块编译装置,所述装置包括:第一获得单元、第一执行单元、获取单元、生成单元以及添加单元,其中,所述第一获得单元,用于获得用于生成目标内核模块的源代码及其对应的编译指令;所述第一执行单元,用于执行所述编译指令,对所述源代码进行编译,获得所述目标内核模块及其所调用的非导出符号的标识信息;所述获取单元,用于获取在编译内核时所生成的内核符号表;所述生成单元,用于基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;所述添加单元,用于将所述非导出符号表添加到所述目标内核模块中。
第四方面,本发明实施例提供一种内核模块加载装置,所述装置包括:第二获得单元、第二执行单元以及加载单元,其中,所述第二获得单元,用于获得加载指令,其中,所述加载指令用于将添加有非导出符号表的目标内核模块加载到内核中;所述第二执行单元,用于执行所述加载指令,通过所述目标内核模块中的非导出符号表,对所述目标内核模块所调用的非导出符号进行解析;所述加载单元,用于如果通过所述非导出符号表对所述非导出符号解析成功,将所述目标内核模块加载到内核中。
第五方面,本发明实施例提供一种存储介质,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行上述方法。
第六方面,本发明实施例提供一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述方法。
本发明实施例提供的一种内核模块编译、加载方法及装置,在获得用于生成第一内核模块的源代码及其对应的编译指令之后,首先,执行编译指令,对源代码进行编译,获得第一内核模块及其所调用的非导出符号的标识信息,然后,获取在编译内核时所生成的内核符号表,并基于标识信息,从内核符号表中,导出非导出符号,并生成非导出符号表,最后,将非导出符号表添加到第一内核模块中。这样,由于是通过将内核模块所调用的非导出符号直接添加到内核模块中,来使得内核模块可以使用非导出符号的。这样,就不需要改动内核源码,也就不需要对内核重新进行编译,从而,能够便捷地使得内核模块调用所需的非导出符号。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例一中的内核模块编译方法的流程示意图;
图2示出了本发明实施例二中的内核模块加载方法的流程示意图;
图3-1示出了本发明实施例三中的第二内核模块的结构示意图;
图3-2示出了本发明实施例三中的内核模块加载方法的流程示意图;
图4示出了本发明实施例四中的内核模块编译装置的结构示意图;
图5示出了本发明实施例五中的内核模块加载装置的结构示意图;
图6示出了本发明实施例六中的内核模块编译设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。
实施例一
本发明实施例提供一种内核模块编译方法,该内核模块编译方法可以应用于在内核模块需要使用非导出符号时,编译出可加载到内核中的该内核模块。
下面首先对本发明实施例中所提到的技术名词做简要介绍。
(1)Linux内核;
Linux内核是一个Linux操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
(2)内核模块;
内核模块是具有独立功能的程序,它由加载/卸载函数、功能函数以及一系列声明组成,它可以被传入参数,也可以导出它的符号供其它内核模块使用。它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内核空间中运行。
Linux内核的整体结构已经非常庞大,而其包含的组件也非常多,一般情况下,为了控制内核大小,内核模块本身不被编译入内核映像,而是单独进行编译,但是在该内核模块的功能需要被使用的时候,其对应的二进制代码可以被动态地加载到内核中,内核模块一旦被加载到内核中后,内核模块就和内核中的其它部分是完全一样的。
(3)内核符号、导出符号和非导出符号;
内核符号也可以简称为符号,它是指内核源代码或者内核源代码中所使用的变量名(Variable Name)或函数名(Function Name)。Linux内核中将内核符号分为导出符号和非导出符号两种,每个内核模块只能调用导出符号,而不能调用非导出符号。
导出符号是指标记为EXPORT的内核符号,可以被内核模块使用;而非导出符号是指未标记为EXPORT的内核符号,不能被内核模块使用。
(4)内核符号表(Kernel Symbol Table)。
内核符号表是用于存储内核中所有内核符号及其对应地址的一个列表,是内核符号的索引文件。
下面对本发明实施例所提供的内核模块编译方法进行详细介绍。
图1为本发明实施例一中的内核模块编译方法的流程示意图,参见图1所示,该内核模块编译方法包括:
S101:获得用于生成第一内核模块的源代码及其对应的编译指令;
具体地,当需要通过第一内核模块的源代码编译出第一内核模块时,就可以通过内核中的编译模块来获取用于生成第一内核模块的源代码和用于编译该源代码的编译指令,这样,就获得了源代码和编译指令。
在实际应用中,编译是指编译源代码生成一个内核模块。第一内核模块的源代码是由开发人员通过操作系统,根据想要完成的功能来提前编写的。根据内核中原来是否存在第一内核模块,所获得的第一内核模块的源代码可以是原有的,也可以是新生成的,如重新开发生成的。
示例性地,假设第一内核模块的源代码存储在hello.c源文件中,该文件位于目录中,可以通过在hello.c所在目录hello中输入make命令来获取对应的源代码文件并自动生成编译指令。如,Make–C path/to/kernel_src_dir/SUBDIRS=/root/hello modules后,就可以获得源代码及其对应的编译指令。
S102:执行编译指令,对源代码进行编译,获得第一内核模块及其所调用的非导出符号的标识信息;
具体地,在获得了用于编译第一内核模块的源代码的编译指令后,就可以响应于该编译指令,对该源代码进行编译,如果该源代码中调用了非导出符号,在编译的过程中,就可以获得该第一内核模块所调用的非导出符号的标识信息,这样,在编译完成后,就可以获得第一内核模块及其所调用的非导出符号的标识信息。
在实际应用中,内核中的编译模块可以由GCC(GNU Compiler Collection,GNU编译器套件)编译器实现,也可以由PGI编译器实现,当然还可以由其它编译器,如PathScale编译器、Open64编译器等实现。这里,本发明实施例不做具体限定。
在实际应用中,获得第一内核模块是指对第一内核模块的源代码进行编译,所生成的二进制文件。
在具体实施过程中,为了获取第一内核模块所调用的非导出符号的标识信息,S102可以包括:对源代码进行编译,获取编译过程中生成的编译告警信息;对编译警告信息中每一条警告数据的警告原因进行分析,根据警告原因符合预设条件的警告数据,获取非导出符号对应的标识信息。
具体地,如果该源代码中调用了非导出符号,在编译的过程中,内核中的编译模块就会针对该非导出符号生成对应的编译警告信息,这样,在编译完成后,就可以获得编译过程中生成的编译告警信息。然后,就可以对编译警告信息中的每一条警告数据的警告原因进行分析,最后,可以根据警告原因符合预设条件的警告数据,来确定第一内核模块所调用的非导出符号对应的标识信息,以便确定出第一内核模块所调用的非导出符号有哪些。
在实际应用中,标识信息为能够唯一表征非导出符号的信息,可以为非导出符号的符号名称,也可以为非导出符号的地址,当然,还可以为其它信息,这里,本发明实施例不做具体限定。
在具体实施过程中,当内核的编译模块在编译源代码时发现有疑问的地方,就会针对所遇到的问题给出对应的警告原因,这样,就生成了编译警告(Warning)信息。在实际应用中,如果一个内核模块中使用到了另一个内核模块中定义的函数或者变量,但是该函数或者变量并未导出,那么在编译该模块的时候,必然会生成对应的编译警告信息。
示例性地,假设BytesRead为另一内核模块中定义的非导出符号,而第一内核模块中使用了BytesRead,这样,当内核中的编译模块对第一内核模块中的源代码进行编译时,就可以生成警告数据“Unkonwn symbol‘BytesRead’”,以提示在第一内核模块的源代码中发现了不能识别的非导出符号。那么,可以将预设条件设为警告原因的类型为“Unkonwnsymbol”,如果警告数据中包含“Unkonwn symbol”则表明该警告数据的警告原因符合预设条件。
在实际应用中,为了获得编译警告信息,可以通过利用函数或命令把相应的编译过程中的信息输出到console或文件内的方式来获得,如使用printk、STOCLINUX打印信息,也可以通过输入dmesg命令的方式获得,还可以通过cat/var/log/messages查看系统日志文件的方式来获得,当然,还可以通过其它方式来获得编译警告信息,如通过gdb、kdb、Linux Trace Toolkit等调试器来获得,这里,本发明实施例不做具体限定。
S103:获取在编译内核时所生成的内核符号表;
这里,为了提取出第一内核模块所调用的非导出符号,先要获取内核中存储的符号表全集,即在编译内核时所生成的内核符号表。
在具体实施过程中,Linux内核的内核符号表位于两个部分,一个是System.map,用于存储内核映像vmlinuz的符号表,另一部分/proc/kallsyms,用于存储内核模块的符号表。由于system.map存储有所有内核符号,是全集,包含各个内核模块的符号表,因此,在S103步骤中的获取内核符号表是指获取System.map。
示例性地,参见下表1所示,system.map中内核符号表的内容格式为:内存地址符号类型符号名称。
内存地址 | 符号类型 | 符号名称 |
c03441a0 | B | dmi_broken |
c03441a4 | B | is_sony_vaio_laptop |
c03441c0 | b | dmi_ident |
c0344200 | b | pci_bios_present |
c0344204 | b | pirq_table |
c0344208 | b | pirq_router |
c034420c | b | pirq_router_dev |
c0344220 | b | ascii_buffer |
c0344224 | b | ascii_buf_bytes |
表1
在表1中,B是指External zeroed data,b是指Local zeroed data。需要说明的是,根据符号类型还可以为其它标识,如T(External text)、t(Local text)、D(Externalinitialized data)、d(Local initialized data)等。其中,符号类型为小写字母则表示局部的,不可被外部引用的,符号类型为大写字母则表示全局的,可被外部引用的。
在实际应用中,编译内核时,System.map文件用于存放所有内核符号信息,随着每次内核的编译,在每次编译完内核后,就会对应产生一个新的System.map文件。当内核运行出错时,通过System.map中的内核符号表解析,就可以查到一个地址值对应的变量名或者函数名;当内核运行时,通过System.map中的内核符号表解析,就可以查到变量名或者函数名对应的一个地址值。
S104:基于标识信息,从内核符号表中,导出非导出符号,并生成非导出符号表;
具体地,在获得了第一内核模块所调用的非导出符号的标识信息和内核符号表后,就可以根据标识信息和内核符号表,来导出第一内核模块所需的非导出符号,并对应的非导出符号表。
在本发明其它实施例中,当采用符号名称来实现非导出符号的标识信息时,S104可以包括:当标识信息为符号名称时,在内核符号表中,查找符号名称;在查找到符号名称后,根据符号名称与内存地址的映射关系,从内核符号表中,获取内存地址;通过将符号名称和内存地址作为非导出符号表的数据项的方式,生成非导出符号表。
示例性地,假设通过编译警告信息所获得的标识信息为符号名称,如dmi_ident、pci_bios_present、pirq_table。首先,分别在如表1所示的内核符号表中查找每一个符号名称,然后,如果查找这些非导出符号的符号名称后,就可以根据符号名称与内存地址的映射关系,找到该非导出符号的符号名称对应的内存地址,最后,就可以将该非导出符号的符号名称和内存地址作为非导出符号表的数据项,来生成如下表2所示的非导出符号表。
内存地址 | 符号类型 | 符号名称 |
c03441c0 | b | dmi_ident |
c0344200 | b | pci_bios_present |
c0344204 | b | pirq_table |
表2
在实际应用中,内核符号表中会包含很多符号,为了能快速的找到所需要的非导出符号,可以二分法来查找,也可以使用重定向和grep来搜索,当然,还可以使用其它方法,这里,本发明实施例不做具体限定。
示例性地,使用命令语句#cat System.map|grep dmi_ident,可以实现采用grep来搜索dmi_ident。
S105:将非导出符号表添加到第一内核模块中。
在具体实施过程中,如果将内核符号表中所有的非导出符号都添加到第一内核模块中,一方面会产生内存消耗过大的问题,另一方面还会引发安全问题。因此,为了避免出现这些问题,又生成能够使用非导出符号的内核模块,可以将该内核模块,即第一内核模块所调用的少量的非导出符号所对应的非导出符号表添加到该内核模块中,这样,就获得了能够使用的非导出符号的新内核模块,即添加后的第一内核模块。
在本发明其它实施例中,S105可以包括:从第一内核模块中的数据模块中,获取原始符号表,其中,原始符号表为在添加非导出符号表前,第一内核模块中的数据模块中原有的符号表;按照预设数据结构,对非导出符号表和原始符号表进行处理,更新数据模块。
在实际应用中,每一个内核模块中会存在自己的数据模块,在该数据模块对应的地址空间里,为该内存模块存在一份符号表,该符号表为该内核模块原来能调用的符号的映射表。因此,这里的原始符号表中是指在添加非导出符号表之前,第一内核模块所能够调用的符号及其对应的内存地址的列表。
那么,在具体实施过程中,为了获得能够使用非导出符号的目标内核模块,在获得了非导出符号表后,就可以先从第一内核模块中的数据模块中获取原始符号表,然后,再通过预设数据结构,生成同时包含原始符号表和非导出符号表的新的数据模块,即更新后的数据模块,这样,就可以实现将第一内核模块中原来有的只包含原始符号表的数据模块更新为同时包含有非导出符号表和原始符号表的数据模块。
这里,预设数据结构可以为结构体,也可以为链表,当然还可以为其它能够同时包含原始数据表和非导出数据表的数据结构。
示例性地,当采用结构体来实现预设数据结构时,如下struct所示,新的数据结构等于原始符号表加上非导出符号表。
至此,便完成了编译内核模块的过程。
需要说明的是,在通过上述内核模块编译方法,获得了添加有非导出符号表的第一内核模块后,还可以通过下面实施例二或实施例三中所记载的内核模块加载方法,将添加有非导出符号表的第一内核模块加载到内核中。
由上述内容可知,本发明实施例所提供的内核模块编译方法,在获得用于生成第一内核模块的源代码及其对应的编译指令之后,首先,执行编译指令,对源代码进行编译,获得第一内核模块及其所调用的非导出符号的标识信息,然后,获取在编译内核时所生成的内核符号表,并基于标识信息,从内核符号表中,导出非导出符号,并生成非导出符号表,最后,将非导出符号表添加到第一内核模块中。这样,由于是通过将内核模块所调用的非导出符号直接添加到内核模块中,来使得内核模块可以使用非导出符号的。这样,就不需要改动内核源码,也就不需要对内核重新进行编译,从而,能够便捷地使得内核模块调用所需的非导出符号。此外,由于已经在内核模块中添加了非导出符号表,那么,将使用该方法生成的添加有非导出符号表的内核模块加载到内核时,内核就可以成功解析该内核模块使用的非导出符号,从而,能够将该内核模块成功加载到内核中。
实施例二
基于同一发明构思,本实施例提供一种内核模块加载方法,应用于以下场景:第二内核模块中添加有非导出符号表,在该第二内核模块调用非导出符号时,将该第二内核模块加载到内核中。
图2为本发明实施例二中的内核模块加载方法的流程示意图,参见图2所示,该内核模块加载方法包括:
S201:获得加载指令;
其中,加载指令用于将添加有非导出符号表的第二内核模块加载到内核中。
需要说明的是,添加有非导出符号表的第二内核模块可以是通过上述内核模块编译方法来生成的,也可以是通过其它方式生成的,这里,本发明实施例不做具体限定。如果添加有非导出符号表的第二内核模块可以是通过上述内核模块编译方法来生成的,那么,在S201之前,可以执行实施例一中的内核模块编译方法。
S202:执行加载指令,通过第二内核模块中的非导出符号表,对第二内核模块所调用的非导出符号进行解析;
如果在非导出符号表中,查找到非导出符号对应的内存地址,表明通过非导出符号表对非导出符号解析成功;否则,表明通过非导出符号表对非导出符号解析失败。
在本发明另一实施例中,当第二内核模块中的目标数据模块包括非导出符号表和原始符号表时,在S202之前,上述方法还包括:通过第二内核模块中的原始符号表对非导出符号进行解析,其中,原始符号表为在添加非导出符号表前,第二内核模块中的数据模块中原有的符号表;如果通过原始符号表对非导出符号解析失败,通过非导出符号表对非导出符号进行解析。
在具体实施过程中,第二内核模块中的目标数据模块中原本就包含原始符号表,该原始符号表不能解析非导出符号,这样,在给第二内核模块添加了非导出符号表后,第二内核模块中的目标数据模块就会同时包括非导出符号表和原始符号表。那么,在加载第二内核模块到内核中时,内核并不清楚第二内核模块所调用的符号是否为非导出符号,因此,为了解析出第二内核模块所调用的符号,首先会通过原始符号表对非导出符号进行解析,如果通过原始符号表对非导出符号解析失败,表明第二内核模块所调用的符号可能为非导出符号,此时,就需要通过非导出符号表对该非导出符号进行解析。
可见,由于第一内核模块中添加有非导出符号表,那么,当通过原始符号表对非导出符号解析失败时,就不用退出加载流程,而是执行S202,通过非导出符号表对非导出符号进行解析,如果通过非导出符号表对非导出符号也解析失败,再退出加载流程,进入符号异常处理流程。
S203:如果通过非导出符号表对非导出符号解析成功,将第二内核模块加载到内核中。
具体地,如果通过非导出符号表对非导出符号解析成功,就可以将第二内核模块加载到内核中。
在实际应用中,内核并不直接使用符号名称,它是通过符号的地址(指针)来使用符号的,而不是使用符号本身。例如,假设预先在内核的源代码中定义size_t BytesRead,其中,size_t为该变量的类型,size_t为该变量的变量名,并且该变量存储于c0343f20,那么,在内核运行时想要使用该变量时,不是直接使用变量名BytesRead,而是使用地址c0343f20来引用这个变量。
那么,在具体实施过程中,由于内核运行时,是通过符号的地址来是用符号的,从而,S202可以包括:如果通过非导出符号表对非导出符号解析成功,从非导出符号表中,获取非导出符号的内存地址;基于非导出符号的内存地址,将第二内核模块加载到内核中。
具体地,如果通过非导出符号表对非导出符号解析成功,就可以获取该非导出符号的内存地址,然后,基于该非导出符号的内存地址,将第二内核模块加载到内核中。
在实际应用中,为了获取非导出符号的内存地址,上述从非导出符号表中,获得非导出符号的内存地址的步骤可以包括:获取非导出符号的符号名称;在非导出符号表中,查找符号名称;如果查找到符号名称,从非导出符号表中,获取与符号名称对应的非导出符号的内存地址。
至此,便完成了内核模块的加载过程。
由上述内容可知,本发明实施例所提供的内核模块加载方法,由于已经在第二内核模块中添加了非导出符号表,那么,在获得加载指令后,内核就可以通过非导出符号表解析该第二内核模块使用的非导出符号,从而,能够将该第二内核模块成功加载到内核中。这样,就能够实现将调用非导出符号的第二内核模块加载到内核中。
实施例三
基于同一发明构思,本发明实施例提供一种内核模块加载方法,应用于以下场景:参见图3-1所示,第二内核模块30中的数据模块包括非导出符号表301和原始符号表302,在该第二内核模块调用任意符号时,将该内核模块加载到内核中。其中,任意符号可以为非导出符号,也可以为导出符号。
图3-2为本发明实施例三中的内核模块加载方法的流程示意图,参见图3-2所示,该内核模块加载方法包括:
S301:获得加载指令;
其中,加载指令用于将添加有非导出符号表的第二内核模块加载到内核中。
S302:执行加载指令,通过第二内核模块中的原始符号表对第二内核模块所调用的目标符号进行解析;
如果通过原始符号表对目标符号解析失败,表明该目标符号可能是非导出符号,执行S303;如果通过原始符号表对目标符号解析成功,表明该目标符号为导出符号,就可以执行S304A和S305。
S303:通过第二内核模块中的非导出符号表对第二内核模块所调用的目标符号进行解析;
如果通过非导出符号表对非导出符号解析成功,执行S304B和S305。
S304A:从原始符号表中,获取目标符号的内存地址;
S304B:从非导出符号表中,获取目标符号的内存地址;
S305:基于目标符号的内存地址,将第二内核模块加载到内核中。
由上述内容可知,本发明实施例所提供的内核模块加载方法,在第二内核模块调用任意符号时,先通过原始符号表对该任意符号进行解析,如果解析失败,再通过非导出符号表对该任意符号进行解析,这样,就能够保证无论第二内核模块调用导出符号还是非导出符号,都能够加载到内核中。
实施例四
基于同一发明构思,作为对上述内核模块编译方法的实现,本发明实施例提供了一种内核模块编译装置,该装置实施例与前述方法实施例对应,为便于阅读,本装置实施例不再对前述方法实施例中的细节内容进行逐一赘述,但应当明确,本实施例中的装置能够对应实现前述方法实施例中的全部内容。
图4为本发明实施例四中的内核模块编译装置的结构示意图,参见图4所示,该内核模块编译装置40包括:第一获得单元401、第一执行单元402、获取单元403、生成单元404以及添加单元405,其中,第一获得单元401,用于获得用于生成目标内核模块的源代码及其对应的编译指令;第一执行单元402,用于执行编译指令,对源代码进行编译,获得目标内核模块及其所调用的非导出符号的标识信息;获取单元403,用于获取在编译内核时所生成的内核符号表;生成单元404,用于基于标识信息,从内核符号表中,导出非导出符号,并生成非导出符号表;添加单元405,用于将非导出符号表添加到目标内核模块中。
在本发明实施例中,添加单元,用于从第一内核模块中的数据模块中,获取原始符号表,其中,原始符号表为在添加非导出符号表前,第一内核模块中的数据模块中原有的符号表;按照预设数据结构,对非导出符号表和原始符号表进行处理,更新数据模块。
在本发明实施例中,执行单元,用于对源代码进行编译,获取编译过程中生成的编译告警信息;对编译警告信息中每一条警告数据的警告原因进行分析,根据警告原因符合预设条件的警告数据,获取非导出符号对应的标识信息。
在本发明其它实施例中,上述内核模块编译装置还包括执行加载单元,用于获得加载指令,其中,加载指令用于将添加非导出符号表后的第一内核模块加载到内核中;执行加载指令,通过非导出符号表,对非导出符号进行解析;如果通过非导出符号表对非导出符号解析成功,将添加非导出符号表后的第一内核模块加载到内核中。
上述内核模块编译装置包括处理器和存储器,上述第一获得单元、第一执行单元、获取单元、生成单元以及添加单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。
上述处理器可由中央处理器(Central Processing Unit,CPU)、微处理器(MicroProcessor Unit,MPU)、数字信号处理器(Digital Signal Processor,DSP)、或现场可编程门阵列(Field Programmable Gate Array,FPGA)等实现。
存储器可能包括计算机可读介质中的非永久性存储器,随机存储器
(Random Access Memory,RAM)和/或非易失性内存等形式,如只读存储器(ReadOnly Memory,ROM)或闪存(Flash RAM),存储器包括至少一个存储芯片。
基于同一发明构思,本发明实施例提供一种存储介质,其上存储有程序,该程序被处理器执行时实现上述内核模块编译方法。
基于同一发明构思,本发明实施例提供一种处理器,处理器用于运行程序,其中,程序运行时执行上述内核模块编译方法。
在实际应用中,该内核模块编译装置可应用于终端中。终端可以以各种形式来实施。例如,本发明中描述的终端可以包括诸如平板电脑、笔记本电脑、掌上电脑等移动终端,以及诸如数字TV、台式计算机、服务器等固定终端。
实施例五
基于同一发明构思,作为对上述内核模块加载方法的实现,本发明实施例提供了一种内核模块加载装置,该装置实施例与前述方法实施例对应,为便于阅读,本装置实施例不再对前述方法实施例中的细节内容进行逐一赘述,但应当明确,本实施例中的装置能够对应实现前述方法实施例中的全部内容。
图5为本发明实施例五中的内核模块加载装置的结构示意图,参见图5所示,该内核模块加载装置50包括:第二获得单元501、第二执行单元502以及加载单元503,其中,第二获得单元501,用于获得加载指令,其中,加载指令用于将添加有非导出符号表的目标内核模块加载到内核中;第二执行单元502,用于执行加载指令,通过目标内核模块中的非导出符号表,对目标内核模块所调用的非导出符号进行解析;加载单元503,用于如果通过非导出符号表对非导出符号解析成功,将目标内核模块加载到内核中。
在本发明实施例中,执行单元,用于通过第二内核模块中的原始符号表对非导出符号进行解析,其中,原始符号表为在添加非导出符号表前,第二内核模块中的数据模块中原有的符号表;如果通过原始符号表对非导出符号解析失败,通过非导出符号表对非导出符号进行解析。
上述内核模块加载装置包括处理器和存储器,上述获得单元、执行单元以及加载单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。
上述处理器可由CPU、MPU、DSP或FPGA等实现。
存储器可能包括计算机可读介质中的非永久性存储器,RAM和/或非易失性内存等形式,如ROM或Flash RAM,存储器包括至少一个存储芯片。
基于同一发明构思,本发明实施例提供一种存储介质,其上存储有程序,该程序被处理器执行时实现上述内核模块加载方法。
基于同一发明构思,本发明实施例提供一种处理器,处理器用于运行程序,其中,程序运行时执行上述内核模块加载方法。
在实际应用中,该内核模块加载装置可应用于终端中。终端可以以各种形式来实施。例如,本发明中描述的终端可以包括诸如平板电脑、笔记本电脑、掌上电脑等移动终端,以及诸如数字TV、台式计算机、服务器等固定终端。
实施例六
基于同一发明构思,本发明实施例提供一种内核模块编译设备。图6为本发明实施例六中的内核模块编译设备的结构示意图,参见图6所示,该内核模块编译设备60包括:存储器601、处理器602以及存储在存储器601上并可在处理器602上运行的计算机程序603,处理器执行程序603时实现以下步骤:获得用于生成第一内核模块的源代码及其对应的编译指令;执行编译指令,对源代码进行编译,获得第一内核模块及其所调用的非导出符号的标识信息;获取在编译内核时所生成的内核符号表;基于标识信息,从内核符号表中,导出非导出符号,并生成非导出符号表;将非导出符号表添加到第一内核模块中。
在本发明实施例中,上述处理器执行程序时还可实现以下步骤:从第一内核模块中的数据模块中,获取原始符号表,其中,原始符号表为在添加非导出符号表前,第一内核模块中的数据模块中原有的符号表;按照预设数据结构,对非导出符号表和原始符号表进行处理,更新数据模块。
在本发明实施例中,上述处理器执行程序时还可实现以下步骤:对源代码进行编译,获取编译过程中生成的编译告警信息;对编译警告信息中每一条警告数据的警告原因进行分析,根据警告原因符合预设条件的警告数据,获取非导出符号对应的标识信息。
实施例七
基于同一发明构思,本发明实施例提供一种内核模块加载设备。该内核模块加载设备包括:存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时实现以下步骤:获得加载指令,其中,加载指令用于将添加有非导出符号表的第二内核模块加载到内核中;执行加载指令,通过第二内核模块中的非导出符号表,对第二内核模块所调用的非导出符号进行解析;如果通过非导出符号表对非导出符号解析成功,将第二内核模块加载到内核中。
在本发明实施例中,上述处理器执行程序时还可实现以下步骤:通过第二内核模块中的原始符号表对非导出符号进行解析,其中,原始符号表为在添加非导出符号表前,第二内核模块中的数据模块中原有的符号表;如果通过原始符号表对非导出符号解析失败,通过非导出符号表对非导出符号进行解析。
本发明实施例还提供了如下方案:
A1、一种内核模块编译方法,所述方法包括:
获得用于生成第一内核模块的源代码及其对应的编译指令;
执行所述编译指令,对所述源代码进行编译,获得所述第一内核模块及其所调用的非导出符号的标识信息;
获取在编译内核时所生成的内核符号表;
基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;
将所述非导出符号表添加到所述第一内核模块中。
A2、根据A1所述的方法,所述将所述非导出符号表添加到所述第一内核模块中,包括:
从所述第一内核模块中的数据模块中,获取原始符号表,其中,所述原始符号表为在添加所述非导出符号表前,所述第一内核模块中的数据模块中原有的符号表;
按照预设数据结构,对所述非导出符号表和所述原始符号表进行处理,更新所述数据模块。
A3、根据A1或A2所述的方法,对所述源代码进行编译,获得所述第一内核模块所调用的非导出符号的标识信息,包括:
对所述源代码进行编译,获取编译过程中生成的编译告警信息;
对所述编译警告信息中每一条警告数据的警告原因进行分析,根据警告原因符合预设条件的警告数据,获取所述非导出符号对应的标识信息。
A4、根据A3所述的方法,所述基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成所述非导出符号表,包括:
当所述标识信息为符号名称时,在所述内核符号表中,查找所述符号名称;
在查找到所述符号名称后,根据所述符号名称与所述内存地址的映射关系,从所述内核符号表中,获取所述内存地址;
通过将所述符号名称和所述内存地址作为所述非导出符号表的数据项的方式,生成所述非导出符号表。
A5、根据A1的方法,在所述将所述非导出符号表添加到所述第一内核模块中之后,所述方法还包括:
获得加载指令,其中,所述加载指令用于将添加所述非导出符号表后的第一内核模块加载到内核中;
执行所述加载指令,通过所述非导出符号表,对所述非导出符号进行解析;
如果通过所述非导出符号表对所述非导出符号解析成功,将所述添加所述非导出符号表后的第一内核模块加载到内核中。
A6、根据A5所述的方法,通过所述非导出符号表,对所述非导出符号进行解析,包括:
通过所述第一内核模块中的原始符号表对所述非导出符号进行解析,其中,所述原始符号表为在添加所述非导出符号表前,所述第一内核模块中的数据模块中原有的符号表;
如果通过所述原始符号表对所述非导出符号解析失败,通过所述非导出符号表对所述非导出符号进行解析。
A7、根据A5所述的方法,所述如果通过所述非导出符号表对所述非导出符号解析成功,将所述第一内核模块加载到内核中,包括:
如果通过所述非导出符号表对所述非导出符号解析成功,从所述非导出符号表中,获取所述非导出符号的内存地址;
基于所述非导出符号的内存地址,将所述第一内核模块加载到内核中。
A8、根据A7所述的方法,所述从所述非导出符号表中,获取所述非导出符号的内存地址,包括:
获取非导出符号的符号名称;
在所述非导出符号表中,查找所述符号名称;
如果查找到所述符号名称,从所述非导出符号表中,获取与所述符号名称对应的非导出符号的内存地址。
B9、一种内核模块加载方法,所述方法包括:
获得加载指令,其中,所述加载指令用于将添加有非导出符号表的第二内核模块加载到内核中;
执行所述加载指令,通过所述第二内核模块中的非导出符号表,对所述第二内核模块所调用的非导出符号进行解析;
如果通过所述非导出符号表对所述非导出符号解析成功,将所述第二内核模块加载到内核中。
B10、根据B9所述的方法,通过所述第二内核模块中的非导出符号表,对所述第二内核模块所调用的非导出符号进行解析,包括:
通过所述第二内核模块中的原始符号表对所述非导出符号进行解析,其中,所述原始符号表为在添加所述非导出符号表前,所述第二内核模块中的数据模块中原有的符号表;
如果通过所述原始符号表对所述非导出符号解析失败,通过所述非导出符号表对所述非导出符号进行解析。
B11、根据B9所述的方法,所述如果通过所述非导出符号表对所述非导出符号解析成功,将所述第二内核模块加载到内核中,包括:
如果通过所述非导出符号表对所述非导出符号解析成功,从所述非导出符号表中,获取所述非导出符号的内存地址;
基于所述非导出符号的内存地址,将所述第二内核模块加载到内核中。
B12、根据B11所述的方法,所述从所述非导出符号表中,获取所述非导出符号的内存地址,包括:
获取非导出符号的符号名称;
在所述非导出符号表中,查找所述符号名称;
如果查找到所述符号名称,从所述非导出符号表中,获取与所述符号名称对应的非导出符号的内存地址。
C13、一种内核模块编译装置,所述装置包括:第一获得单元、第一执行单元、获取单元、生成单元以及添加单元,其中,
所述第一获得单元,用于获得用于生成目标内核模块的源代码及其对应的编译指令;
所述第一执行单元,用于执行所述编译指令,对所述源代码进行编译,获得所述目标内核模块及其所调用的非导出符号的标识信息;
所述获取单元,用于获取在编译内核时所生成的内核符号表;
所述生成单元,用于基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;
所述添加单元,用于将所述非导出符号表添加到所述目标内核模块中。
C14、根据C13所述的装置,所述添加单元,用于从所述第一内核模块中的数据模块中,获取原始符号表,其中,所述原始符号表为在添加所述非导出符号表前,所述第一内核模块中的数据模块中原有的符号表;按照预设数据结构,对所述非导出符号表和所述原始符号表进行处理,更新所述数据模块。
C15、根据C13或C14所述的装置,所述第一执行单元,用于对所述源代码进行编译,获取编译过程中生成的编译告警信息;对所述编译警告信息中每一条警告数据的警告原因进行分析,根据警告原因符合预设条件的警告数据,获取所述非导出符号对应的标识信息。
C16、根据C15所述的装置,所述生成单元,用于当所述标识信息为符号名称时,在所述内核符号表中,查找所述符号名称;在查找到所述符号名称后,根据所述符号名称与所述内存地址的映射关系,从所述内核符号表中,获取所述内存地址;通过将所述符号名称和所述内存地址作为所述非导出符号表的数据项的方式,生成所述非导出符号表。
C17、根据C13所述的装置,所述装置还包括:执行加载单元,用于获得加载指令,其中,所述加载指令用于将添加所述非导出符号表后的第一内核模块加载到内核中;执行所述加载指令,通过所述非导出符号表,对所述非导出符号进行解析;如果通过所述非导出符号表对所述非导出符号解析成功,将所述添加所述非导出符号表后的第一内核模块加载到内核中。
C18、根据C17所述的装置,所述执行加载单元,用于通过所述第一内核模块中的原始符号表对所述非导出符号进行解析,其中,所述原始符号表为在添加所述非导出符号表前,所述第一内核模块中的数据模块中原有的符号表;如果通过所述原始符号表对所述非导出符号解析失败,通过所述非导出符号表对所述非导出符号进行解析。
C19、根据C17所述的装置,所述执行加载单元,用于如果通过所述非导出符号表对所述非导出符号解析成功,从所述非导出符号表中,获取所述非导出符号的内存地址;基于所述非导出符号的内存地址,将所述第一内核模块加载到内核中。
C20、根据C19所述的装置,所述执行加载单元,用于获取非导出符号的符号名称;在所述非导出符号表中,查找所述符号名称;如果查找到所述符号名称,从所述非导出符号表中,获取与所述符号名称对应的非导出符号的内存地址。
D21、一种内核模块加载装置,所述装置包括:第二获得单元、第二执行单元以及加载单元,其中,
所述第二获得单元,用于获得加载指令,其中,所述加载指令用于将添加有非导出符号表的目标内核模块加载到内核中;
所述第二执行单元,用于执行所述加载指令,通过所述目标内核模块中的非导出符号表,对所述目标内核模块所调用的非导出符号进行解析;
所述加载单元,用于如果通过所述非导出符号表对所述非导出符号解析成功,将所述目标内核模块加载到内核中。
D22、根据D21所述的装置,所述第二执行单元,用于通过所述第二内核模块中的原始符号表对所述非导出符号进行解析,其中,所述原始符号表为在添加所述非导出符号表前,所述第二内核模块中的数据模块中原有的符号表;如果通过所述原始符号表对所述非导出符号解析失败,通过所述非导出符号表对所述非导出符号进行解析。
D23、根据D21所述的装置,所述加载单元,用于如果通过所述非导出符号表对所述非导出符号解析成功,从所述非导出符号表中,获取所述非导出符号的内存地址;基于所述非导出符号的内存地址,将所述第二内核模块加载到内核中。
D24、根据D23所述的装置,所述加载单元,获取非导出符号的符号名称;在所述非导出符号表中,查找所述符号名称;如果查找到所述符号名称,从所述非导出符号表中,获取与所述符号名称对应的非导出符号的内存地址。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、只读光盘(Compact Disc Read-Only Memory,CD-ROM)、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
存储器可能包括计算机可读介质中的非永久性存储器,RAM和/或非易失性内存等形式,如ROM或Flash RAM。存储器是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机可读存储介质可以是ROM、可编程只读存储器(Programmable Read-Only Memory,PROM)、可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,EPROM)、电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、磁性随机存取存储器(Ferromagnetic Random Access Memory,FRAM)、快闪存储器(Flash Memory)、磁表面存储器、光盘、或只读光盘(Compact Disc Read-Only Memory,CD-ROM)等存储器;也可以是快闪记忆体或其他内存技术、CD-ROM、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息;还可以是包括上述存储器之一或任意组合的各种电子设备,如移动电话、计算机、平板设备、个人数字助理等。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。
Claims (10)
1.一种内核模块编译方法,其特征在于,所述方法包括:
获得用于生成第一内核模块的源代码及其对应的编译指令;
执行所述编译指令,对所述源代码进行编译,获得所述第一内核模块及其所调用的非导出符号的标识信息;
获取在编译内核时所生成的内核符号表;
基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;
将所述非导出符号表添加到所述第一内核模块中。
2.根据权利要求1所述的方法,其特征在于,所述将所述非导出符号表添加到所述第一内核模块中,包括:
从所述第一内核模块中的数据模块中,获取原始符号表,其中,所述原始符号表为在添加所述非导出符号表前,所述第一内核模块中的数据模块中原有的符号表;
按照预设数据结构,对所述非导出符号表和所述原始符号表进行处理,更新所述数据模块。
3.根据权利要求1或2所述的方法,其特征在于,对所述源代码进行编译,获得所述第一内核模块所调用的非导出符号的标识信息,包括:
对所述源代码进行编译,获取编译过程中生成的编译告警信息;
对所述编译警告信息中每一条警告数据的警告原因进行分析,根据警告原因符合预设条件的警告数据,获取所述非导出符号对应的标识信息。
4.根据权利要求1所述的方法,其特征在于,在所述将所述非导出符号表添加到所述第一内核模块中之后,所述方法还包括:
获得加载指令,其中,所述加载指令用于将添加所述非导出符号表后的第一内核模块加载到内核中;
执行所述加载指令,通过所述非导出符号表,对所述非导出符号进行解析;
如果通过所述非导出符号表对所述非导出符号解析成功,将所述添加所述非导出符号表后的第一内核模块加载到内核中。
5.一种内核模块加载方法,其特征在于,所述方法包括:
获得加载指令,其中,所述加载指令用于将添加有非导出符号表的第二内核模块加载到内核中;
执行所述加载指令,通过所述第二内核模块中的非导出符号表,对所述第二内核模块所调用的非导出符号进行解析;
如果通过所述非导出符号表对所述非导出符号解析成功,将所述第二内核模块加载到内核中。
6.根据权利要求5所述的方法,其特征在于,通过所述第二内核模块中的非导出符号表,对所述第二内核模块所调用的非导出符号进行解析,包括:
通过所述第二内核模块中的原始符号表对所述非导出符号进行解析,其中,所述原始符号表为在添加所述非导出符号表前,所述第二内核模块中的数据模块中原有的符号表;
如果通过所述原始符号表对所述非导出符号解析失败,通过所述非导出符号表对所述非导出符号进行解析。
7.一种内核模块编译装置,其特征在于,所述装置包括:第一获得单元、第一执行单元、获取单元、生成单元以及添加单元,其中,
所述第一获得单元,用于获得用于生成目标内核模块的源代码及其对应的编译指令;
所述第一执行单元,用于执行所述编译指令,对所述源代码进行编译,获得所述目标内核模块及其所调用的非导出符号的标识信息;
所述获取单元,用于获取在编译内核时所生成的内核符号表;
所述生成单元,用于基于所述标识信息,从所述内核符号表中,导出所述非导出符号,并生成非导出符号表;
所述添加单元,用于将所述非导出符号表添加到所述目标内核模块中。
8.一种内核模块加载装置,其特征在于,所述装置包括:第二获得单元、第二执行单元以及加载单元,其中,
所述第二获得单元,用于获得加载指令,其中,所述加载指令用于将添加有非导出符号表的目标内核模块加载到内核中;
所述第二执行单元,用于执行所述加载指令,通过所述目标内核模块中的非导出符号表,对所述目标内核模块所调用的非导出符号进行解析;
所述加载单元,用于如果通过所述非导出符号表对所述非导出符号解析成功,将所述目标内核模块加载到内核中。
9.一种存储介质,其特征在于,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行如权利要求1至6任一项所述的方法。
10.一种处理器,其特征在于,所述处理器用于运行程序,其中,所述程序运行时执行如权利要求1至6任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711311770.8A CN108052327A (zh) | 2017-12-11 | 2017-12-11 | 一种内核模块编译、加载方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711311770.8A CN108052327A (zh) | 2017-12-11 | 2017-12-11 | 一种内核模块编译、加载方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108052327A true CN108052327A (zh) | 2018-05-18 |
Family
ID=62124067
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711311770.8A Pending CN108052327A (zh) | 2017-12-11 | 2017-12-11 | 一种内核模块编译、加载方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108052327A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111475196A (zh) * | 2020-03-30 | 2020-07-31 | 杭州迪普信息技术有限公司 | 编译告警溯源方法、装置、电子设备及计算机可读介质 |
CN111506491A (zh) * | 2019-01-31 | 2020-08-07 | 阿里巴巴集团控股有限公司 | 信息处理方法及装置、存储介质和处理器 |
CN113778451A (zh) * | 2020-11-17 | 2021-12-10 | 北京沃东天骏信息技术有限公司 | 文件加载方法、装置、计算机系统和计算机可读存储介质 |
CN114691220A (zh) * | 2020-12-30 | 2022-07-01 | 网神信息技术(北京)股份有限公司 | 保护进程的方法、装置、电子设备、介质和程序产品 |
US11385923B2 (en) | 2019-07-16 | 2022-07-12 | International Business Machines Corporation | Container-based virtualization system extending kernel functionality using kernel modules compiled by a compiling container and loaded by an application container |
CN116661779A (zh) * | 2023-07-26 | 2023-08-29 | 北京麟卓信息科技有限公司 | 一种基于符号动态重定向的多编译器混合链接方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1650264A (zh) * | 2002-04-17 | 2005-08-03 | 计算机联合思想公司 | 用于修改一个内核模块以便在多个内核版本上运行的设备和方法 |
CN101114940A (zh) * | 2007-06-26 | 2008-01-30 | 中兴通讯股份有限公司 | 实现模块逻辑化的方法 |
CN101281488A (zh) * | 2007-04-06 | 2008-10-08 | 上海宇梦通信科技有限公司 | Linux操作系统的内核调试方法 |
US20150033227A1 (en) * | 2012-03-05 | 2015-01-29 | The Board Of Regents, The University Of Texas System | Automatically bridging the semantic gap in machine introspection |
CN104376126A (zh) * | 2014-12-11 | 2015-02-25 | 北京奇虎科技有限公司 | 在Linux驱动中绑定内核符号的方法及装置 |
CN105354498A (zh) * | 2015-10-30 | 2016-02-24 | 珠海市君天电子科技有限公司 | 一种注册表的操作方法和相关装置及设备 |
-
2017
- 2017-12-11 CN CN201711311770.8A patent/CN108052327A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1650264A (zh) * | 2002-04-17 | 2005-08-03 | 计算机联合思想公司 | 用于修改一个内核模块以便在多个内核版本上运行的设备和方法 |
CN101281488A (zh) * | 2007-04-06 | 2008-10-08 | 上海宇梦通信科技有限公司 | Linux操作系统的内核调试方法 |
CN101114940A (zh) * | 2007-06-26 | 2008-01-30 | 中兴通讯股份有限公司 | 实现模块逻辑化的方法 |
US20150033227A1 (en) * | 2012-03-05 | 2015-01-29 | The Board Of Regents, The University Of Texas System | Automatically bridging the semantic gap in machine introspection |
CN104376126A (zh) * | 2014-12-11 | 2015-02-25 | 北京奇虎科技有限公司 | 在Linux驱动中绑定内核符号的方法及装置 |
CN105354498A (zh) * | 2015-10-30 | 2016-02-24 | 珠海市君天电子科技有限公司 | 一种注册表的操作方法和相关装置及设备 |
Non-Patent Citations (2)
Title |
---|
RTFSC_: ""如何调用Linux内核没有导出的函数"", 《HTTPS://BLOG.CSDN.NET/U011673554/ARTICLE/DETAILS/48520241》 * |
UESTC-LEON: ""如何调用内核未导出的函数"", 《HTTPS://BLOG.CSDN.NET/WEIXIN_36145588/ARTICLE/DETAILS/72860088》 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111506491A (zh) * | 2019-01-31 | 2020-08-07 | 阿里巴巴集团控股有限公司 | 信息处理方法及装置、存储介质和处理器 |
CN111506491B (zh) * | 2019-01-31 | 2023-05-02 | 阿里巴巴集团控股有限公司 | 信息处理方法及装置、存储介质和处理器 |
US11385923B2 (en) | 2019-07-16 | 2022-07-12 | International Business Machines Corporation | Container-based virtualization system extending kernel functionality using kernel modules compiled by a compiling container and loaded by an application container |
CN111475196A (zh) * | 2020-03-30 | 2020-07-31 | 杭州迪普信息技术有限公司 | 编译告警溯源方法、装置、电子设备及计算机可读介质 |
CN111475196B (zh) * | 2020-03-30 | 2023-12-12 | 杭州迪普信息技术有限公司 | 编译告警溯源方法、装置、电子设备及计算机可读介质 |
CN113778451A (zh) * | 2020-11-17 | 2021-12-10 | 北京沃东天骏信息技术有限公司 | 文件加载方法、装置、计算机系统和计算机可读存储介质 |
CN114691220A (zh) * | 2020-12-30 | 2022-07-01 | 网神信息技术(北京)股份有限公司 | 保护进程的方法、装置、电子设备、介质和程序产品 |
CN116661779A (zh) * | 2023-07-26 | 2023-08-29 | 北京麟卓信息科技有限公司 | 一种基于符号动态重定向的多编译器混合链接方法 |
CN116661779B (zh) * | 2023-07-26 | 2023-09-19 | 北京麟卓信息科技有限公司 | 一种基于符号动态重定向的多编译器混合链接方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108052327A (zh) | 一种内核模块编译、加载方法及装置 | |
Molnar et al. | Dynamic Test Generation to Find Integer Bugs in x86 Binary Linux Programs. | |
Nakandala et al. | A tensor compiler for unified machine learning prediction serving | |
US8627303B2 (en) | Memory optimization of virtual machine code by partitioning extraneous information | |
US8832125B2 (en) | Extensible event-driven log analysis framework | |
US8972960B2 (en) | Optimization of an application to reduce local memory usage | |
US8458681B1 (en) | Method and system for optimizing the object code of a program | |
CN109564540B (zh) | 用于jit编译器的调试的系统、方法和设备 | |
CN104346274B (zh) | 程序调试器及一种程序的调试方法 | |
US20130111451A1 (en) | Program Log Record Optimization | |
CN107992307A (zh) | 一种函数编译方法及装置 | |
US8429632B1 (en) | Method and system for debugging merged functions within a program | |
CN104572463A (zh) | 测试接口信息的方法及装置 | |
CN111176717B (zh) | 生成安装包的方法、装置及电子设备 | |
CN108595187A (zh) | 安卓安装包集成软件开发工具包的法、装置及存储介质 | |
US20140245067A1 (en) | Using linked data to determine package quality | |
CN111209298A (zh) | 查询数据库数据的方法、装置、设备和存储介质 | |
JP2017174418A (ja) | モデルチェックのためのデータ構造抽象化 | |
CN116028028A (zh) | 请求函数生成方法、装置、设备及存储介质 | |
US9116714B2 (en) | Methods and systems for file processing | |
CN111159301A (zh) | 一种基于智能合约的数据创建方法、装置、设备及存储介质 | |
Loseto et al. | Linked Data (in low-resource) Platforms: a mapping for Constrained Application Protocol | |
WO2023197851A9 (zh) | 异常组件的识别方法、装置、设备、存储介质及程序产品 | |
CN112953721B (zh) | 一种ipa文件的解析方法、装置、设备及存储介质 | |
US20190317877A1 (en) | Application state monitoring |
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: 20180518 |
|
RJ01 | Rejection of invention patent application after publication |