Frage

Ich entwickle ein Linux-Treiber ladbares Modul, und ich habe ein anderes Gerät in meinem Treiber verwenden. (Art-Treiber auf einem anderen Fahrer gestapelt)

Wie rufe ich / einen anderen Fahrer in meinem Treiber verwenden? Ich denke, sie sowohl im Kernel sind so könnte es ein Weg sein, die einen anderen Treiber direkt verwenden können.

War es hilfreich?

Lösung

Sie werden die EXPORT_SYMBOL (oder EXPORT_SYMBOL_GPL) Makro benötigen. Zum Beispiel:

/* mod1.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
....
void mod1_foo(void)
{
    printk(KERN_ALERT "mod1_foo\n");
}
EXPORT_SYMBOL(mod1_foo);

/* mod2.h */
....
extern void mod1_foo(void);
....

/* mod2.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
#include "mod2.h"
int init_module(void)
{
    mod1_foo();
    ...

Dies sollte glatt sein, aber man muss natürlich mit dem Namensraum vorsichtig sein -. Stampfen auf Symbolen Kernel Moduls jemand anderes wäre bedauerlich,

Andere Tipps

vergessen zu erwähnen, dass Sie auch try_module_get / module_put / symbol_get / symbol_put / symbol_request studieren sollten, zum Laden des anderen Moduls zu gewährleisten, und die Tatsache, dass es nicht während der Benutzung entladen wird. Ich erinnere mich nicht die genauen Details obwohl; Ich denke, dass modprobe wird das andere Modul geladen zu gewährleisten, aber ich bin nicht sicher, ob die Laufzeitabhängigkeit zum Entladen hinzugefügt werden. Ich denke, dass diese APIs könnte für einige andere Fälle benötigt werden, muss aber über sie wissen dies zu überprüfen.

BTW, ist die kostenlose Buch Linux Device Drivers hier zur Verfügung, und es wird diese Frage beantworten und vieles mehr: http://lwn.net/Kernel/LDD3/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top