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

技术编号:39651822 阅读:12 留言:0更新日期:2023-12-09 11:20
本发明专利技术公开了一种基于动态符号表的内核模块内存占用优化方法,通过修改内核模块的符号表加载机制,在系统启动加载内核时仅将内核模块声明导出的符号加载到全局符号表中,当系统启动加载异常时根据异常地址在当前内核内存中或内核模块中查找到加载异常的符号,将异常地址转换为其所在内核模块的偏移地址,根据偏移地址按需完成符号的加载,实现较低内存占用的系统启动,有效提升了系统启动时的性能

【技术实现步骤摘要】
一种基于动态符号表的内核模块内存占用优化方法


[0001]本专利技术属于计算机应用开发
,具体涉及一种基于动态符号表的内核模块内存占用优化方法


技术介绍

[0002]Linux
内核模块通常被编译为独立的
.ko
文件,当其加载到内存后一般仅占用几兆空间,然而对于总内存只有几十兆的嵌入式
Linux
系统而言能否精简内核模块加载所占的空间就变得尤为重要

通常情况下,将内核模块加载到内存的过程中,其自带的符号表并非必须完全加载,其中既有必要的导出符号也有仅供调试用的符号,这些仅供调试用的符号绝大部分时候是不被实际使用的,一般仅在内核模块崩溃需要生成调用栈时才需要使用,因此现有的内核模块加载过程导出了过多的符号造成了内存空间的浪费,降低了系统性能


技术实现思路

[0003]有鉴于此,本专利技术提供了一种基于动态符号表的内核模块内存占用优化方法,实现了较低内存占用的系统启动

[0004]本专利技术提供的一种基于动态符号表的内核模块内存占用优化方法,包括以下步骤:步骤
1、
当系统启动加载内核时,遍历内核模块,解析内核模块获取其符号表及该符号表所对应的索引节点,将已被内核模块标记为需导出的符号加载到全局符号表中,并为加载的符号分配内存;步骤
2、
根据所述索引节点获取所有内核模块
ELF
文件中的符号表对应的磁盘块指针;步骤
3、
当产生异常时,获取当前异常相关的内存地址记为异常地址,若异常地址存在于当前内核内存中则获取异常地址对应的符号作为目标符号,执行步骤5;若异常地址未存在于当前内核内存中则遍历所有内核模块,找到包含异常地址的内核地址范围所对应的内核模块,将该内核模块记为目标内核模块,执行步骤4;步骤
4、
将异常地址转换为目标内核模块内的偏移地址,根据步骤2获取的目标内核模块的磁盘块指针找到其符号表所在磁盘块作为目标磁盘块,读取目标磁盘块中的数据,逐个解析符号直到找到与异常地址对应的符号,将其作为目标符号;步骤
5、
加载目标符号,完成系统的启动,结束本流程

[0005]进一步地,所述步骤1还包括:步骤
1.1、
调用内核标准方法读取内核模块的模块文件,遍历模块文件,逐个解析符号表中的每个符号,查找是否存在由
EXPORT_SYMBOL

EXPORT_SYMBOL_GPL
标记的符号,若存在则执行步骤
1.2
,否则执行步骤
1.3
;步骤
1.2、
解析
EXPORT_SYMBOL

EXPORT_SYMBOL_GPL
所标记符号的文件内地址,将
这些符号加载到全局符号表中;步骤
1.3、
遍历模块文件,逐个解析符号表中的每个符号,若符号具有外部可见属性则将其加载到全局符号表中,否则不加载该符号

[0006]进一步地,所述步骤1中所述为加载的符号分配内存的方式为:采用
Slab
分配器或
Slob
分配器为加载的符号分配内存

[0007]进一步地,所述步骤3中所述异常为:系统启动异常

加载内核模块失败或应用启动异常

[0008]进一步地,所述步骤1中还包括:采用
insmod、rmmod

lsmod
命令动态地加载

卸载及查看内核模块

[0009]进一步地,所述步骤1的实现方式为:采用修改
Linux
系统内
insmod
函数的符号表加载部分实现

