linux模块的相互功能参考

时间:2016-07-25 01:07:27

标签: c linux module linux-kernel

我正在开发两个不同的Linux内核模块(模块A,模块B)。

模块A使用模块B的功能 实际上,我很清楚使用extern_symbol和module.symvers。

但我想知道如何处理该案例模块A使用模块B的功能,同时模块B使用模块A.

2 个答案:

答案 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来说也一样......

当然你应该添加互斥锁来保护功能注册,处理边缘情况等等。