gpt4 book ai didi

c - 内核模块 : Accessing member of structure defined in another module header

转载 作者:太空狗 更新时间:2023-10-29 17:23:49 25 4
gpt4 key购买 nike

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

假设另一个模块是:

<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 */

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

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

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

正确的做法是什么?

(抱歉解释又长又烂:@)

最佳答案

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com