在这种情况下如何从 Linux 内核模块导出符号?
How to export symbol from Linux kernel module in this case?
我构建了两个内核模块,其中一个是 net_device。我的 net_device 模块 A 依赖于模块 B,它提供了一些额外的控制机制来导出设备信息。
我希望模块 B 能够调用模块 A 中的 "xmit" 函数。结果,如果我简单地从 A 导出符号,模块 B 将变得依赖于模块 A。这显然, 造成 "deadlock" 依赖情况。
有没有人有解决这个问题的经验?如何正确导出A中的"xmit"函数让B使用?
您可以从模块 A 提供回调函数。在这种情况下,您不需要将需要的每个函数都导出到内核名称空间。我想您可以为 B 提供一些结构。类似于:
内部header:
struct possible_ops {
int (*xmit)(...);
};
答:
struct private {
struct possible_ops *ops;
};
...
ops = kzalloc(sizeof(*ops));
ops->xmit = xmit;
乙:
whatever(struct possible_ops *ops) {
if (ops && ops->xmit) {
ret = ops->xmit();
...
}
}
我构建了两个内核模块,其中一个是 net_device。我的 net_device 模块 A 依赖于模块 B,它提供了一些额外的控制机制来导出设备信息。
我希望模块 B 能够调用模块 A 中的 "xmit" 函数。结果,如果我简单地从 A 导出符号,模块 B 将变得依赖于模块 A。这显然, 造成 "deadlock" 依赖情况。
有没有人有解决这个问题的经验?如何正确导出A中的"xmit"函数让B使用?
您可以从模块 A 提供回调函数。在这种情况下,您不需要将需要的每个函数都导出到内核名称空间。我想您可以为 B 提供一些结构。类似于:
内部header:
struct possible_ops {
int (*xmit)(...);
};
答:
struct private {
struct possible_ops *ops;
};
...
ops = kzalloc(sizeof(*ops));
ops->xmit = xmit;
乙:
whatever(struct possible_ops *ops) {
if (ops && ops->xmit) {
ret = ops->xmit();
...
}
}