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

假设另一个模块是:

<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。到目前为止,我发现了两种解决方法:

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

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

正确的方法是什么?

(对于冗长而long脚的解释,很抱歉:@)

最佳答案

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

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

如果xxx.h不是xxx的公共(public)接口(interface)的一部分,但是您仍然坚持访问模块的内部,则如果xxx的内部结构发生更改,将来可能会遇到灾难性的兼容性中断的风险。

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

关于c - 内核模块: Accessing member of structure defined in another module header,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13590517/

10-17 01:42