内核模块:访问另一个模块头中定义的结构成员

Meh*_*Meh 6 c linux-device-driver linux-kernel

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

让我们说另一个模块是:

<kernel-src>/drivers/xxx/xxx.c|.h
Run Code Online (Sandbox Code Playgroud)

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

struct s_xxx {
    ...
    int m1;
};
Run Code Online (Sandbox Code Playgroud)

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

struct s_xxx;
struct s_yyy {
    ...
    struct s_xxx *p_xxx;
};
Run Code Online (Sandbox Code Playgroud)

我的司机我:

#include <linux/yyy.h>
Run Code Online (Sandbox Code Playgroud)

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

struct s_yyy *p_yyy;
...
m = p_yyy->p_xxx->m1; /* error */
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

(对不起那个冗长而糟糕的解释:@)

ott*_*tto 5

struct s_xxx;
struct s_yyy {
    ...
    struct s_xxx *p_xxx;
};
Run Code Online (Sandbox Code Playgroud)

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

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

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