【发布时间】: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