【问题标题】:kernel module: Accessing member of structure defined in another module header内核模块:访问另一个模块头中定义的结构成员
【发布时间】:2012-11-15 10:40:45
【问题描述】:

我正在尝试编写一个内核模块,但我无法访问另一个模块头中定义的结构成员。我会尽力解释:

假设另一个模块是:

<kernel-src>/drivers/xxx/xxx.c|.h

在 xxx.c 中有一些我在驱动程序中使用的导出函数。但是我想从 xxx.h 中定义的结构 s_xxx 访问成员 m1

struct s_xxx {
    ...
    int m1;
};

接下来我在 /usr/include/linux/yyy.h 中有这个:

struct s_xxx;
struct s_yyy {
    ...
    struct s_xxx *p_xxx;
};

我是我的司机:

#include <linux/yyy.h>

我成功地使用了 xxx 驱动程序中的导出符号。但当然,如果我尝试从 s_xxx 访问成员,编译器会抱怨:

struct s_yyy *p_yyy;
...
m = p_yyy->p_xxx->m1; /* error */

xxx.h 无法在 /usr/include/linux/ 中找到。到目前为止,我找到了 2 个解决方法:

1) 下载内核源代码并在我的模块中包含 xxx.h 的完整路径

2) 将 s_xxx 定义从 xxx.h 复制/粘贴到我的模块

这样做的正确方法是什么?

(对不起,冗长而蹩脚的解释:@)

【问题讨论】:

  • 好的,几乎所有的答案都是关于包含 yyy.h 文件的。但是我不能这样做,因为它不包含在内核头文件中。它仅在内核源代码中的模块位置。因此,如果我想分发软件,用户还必须下载内核源代码才能构建。这不是一个选择。
  • 好吧,如果 xxx.h 不在 include/linux/... 中,这意味着这个头文件不是 xxx 模块公共接口的一部分,并且可能有一个很好的理由,imo 也没有您的解决方案是可以接受的,请确保您没有忽略执行您想要的接口功能,并且并非如此向模块维护者提出具有充分理由的接口扩展

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


【解决方案1】:
struct s_xxx;
struct s_yyy {
    ...
    struct s_xxx *p_xxx;
};

如果没有 xxx.h,这意味着你有一个 struct s_xxx 的前向声明,你可以声明指向它的指针,但你还不能使用它的成员或实例化一个,因为它的大小或成员是未知的给编译器。您需要通过在编译单元中包含 xxx.h 来包含完整的结构定义。

如果 xxx.h 不是 xxx 的公共接口的一部分,但您仍然坚持访问模块的内部,那么如果 xxx 的内部结构发生更改,您将来将面临灾难性兼容性中断的风险。

不建议将结构定义复制到您自己的代码中,因为无法保证结构之间的二进制兼容性,除非您使用相同的编译器和选项自己构建了所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多