CN117149499A - 一种基于动态符号表的内核模块内存占用优化方法 - Google Patents

一种基于动态符号表的内核模块内存占用优化方法 Download PDF

Info

Publication number
CN117149499A
CN117149499A CN202311415112.9A CN202311415112A CN117149499A CN 117149499 A CN117149499 A CN 117149499A CN 202311415112 A CN202311415112 A CN 202311415112A CN 117149499 A CN117149499 A CN 117149499A
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.)
Granted
Application number
CN202311415112.9A
Other languages
English (en)
Other versions
CN117149499B (zh
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 CN202311415112.9A priority Critical patent/CN117149499B/zh
Publication of CN117149499A publication Critical patent/CN117149499A/zh
Application granted granted Critical
Publication of CN117149499B publication Critical patent/CN117149499B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error 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/0706Error 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/073Error 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/06Addressing 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函数的符号表加载部分实现。
CN202311415112.9A 2023-10-30 2023-10-30 一种基于动态符号表的内核模块内存占用优化方法 Active CN117149499B (zh)

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 true CN117149499A (zh) 2023-12-01
CN117149499B 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 (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103761089A (zh) * 2014-01-14 2014-04-30 清华大学 基于寄存器传输语言确定动态函数调用关系的方法
CN105893085A (zh) * 2016-03-30 2016-08-24 百度在线网络技术(北京)有限公司 内核模块加载方法和装置
US20190087208A1 (en) * 2016-08-31 2019-03-21 Beijing Qihoo Technology Company Limited Method and apparatus for loading elf file of linux system in windows system
CN111913762A (zh) * 2020-08-20 2020-11-10 北京机电工程研究所 一种预留运行内存空间的dsp动态加载方法
CN115599448A (zh) * 2021-06-28 2023-01-13 深圳市中兴微电子技术有限公司(Cn) 一种基于linux内核ko模块的加载方法及装置

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103761089A (zh) * 2014-01-14 2014-04-30 清华大学 基于寄存器传输语言确定动态函数调用关系的方法
CN105893085A (zh) * 2016-03-30 2016-08-24 百度在线网络技术(北京)有限公司 内核模块加载方法和装置
US20190087208A1 (en) * 2016-08-31 2019-03-21 Beijing Qihoo Technology Company Limited Method and apparatus for loading elf file of linux system in windows system
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
CN117149499B (zh) 2024-01-19

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
JP2008204475A (ja) 不揮発性半導体記憶装置
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
CN117149499B (zh) 一种基于动态符号表的内核模块内存占用优化方法
WO2001093263A1 (en) Information recording medium, information recording method, information recording apparatus, information reproducing method, and information reproducing apparatus
US7617374B2 (en) Hard disk testing method under extensible firmware interface
US8984218B2 (en) Drive indicating mechanism for removable media
KR20090039571A (ko) 저장장치와 그 저장장치의 상태정보에 접근하는 방법
CN110471623B (zh) 硬盘文件写入方法、装置、计算机设备和存储介质
CN115827364A (zh) 安卓平台中Native内存监控方法
CN115729439A (zh) 数据管理方法、装置及固态硬盘
CN113138720A (zh) 数据存储方法、存储器控制电路单元以及存储器存储装置
JP4171518B2 (ja) 不揮発性半導体記憶装置
CN113703671B (zh) 一种数据块擦除方法及相关装置
CN113157513B (zh) 一种堆内存破坏检测方法、装置、电子设备及存储介质
JP2023135978A (ja) Icチップおよびicチップの整合性チェック方法

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