0x01 可装载模块分类
设备驱动
文件系统
系统调用
0x02 版本检查
Linux 的迅速发展致使相邻版本的内核之间亦存在较大的差异,即在版本补丁号(Patch Level,即内核版本号的第四位数)相邻的内核之间。为此 Linux 的开发者为了保证内核的稳定,Linux 在加载模块到内核时对模块采用了版本校验机制。
1,Invalid module format -> disagrees about version of symbol module_layout
由于模块中 module_layout 的导出符号的版本信息与当前内核中的不符
函数 module_layout 的第二个参数 ver 存储了模块的版本校验信息。结构体 modversion_info 中保存了用于模块校验的 CRC(Cyclic Redundancy Check,即循环冗余码校验)值
2,Linux 对可装载模块采取了两层验证:模块的 CRC 值校验和 vermagic 的检查
CRC 值校验针对模块(内核)导出符号,是一种简单的 ABI(即 Application Binary Interface)一致性检查(1中的disagrees about version of symbol module_layout 就有由于没有通过 CRC 值校验,即 module_layout 的 CRC 值与当前内核中的不符)
模块 vermagic(即 Version Magic String)则保存了模块编译时的内核版本以及 SMP 等配置信息
3,模块的 vermagic 信息
# uname – r
2.6.38-10-generic
# modinfo ./hello/hello.ko
filename: ./hello/hello.ko
license: Dual BSD/GPL
srcversion: 31FE72DA6A560C890FF9B3F
depends: <

本文深入探讨了Linux的可装载内核模块(LKM),包括分类如设备驱动、文件系统和系统调用。重点讲述了版本检查机制,如CRC值校验和vermagic信息,并详细介绍了模块的装载、卸载、编译时版本信息的添加及构建与测试过程。

366

被折叠的 条评论
为什么被折叠?