[0010]有益效果
[0011]本专利技术通过修改内核模块的符号表加载机制,在系统启动加载内核时仅将内核模块声明导出的符号加载到全局符号表中,当系统启动加载异常时根据异常地址在当前内核内存中或内核模块中查找到加载异常的符号,将异常地址转换为其所在内核模块的偏移地址,根据偏移地址按需完成符号的加载,实现较低内存占用的系统启动,有效提升了系统启动时的性能

具体实施方式
[0012]下面列举实施例,对本专利技术进行详细描述

[0013]本专利技术提供了一种基于动态符号表的内核模块内存占用优化方法,其核心思想是:通过修改内核模块的符号表加载机制,在系统启动加载内核时仅将内核模块声明导出的符号加载到全局符号表中,当系统启动加载异常时根据异常地址在当前内核内存中或内核模块中查找到加载异常的符号,将异常地址转换为其所在内核模块的偏移地址,根据偏移地址按需完成符号的加载,实现较低内存占用的系统启动

[0014]本专利技术提供的一种基于动态符号表的内核模块内存占用优化方法,具体包括以下步骤:步骤
1、
当系统启动加载内核时,遍历内核模块,解析内核模块获取其符号表及该符号表所对应的索引节点,仅将符号表中内核模块标记为需要导出的符号加载到全局符号表中,再为这些符号分配内存

[0015]Linux
系统的文件系统建立了
inode

index node
)表,
inode
表中包含文件系统所有文件列表,
inode
表中每个表项对应一个索引节点(
inode
节点),索引节点包含文件相关的元数据,元数据包括:文件类型,文件权限,文件
UID

User Identification
),文件链接数,文件大小,文件时间戳,文件的指向磁盘的数据块指针,文件索引节点编号,及有关文件的其他数据

[0016]现有系统中根据编译选项及内核配置的不同,内核模块中的符号可能被默认为全部导出,即不论其是否提供给外部使用均会被标记为导出,然而按照标准的编程规范实际应该只导出内核模块指定导出的符号

内核模块代码中通常使用
EXPORT_SYMBOL

EXPORT_SYMBOL_GPL
函数实现符号的导出

[0017]本专利技术通过对系统内核的内核模块加载函数中与符号表加载相关的代码进行修改,实现了仅将内核模块中由
EXPORT_SYMBOL

EXPORT_SYMBOL_GPL
标记的符号加载到全局符号表中

[0018]具体包括以下步骤:步骤
1.1、
调用内核标准方法读取内核模块的模块文件,遍历模块文件,逐个解析符号表中的每个符号,查找是否存在由
EXPORT_SYMBOL

EXPORT_SYMBOL_GPL
标记本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.
一种基于动态符号表的内核模块内存占用优化方法,其特征在于,包括以下步骤:步骤
1、
当系统启动加载内核时,遍历内核模块,解析内核模块获取其符号表及该符号表所对应的索引节点,将已被内核模块标记为需导出的符号加载到全局符号表中,并为加载的符号分配内存;步骤
2、
根据所述索引节点获取所有内核模块
ELF
文件中的符号表对应的磁盘块指针;步骤
3、
当产生异常时,获取当前异常相关的内存地址记为异常地址,若异常地址存在于当前内核内存中则获取异常地址对应的符号作为目标符号,执行步骤5;若异常地址未存在于当前内核内存中则遍历所有内核模块,找到包含异常地址的内核地址范围所对应的内核模块,将该内核模块记为目标内核模块,执行步骤4;步骤
4、
将异常地址转换为目标内核模块内的偏移地址,根据步骤2获取的目标内核模块的磁盘块指针找到其符号表所在磁盘块作为目标磁盘块,读取目标磁盘块中的数据,逐个解析符号直到找到与异常地址对应的符号,将其作为目标符号;步骤
5、
加载目标符号,完成系统的启动,结束本流程
。2.
根据权利要求1所述的内核模块内存占用优化方法,其特征在于,所述步骤1还包括:步骤
1.1、
调用内核标准方法读取内核模块的模块文件,遍历模块文件,逐个解析符号表中的每个符号,查找是否存在由
EXPORT_SYMBOL

EXPORT_SYMBOL_GPL
标记的符号,...

【专利技术属性】
技术研发人员:温研
申请(专利权)人:北京麟卓信息科技有限公司
类型:发明
国别省市:

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

1