11

在 Linux 设备驱动程序开发中,该file_operations结构使用struct module *owner.

  • 当我们总是用 初始化这个结构时,它有什么用THIS_MODULE
  • 什么时候可以设置这个字段NULL
4

4 回答 4

10

此字段告诉谁是 的所有者struct file_operations。这可以防止模块在运行时被卸载。当用当前模块初始化时,THIS_MODULE拥有它的所有权。

于 2013-10-19T17:26:22.910 回答
5

最小可运行示例

每当您创建内核模块时,内核的构建机制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 中进行了测试。

于 2018-04-13T08:11:59.670 回答
2

[1] struct module *owner常用于某些结构,根本不是操作;它是指向“拥有”该结构的模块的指针。该字段用于防止模块在其操作正在使用时被卸载。几乎所有时候,它都被简单地初始化为THIS_MODULE,一个定义在 <linux/module.h>中的宏。

.

[2] 不建议您设置为null,因为这可能会导致驱动程序故障和其他问题。相反,请使用 linux 内核开发的良好实践。

在某些架构中,“.owner”已被删除,因此,请确保您的发行版和架构仍在使用它。

希望对您的理解有所帮助。

参考:LDD3,内核新手。

于 2015-12-11T04:02:13.530 回答
1

file_operation是用于连接设备号和驱动程序文件操作的主要结构之一。

  • 结构中有很多函数指针。第一个指针根本struct module *owner不是函数指针,而是指向定义在<linux/module.h>.
  • 在初始化为 时THIS_MODULE,它拥有模块的所有权。
  • struct module *owner初始化以THIS_MODULE防止模块在使用时被卸载的主要原因之一。
于 2020-06-11T22:01:18.620 回答