2016-07-25 95 views
1

我正在开发两种不同的Linux内核模块(模块A,模块B)。的Linux模块交互功能参考

模块A使用模块B的功能 实际上,使用extern_symbol和module.symvers对我来说很明显。

,但我想知道如何处理这种情况下,模块A使用模块B的功能,并在同一时间模块B使用模块A.

回答

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); 
    ... 
} 

与同为模块2 ...

当然,你应该添加互斥防范功能注册,处理边缘ca SES等

+1

谢谢,这是回答我真正想要的! –

2

你不能。模块负载一次一个,并且所有符号具有当加载模块解决,所以一对模块的引用,其在每个其它符号将是不可能的加载。

找到某种方式来组织这些模块避免了循环引用。

+1

谢谢你的好意。 –