6

我正在尝试编写一个内核模块,但我坚持访问另一个模块头中定义的结构成员。我将尝试解释:

假设另一个模块是:

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

在 xxx.c 中有一些我在驱动程序中使用的导出函数。但是我想从 xxx.h 中定义的struct 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 */

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

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

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

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

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

4

1 回答 1

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

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

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

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

于 2012-11-28T11:33:47.513 回答