CN117149499B - 一种基于动态符号表的内核模块内存占用优化方法 - Google Patents
一种基于动态符号表的内核模块内存占用优化方法 Download PDFInfo
- Publication number
- CN117149499B CN117149499B CN202311415112.9A CN202311415112A CN117149499B CN 117149499 B CN117149499 B CN 117149499B CN 202311415112 A CN202311415112 A CN 202311415112A CN 117149499 B CN117149499 B CN 117149499B
- Authority
- CN
- China
- Prior art keywords
- symbol
- kernel
- kernel module
- symbol table
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 23
- 238000005457 optimization Methods 0.000 title claims abstract description 8
- 230000002159 abnormal effect Effects 0.000 claims abstract description 28
- 230000006870 function Effects 0.000 claims description 15
- 230000005856 abnormality Effects 0.000 claims description 13
- 238000010561 standard procedure Methods 0.000 claims description 4
- 230000007246 mechanism Effects 0.000 abstract description 4
- 230000008569 process Effects 0.000 description 3
- 238000004883 computer application Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/0703—Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
- G06F11/0706—Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
- G06F11/073—Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in a memory management context, e.g. virtual memory or cache management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/06—Addressing a physical block of locations, e.g. base addressing, module addressing, memory dedication
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于动态符号表的内核模块内存占用优化方法,通过修改内核模块的符号表加载机制,在系统启动加载内核时仅将内核模块声明导出的符号加载到全局符号表中,当系统启动加载异常时根据异常地址在当前内核内存中或内核模块中查找到加载异常的符号,将异常地址转换为其所在内核模块的偏移地址,根据偏移地址按需完成符号的加载,实现较低内存占用的系统启动,有效提升了系统启动时的性能。
Description
技术领域
本发明属于计算机应用开发技术领域,具体涉及一种基于动态符号表的内核模块内存占用优化方法。
背景技术
Linux内核模块通常被编译为独立的.ko文件,当其加载到内存后一般仅占用几兆空间,然而对于总内存只有几十兆的嵌入式Linux系统而言能否精简内核模块加载所占的空间就变得尤为重要。通常情况下,将内核模块加载到内存的过程中,其自带的符号表并非必须完全加载,其中既有必要的导出符号也有仅供调试用的符号,这些仅供调试用的符号绝大部分时候是不被实际使用的,一般仅在内核模块崩溃需要生成调用栈时才需要使用,因此现有的内核模块加载过程导出了过多的符号造成了内存空间的浪费,降低了系统性能。
发明内容
有鉴于此,本发明提供了一种基于动态符号表的内核模块内存占用优化方法,实现了较低内存占用的系统启动。
本发明提供的一种基于动态符号表的内核模块内存占用优化方法,包括以下步骤:
步骤1、当系统启动加载内核时,遍历内核模块,解析内核模块获取其符号表及该符号表所对应的索引节点,将已被内核模块标记为需导出的符号加载到全局符号表中,并为加载的符号分配内存;
步骤2、根据所述索引节点获取所有内核模块ELF文件中的符号表对应的磁盘块指针;
步骤3、当产生异常时,获取当前异常相关的内存地址记为异常地址,若异常地址存在于当前内核内存中则获取异常地址对应的符号作为目标符号,执行步骤5;若异常地址未存在于当前内核内存中则遍历所有内核模块,找到包含异常地址的内核地址范围所对应的内核模块,将该内核模块记为目标内核模块,执行步骤4;
步骤4、将异常地址转换为目标内核模块内的偏移地址,根据步骤2获取的目标内核模块的磁盘块指针找到其符号表所在磁盘块作为目标磁盘块,读取目标磁盘块中的数据,逐个解析符号直到找到与异常地址对应的符号,将其作为目标符号;
步骤5、加载目标符号,完成系统的启动,结束本流程。
进一步地,所述步骤1还包括:
步骤1.1、调用内核标准方法读取内核模块的模块文件,遍历模块文件,逐个解析符号表中的每个符号,查找是否存在由EXPORT_SYMBOL或EXPORT_SYMBOL_GPL标记的符号,若存在则执行步骤1.2,否则执行步骤1.3;
步骤1.2、解析EXPORT_SYMBOL或EXPORT_SYMBOL_GPL所标记符号的文件内地址,将这些符号加载到全局符号表中;
步骤1.3、遍历模块文件,逐个解析符号表中的每个符号,若符号具有外部可见属性则将其加载到全局符号表中,否则不加载该符号。
进一步地,所述步骤1中所述为加载的符号分配内存的方式为:采用Slab分配器或Slob分配器为加载的符号分配内存。
进一步地,所述步骤3中所述异常为:系统启动异常、加载内核模块失败或应用启动异常。
进一步地,所述步骤1中还包括:采用insmod、rmmod及lsmod命令动态地加载、卸载及查看内核模块。
进一步地,所述步骤1的实现方式为:采用修改Linux系统内insmod函数的符号表加载部分实现。
有益效果
本发明通过修改内核模块的符号表加载机制,在系统启动加载内核时仅将内核模块声明导出的符号加载到全局符号表中,当系统启动加载异常时根据异常地址在当前内核内存中或内核模块中查找到加载异常的符号,将异常地址转换为其所在内核模块的偏移地址,根据偏移地址按需完成符号的加载,实现较低内存占用的系统启动,有效提升了系统启动时的性能。
具体实施方式
下面列举实施例,对本发明进行详细描述。
本发明提供了一种基于动态符号表的内核模块内存占用优化方法,其核心思想是:通过修改内核模块的符号表加载机制,在系统启动加载内核时仅将内核模块声明导出的符号加载到全局符号表中,当系统启动加载异常时根据异常地址在当前内核内存中或内核模块中查找到加载异常的符号,将异常地址转换为其所在内核模块的偏移地址,根据偏移地址按需完成符号的加载,实现较低内存占用的系统启动。
本发明提供的一种基于动态符号表的内核模块内存占用优化方法,具体包括以下步骤:
步骤1、当系统启动加载内核时,遍历内核模块,解析内核模块获取其符号表及该符号表所对应的索引节点,仅将符号表中内核模块标记为需要导出的符号加载到全局符号表中,再为这些符号分配内存。
Linux系统的文件系统建立了inode(index node)表,inode表中包含文件系统所有文件列表,inode表中每个表项对应一个索引节点(inode节点),索引节点包含文件相关的元数据,元数据包括:文件类型,文件权限,文件UID(User Identification),文件链接数,文件大小,文件时间戳,文件的指向磁盘的数据块指针,文件索引节点编号,及有关文件的其他数据。
现有系统中根据编译选项及内核配置的不同,内核模块中的符号可能被默认为全部导出,即不论其是否提供给外部使用均会被标记为导出,然而按照标准的编程规范实际应该只导出内核模块指定导出的符号。内核模块代码中通常使用EXPORT_SYMBOL和EXPORT_SYMBOL_GPL函数实现符号的导出。
本发明通过对系统内核的内核模块加载函数中与符号表加载相关的代码进行修改,实现了仅将内核模块中由EXPORT_SYMBOL和EXPORT_SYMBOL_GPL标记的符号加载到全局符号表中。
具体包括以下步骤:
步骤1.1、调用内核标准方法读取内核模块的模块文件,遍历模块文件,逐个解析符号表中的每个符号,查找是否存在由EXPORT_SYMBOL或EXPORT_SYMBOL_GPL标记的符号,若存在则执行步骤1.2,否则执行步骤1.3。
Linux中内核模块的模块文件为.ko文件,可以采用insmod、rmmod、lsmod命令动态地加载、卸载及查看内核模块。具体来说,通过遍历模块文件的ELF文件的文件头即可获取模块文件中的符号表。
步骤1.2、解析EXPORT_SYMBOL或EXPORT_SYMBOL_GPL所标记符号的文件内地址,并将这些符号加载到全局符号表中。
步骤1.3、遍历模块文件,逐个解析符号表中的每个符号,若符号具有外部可见属性则将其加载到全局符号表中,否则不加载该符号。
本发明中,内核模块标记为需要导出的符号包括内核模块代码中明确声明的需要导出的符号和属性为外部可见的符号。
由此,本发明并未将所有的符号都加载到内存,而是尽可能少地选择必要的符号加载到全局符号表中,同时不在内存中创建内核模块自身的私有符号表。
步骤2、根据步骤1得到的索引节点中记录的信息,获取所有内核模块ELF文件中的符号表对应的磁盘块指针。
具体来说,根据索引节点中记录的数据块指针,定位到符号表所对应的磁盘上的数据块。每个索引节点都会记录直接指针、间接指针、双间接指针和三级间接指针,其中,直接指针用于直接记录磁盘块指针,间接指针用于指向存储直接指针的磁盘块,双间接指针用于指向存储间接指针的磁盘块,三级间接指针用于指向存储双间接指针的磁盘块。
步骤3、当系统启动异常、加载内核模块失败或应用启动异常时,获取当前错误信息相关的内存地址记为异常地址,若异常地址存在于当前内核内存中则获取异常地址对应的符号作为目标符号,执行步骤5;若异常地址未存在于当前内核内存中则遍历所有内核模块,找到包含异常地址的内核地址范围所对应的内核模块,将该内核模块记为目标内核模块,执行步骤4。
步骤4、将异常地址转换为目标内核模块内的偏移地址,根据步骤2获取的目标内核模块的磁盘块指针找到其符号表所在磁盘块作为目标磁盘块,读取目标磁盘块中的数据,逐个解析符号直到找到与异常地址相对应的符号,将其作为目标符号。
步骤5、加载目标符号,完成系统的启动,结束本流程。
实施例
本实施例中采用本发明提供的一种基于动态符号表的内核模块内存占用优化方法,实现了Linux系统较低内存占用的可靠启动,具体包括以下步骤:
S1、修改Linux系统insmod函数中符号表加载部分,即insmod函数的register_module部分,仅将内核模块中采用EXPORT_SYMBOL和EXPORT_SYMBOL_GPL标记的明确导出的符号加载到全局符号表中,其他符号不加载;再采用Slab分配器或Slob分配器为这些符号分配内存。其中,insmod函数为Linux系统提供的内核模块加载函数,insmod命令通过调用insmod函数实现内核模块加载。
修改insmod函数中符号表解析与加载部分,具体步骤如下:
S1.1、调用内核标准方法读取模块文件,解析模块文件的ELF文件的文件头逐个解析符号表中的每个符号,查找由EXPORT_SYMBOL或EXPORT_SYMBOL_GPL标记的导出符号,即查找符号__ksymtab_strings和__ksymtab,同时获取符号表所在磁盘块对应的inode节点,如果存在则执行S1.2,否则执行S1.3。逐个解析符号表中的每个符号是指将符号表中的符号逐一加载到内存中,而不是把整个符号表都加载到内存,以防加载过程导致内存瞬时消耗过大。
S1.2、解析符号对应的文件内地址,提取出这些明确需要导出的符号,并将这些符号加入到内核的全局符合表KALLSYMS中。
S1.3、重新解析模块文件的ELF文件的文件头以逐个解析符号表中的每个符号,当符号的属性为visible时将该符号加入到内核的全局符合表KALLSYMS中。
S2、根据S1获取的内核模块符号表所在磁盘块对应的inode节点查找到ELF文件中符号表对应的磁盘块指针,记为symbolTableBlockNo。
S3、修改Linux系统的内核函数lookup_symbol_name中的符号查找机制,根据获取的地址实现按需加载内核模块的私有符号表,需要加载内核模块的私有符号表的情况一般包括系统启动异常、内核模块加载异常或应用启动异常等,lookup_symbol_name内核函数用于将崩溃地址映射到函数名。
修改后的内核函数lookup_symbol_name具体步骤如下:
S3.1、在全局符号表中查找获取的地址,如果存在,则返回该符号的信息;否则,根据系统变量module_list遍历所有内核模块,对于每个模块,记为module,执行S3.2。
S3.2、若地址在module的内核地址范围内,该内核地址范围根据module的起始地址和image长度计算得到,则现将地址转换为内核模块内偏移地址,再通过获取的symbolTableBlockNo找到这个内核模块的符号表所在的磁盘块,使用内核的blkdev_read_page函数或者更底层的submit_bio接口直接读取磁盘块后逐个解析符号,并逐一释放内存,直到找到这个地址对应的符号。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (6)
1.一种基于动态符号表的内核模块内存占用优化方法,其特征在于,包括以下步骤:
步骤1、当系统启动加载内核时,遍历内核模块,解析内核模块获取该内核模块的符号表及该符号表所对应的索引节点,将已被内核模块标记为需导出的符号加载到全局符号表中,并为加载的符号分配内存;
步骤2、根据所述索引节点获取所有内核模块ELF文件中的符号表对应的磁盘块指针;
步骤3、当产生异常时,获取当前异常相关的内存地址记为异常地址,若异常地址存在于当前内核内存中则获取异常地址对应的符号作为目标符号,执行步骤5;若异常地址未存在于当前内核内存中则遍历所有内核模块,找到包含异常地址的内核地址范围所对应的内核模块,将该内核模块记为目标内核模块,执行步骤4;
步骤4、将异常地址转换为目标内核模块内的偏移地址,根据步骤2获取的目标内核模块的磁盘块指针找到目标内核模块的符号表所在磁盘块作为目标磁盘块,读取目标磁盘块中的数据,逐个解析符号直到找到与异常地址对应的符号作为目标符号;
步骤5、加载目标符号,完成系统的启动,结束本流程。
2.根据权利要求1所述的内核模块内存占用优化方法,其特征在于,所述步骤1还包括:
步骤1.1、调用内核标准方法读取内核模块的模块文件,遍历模块文件,逐个解析符号表中的每个符号,查找是否存在由EXPORT_SYMBOL或EXPORT_SYMBOL_GPL标记的符号,若存在则执行步骤1.2,否则执行步骤1.3;
步骤1.2、解析EXPORT_SYMBOL或EXPORT_SYMBOL_GPL所标记符号的文件内地址,将这些符号加载到全局符号表中;
步骤1.3、遍历模块文件,逐个解析符号表中的每个符号,若符号具有外部可见属性则将其加载到全局符号表中,否则不加载该符号。
3.根据权利要求1所述的内核模块内存占用优化方法,其特征在于,所述步骤1中所述为加载的符号分配内存的方式为:采用Slab分配器或Slob分配器为加载的符号分配内存。
4.根据权利要求1所述的内核模块内存占用优化方法,其特征在于,所述步骤3中所述异常为:系统启动异常、加载内核模块失败或应用启动异常。
5.根据权利要求1所述的内核模块内存占用优化方法,其特征在于,所述步骤1中还包括:采用insmod、rmmod及lsmod命令动态地加载、卸载及查看内核模块。
6.根据权利要求1所述的内核模块内存占用优化方法,其特征在于,所述步骤1中所述系统启动加载内核的实现方式为:采用修改Linux系统内insmod函数的符号表加载部分的实现。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311415112.9A CN117149499B (zh) | 2023-10-30 | 2023-10-30 | 一种基于动态符号表的内核模块内存占用优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311415112.9A CN117149499B (zh) | 2023-10-30 | 2023-10-30 | 一种基于动态符号表的内核模块内存占用优化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117149499A CN117149499A (zh) | 2023-12-01 |
CN117149499B true CN117149499B (zh) | 2024-01-19 |
Family
ID=88901103
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311415112.9A Active CN117149499B (zh) | 2023-10-30 | 2023-10-30 | 一种基于动态符号表的内核模块内存占用优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117149499B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103761089A (zh) * | 2014-01-14 | 2014-04-30 | 清华大学 | 基于寄存器传输语言确定动态函数调用关系的方法 |
CN105893085A (zh) * | 2016-03-30 | 2016-08-24 | 百度在线网络技术(北京)有限公司 | 内核模块加载方法和装置 |
CN111913762A (zh) * | 2020-08-20 | 2020-11-10 | 北京机电工程研究所 | 一种预留运行内存空间的dsp动态加载方法 |
CN115599448A (zh) * | 2021-06-28 | 2023-01-13 | 深圳市中兴微电子技术有限公司(Cn) | 一种基于linux内核ko模块的加载方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106354536A (zh) * | 2016-08-31 | 2017-01-25 | 北京奇虎科技有限公司 | 在Windows系统中加载Linux系统ELF文件的方法及装置 |
-
2023
- 2023-10-30 CN CN202311415112.9A patent/CN117149499B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103761089A (zh) * | 2014-01-14 | 2014-04-30 | 清华大学 | 基于寄存器传输语言确定动态函数调用关系的方法 |
CN105893085A (zh) * | 2016-03-30 | 2016-08-24 | 百度在线网络技术(北京)有限公司 | 内核模块加载方法和装置 |
CN111913762A (zh) * | 2020-08-20 | 2020-11-10 | 北京机电工程研究所 | 一种预留运行内存空间的dsp动态加载方法 |
CN115599448A (zh) * | 2021-06-28 | 2023-01-13 | 深圳市中兴微电子技术有限公司(Cn) | 一种基于linux内核ko模块的加载方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN117149499A (zh) | 2023-12-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5430878A (en) | Method for revising a program to obtain compatibility with a computer configuration | |
US6976221B2 (en) | System and method for flexible software linking | |
US8370602B2 (en) | Method for memory space management | |
US8176233B1 (en) | Using non-volatile memory resources to enable a virtual buffer pool for a database application | |
US20110099324A1 (en) | Flash memory storage system and flash memory controller and data processing method thereof | |
US20100114999A1 (en) | Method and System to Space-Efficiently Track Memory Access of Object-Oriented Language in Presence of Garbage Collection | |
CN111324451A (zh) | 一种基于lte协议栈的内存块越界的定位方法及其系统 | |
CN115292266A (zh) | 一种基于存储器的高可靠日志存储方法 | |
CN116149800B (zh) | Kvm虚拟机应用层无代理cdp方法、系统及存储介质 | |
JPH07306922A (ja) | Icメモリカードおよびそのicメモリカードの検査方法 | |
US7558940B2 (en) | Virtual memory translator for real-time operating systems | |
US20040015864A1 (en) | Method and system for testing memory operations of computer program | |
US20110271064A1 (en) | Storage device and method for accessing the same | |
CN117149499B (zh) | 一种基于动态符号表的内核模块内存占用优化方法 | |
US7617374B2 (en) | Hard disk testing method under extensible firmware interface | |
US8984218B2 (en) | Drive indicating mechanism for removable media | |
US7299384B1 (en) | Fixing prematurely freed objects | |
CN110471623B (zh) | 硬盘文件写入方法、装置、计算机设备和存储介质 | |
US7178139B2 (en) | Executable file system for an embedded computer | |
CN115729439A (zh) | 数据管理方法、装置及固态硬盘 | |
CN113703671B (zh) | 一种数据块擦除方法及相关装置 | |
CN113157513B (zh) | 一种堆内存破坏检测方法、装置、电子设备及存储介质 | |
CN115238297B (zh) | 多层级权限控制内存保护方法和装置 | |
JP2023135978A (ja) | Icチップおよびicチップの整合性チェック方法 | |
CN118519919A (zh) | 堆内存越界的检测方法、装置及计算机存储介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |