2016-07-25 10 views
1

Ich entwickle zwei verschiedene linux kernel modul (modul A, modul B).linux module gegenseitige funktion referenz

Modul A verwendet die Funktion von Modul B Eigentlich ist es klar für mich mit extern_symbol und module.symvers.

, aber ich möchte wissen, wie diese Fall-Modul A zu handhaben verwendet Funktion des Moduls B und zugleich Modul B verwendet Modul A.

Antwort

2

Sie können dies mit einem dritten Kernel-Modul lösen (oder statisch kompiliert), das die Funktionen beider Module exportiert, die Stubs sein werden, bis beide Module laden - dann registriert jedes Modul seine Callbacks.

Codebeispiel

Modulintegration

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

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

Und das gleiche gilt für module2 ...

Natürlich Sie Mutex hinzufügen sollten schützen die Funktion Registrierung, Griffkante ca ses usw.

+1

Danke, es ist Antwort, die ich wirklich will! –

2

Sie können nicht. Module laden nacheinander, und alle Symbole müssen aufgelöst werden, wenn Sie ein Modul laden, so dass ein Paar Module, die sich gegenseitig auf Symbole verweisen, nicht geladen werden kann.

Finden Sie einen Weg, um diese Module zu strukturieren, die die Zirkelbezüge vermeidet.

+1

Vielen Dank für Ihre Freundlichkeit. –

Verwandte Themen