在 Linux 设备驱动程序开发中,该file_operations
结构使用struct module *owner
.
- 当我们总是用 初始化这个结构时,它有什么用
THIS_MODULE
? - 什么时候可以设置这个字段
NULL
?
在 Linux 设备驱动程序开发中,该file_operations
结构使用struct module *owner
.
THIS_MODULE
?NULL
?此字段告诉谁是 的所有者struct file_operations
。这可以防止模块在运行时被卸载。当用当前模块初始化时,THIS_MODULE
拥有它的所有权。
最小可运行示例
每当您创建内核模块时,内核的构建机制struct module
都会为您生成一个对象,并THIS_MODULE
指向它。
该结构包含许多字段,其中一些可以使用模块宏进行设置,例如MODULE_VERSION
.
此示例显示如何访问该信息module_info.c
:
#include <linux/module.h>
#include <linux/kernel.h>
static int myinit(void)
{
/* Set by default based on the module file name. */
pr_info("name = %s\n", THIS_MODULE->name);
pr_info("version = %s\n", THIS_MODULE->version);
return 0;
}
static void myexit(void) {}
module_init(myinit)
module_exit(myexit)
MODULE_VERSION("1.0");
MODULE_LICENSE("GPL");
Dmesg 输出:
name = module_info
version = 1.0
某些MODULE_INFO
字段也可以通过以下方式“访问”:
cat /sys/module/module_info/version
modinfo /module_info.ko | grep -E '^version:'
由于该struct module
对象的地址在所有模块中必须是唯一的,因此它可以作为一个很好的参数,fops.owner
如下所述:https ://stackoverflow.com/a/19468893/895245 。这是该用法的一个最小示例。
使用此 QEMU + Buildroot setup在 Linux 内核 4.16 中进行了测试。
[1] struct module *owner常用于某些结构,根本不是操作;它是指向“拥有”该结构的模块的指针。该字段用于防止模块在其操作正在使用时被卸载。几乎所有时候,它都被简单地初始化为THIS_MODULE,一个定义在 <linux/module.h>中的宏。
.
[2] 不建议您设置为null,因为这可能会导致驱动程序故障和其他问题。相反,请使用 linux 内核开发的良好实践。
在某些架构中,“.owner”已被删除,因此,请确保您的发行版和架构仍在使用它。
希望对您的理解有所帮助。
参考:LDD3,内核新手。
file_operation
是用于连接设备号和驱动程序文件操作的主要结构之一。
struct module *owner
不是函数指针,而是指向定义在<linux/module.h>
.THIS_MODULE
,它拥有模块的所有权。struct module *owner
初始化以THIS_MODULE
防止模块在使用时被卸载的主要原因之一。