的Linux模块交互功能参考
问题描述:
我正在开发两种不同的Linux内核模块(模块A,模块B)。的Linux模块交互功能参考
模块A使用模块B的功能 实际上,使用extern_symbol和module.symvers对我来说很明显。
,但我想知道如何处理这种情况下,模块A使用模块B的功能,并在同一时间模块B使用模块A.
答
可以与第三内核模块解决这个(或静态编译),这将导出由两个模块,这将是短截线,直到这两个模块的负载中使用的函数 - 然后,每个模块将注册其回调。
代码示例
模块集成
static int func1(int x);
static int func2(int y);
int xxx_func1(int x)
{
if (func1)
return func1(x);
return -EPERM;
}
EXPORT_SYMBOL(xxx_func1);
int xxx_func2(int x)
{
if (func2)
return func2(x);
return -EPERM;
}
EXPORT_SYMBOL(xxx_func2);
int xxx_register_func(int id, int (*func)(int))
{
if (id == 1)
func1 = func;
else if (id ==2)
func2 = func;
return 0;
}
EXPORT_SYMBOL(xxx_register_func);
int xxx_unregister_func(int id)
{
if (id == 1)
func1 = NULL;
else if (id ==2)
func2 = NULL;
return 0;
}
EXPORT_SYMBOL(xxx_unregister_func);
模块1
static int module1_func1(int x)
{
...
}
static int module1_do_something(...)
{
...
xxx_func2(123);
...
}
static int module1_probe(...)
{
...
xxx_register_func(1, module1_func1);
...
}
与同为模块2 ...
当然,你应该添加互斥防范功能注册,处理边缘ca SES等
答
你不能。模块负载一次一个,并且所有符号具有当加载模块解决,所以一对模块的引用,其在每个其它符号将是不可能的加载。
找到某种方式来组织这些模块避免了循环引用。
+1
谢谢你的好意。 –
谢谢,这是回答我真正想要的! –