内核模块的高级特性与块驱动加载
内核模块间通信函数的使用细节
在使用内核模块间通信函数时,有几个重要细节需要牢记。首先,即使内核在配置时未支持可加载模块,这些函数依然可用,因此无需使用大量的 #ifdef 语句来进行相关检查。其次,模块间通信函数所实现的命名空间是全局的,所以在选择名称时要格外小心,否则可能会导致命名冲突。最后,模块间的数据存储在一个简单的链表中,如果进行大量的查找操作或存储大量字符串,性能将会受到影响。该功能适用于轻量级使用,并非作为通用的字典子系统。
模块的版本控制
模块的一个主要问题是版本依赖性。每次使用不同版本的内核时,都需要重新编译模块,这对于运行多个自定义模块的情况来说是一件麻烦事,而对于以二进制形式分发的商业模块,重新编译甚至是不可能的。
幸运的是,内核开发者找到了一种灵活的方法来处理版本问题。其核心思想是,只有当内核提供的软件接口发生变化时,模块才会与不同版本的内核不兼容。软件接口可以通过函数原型和函数调用中涉及的所有数据结构的精确定义来表示。最后,可以使用 CRC 算法将软件接口的所有信息映射为一个 32 位的数字。
通过将内核导出的每个符号的名称进行处理,使其包含与该符号相关的所有信息的校验和,从而解决版本依赖问题。这些信息通过解析头文件并从中提取得到。该功能是可选的,可以在编译时启用。Linux 发行版提供的模块化内核通常会启用版本控制支持。
例如,当启用版本支持时, printk 符号会以类似 printk_R12345678 的形式导出到模块中,其中 12345678 </
超级会员免费看
订阅专栏 解锁全文
940

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



