在linux设备驱动程序开发中,file_operations结构使用“struct module * owner”。
THIS_MODULE
答案 0 :(得分:9)
此字段告诉谁是struct file_operations的所有者。这可以防止模块在运行时卸载。当使用THIS_MODULE初始化时,当前模块保留其所有权
答案 1 :(得分:2)
最小可运行示例
无论何时创建内核模块,内核的构建机制都会为您生成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
字段也可以被访问&#34;通过以下方式:
cat /sys/module/module_info/version
modinfo /module_info.ko | grep -E '^version:'
由于struct module
对象的地址在所有模块中必须是唯一的,因此它可以作为fops.owner
的良好参数,如:https://stackoverflow.com/a/19468893/895245所述。这是a minimal example of that usage。
使用this QEMU + Buildroot setup在Linux内核4.16中进行了测试。
答案 2 :(得分:1)
[1] struct module * owner 常用于某些结构,根本不是操作;它是指向“拥有”结构的模块的指针。此字段用于防止模块在其操作正在使用时被卸载。几乎所有时间,它只是初始化为 THIS_MODULE ,一个定义的宏 &LT; linux / module.h&gt; 。
。
[2]我不建议你将它设置为null,因为它可能导致驱动程序故障和其他问题。相反,使用linux内核开发的良好实践。
在某些体系结构中, “。owner” 已被删除,因此,请确保您的发行版和架构仍在使用它。
我希望它能帮助你理解。
参考文献:LDD3,内核新手。
答案 3 :(得分:1)
file_operation
是用于连接设备号和驱动程序的文件操作的主要结构之一。
struct module *owner
,它根本不是函数指针,而是指向<linux/module.h>
中定义的结构模块。THIS_MODULE
时,它拥有模块的所有权。struct module *owner
初始化为THIS_MODULE
以防止模块在使用时被卸载的主要原因之一。