内核模块编程:库特性模拟与参数传递
1. 模块导出与GPL许可
在编写内核模块时,我们可以使用宏将数据结构标记为导出。需要注意的是,只有全局作用域的数据才能被标记为导出,局部变量则不行。除了常见的 EXPORT_SYMBOL() 宏,还有一个有趣的 EXPORT_SYMBOL_GPL() 宏。它与 EXPORT_SYMBOL() 类似,但通过它导出的函数或数据项仅对在 MODULE_LICENSE() 宏中包含“GPL”字样的内核模块可见。在Linux内核代码库中,这个宏被广泛使用。
2. 模块堆叠概念理解
模块堆叠为内核模块开发者提供了一种类似库的特性。在项目设计中,我们通常会有一个或多个“核心”内核模块,它们充当库的角色,包含要导出给项目中其他内核模块使用的数据结构和功能(函数/API)。
以Ubuntu 22.04.3 LTS系统上运行的Oracle VirtualBox 7.0虚拟机为例,执行 lsmod | grep vbox 命令会输出如下信息:
vboxnetadp 28672 0
vboxnetflt 28672 1
vboxdrv 614400 3 vboxnetadp,vboxnetflt
这里第三列是使用计数, vboxdrv 模块的使用计数为3,
超级会员免费看
订阅专栏 解锁全文


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



