我正在开发两个不同的Linux内核模块(模块A,模块B)。
模块A使用模块B的功能 实际上,我很清楚使用extern_symbol和module.symvers。
但我想知道如何处理该案例模块A使用模块B的功能,同时模块B使用模块A.
答案 0 :(得分:2)
你不能。模块一次加载一个,加载模块时必须解析所有符号,因此无法加载一对彼此引用符号的模块。
找到一些方法来构建这些避免循环引用的模块。
答案 1 :(得分:2)
您可以使用第三个内核模块(或静态编译)来解决这个问题,它会导出两个模块使用的函数,这两个模块将是存根,直到两个模块都加载 - 然后,每个模块都会注册它的回调。
代码示例
模块集成
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);
...
}
对于module2来说也一样......
当然你应该添加互斥锁来保护功能注册,处理边缘情况等等。