THIS_MODULE在Linux内核模块驱动程序中的意义是什么?

时间:2013-10-19 14:31:20

标签: linux linux-kernel linux-device-driver

在linux设备驱动程序开发中,file_operations结构使用“struct module * owner”。

  • 当我们总是使用THIS_MODULE
  • 初始化此结构时,有什么用?
  • 何时可以将此字段设置为NULL?

4 个答案:

答案 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以防止模块在使用时被卸载的主要原因之一。