【问题标题】:Access two structs with the same name (module)访问两个同名的结构(模块)
【发布时间】:2021-03-14 10:15:16
【问题描述】:

我注意到 Linux 内核有两个同名结构 (module)。一个在include/linux/module.h 中找到,另一个在scripts/mod/modpost.h 中找到。现在,我知道THIS_MODULE 被分配给module.h 中的结构,但是内核如何知道它应该使用哪个结构呢?

THIS_MODULE 被定义为export.h 内的宏

#ifdef MODULE
extern struct module __this_module;
#define THIS_MODULE (&__this_module)
#else
#define THIS_MODULE ((struct module *)0)
#endif

我想请人解释一下上面的代码


我的另一个问题是如何访问modpost.h 中的模块结构?

【问题讨论】:

    标签: c struct linux-kernel


    【解决方案1】:

    scripts/ 下的所有内容都用于用户空间实用程序,用于构建内核及其模块。此目录中的标头从不包含在内核模块中代码,因此模块永远无法访问这些定义。

    当您在 Linux 内核代码中搜索某种类型/变量/函数时,您可以放心地忽略在 scripts/ 目录下找到的所有内容。

    【讨论】:

      【解决方案2】:

      它的字面意思是如果定义了宏 MODULE,那么您将获得 THIS_MODULE 的第一个定义,否则您将获得另一个(空指针)。这发生在编译时。使用哪个结构是一样的,最有可能包含哪个头文件。

      您在声明中包含 modpost.h,并且要访问变量,您需要您的代码在该变量处于活动状态的进程中运行。从上下文来看,我猜是当您使用 modprobe 加载模块时。

      【讨论】:

      • 当我尝试包含 modpost.h 时,编译器说该文件不存在,尽管它在 /usr/src/$(uname -r)/scripts/mod/modpost.h 中存在
      • 您在编译程序时是否包含-I /usr/src/$(uname -r)/scripts/mod 的搜索路径?
      • 什么命令接受该参数 (-I)?
      • 你的编译器 (gcc)。
      • 我不使用GCC编译内核模块...我使用Linux内核make系统。
      猜你喜欢
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多