Wie man Linux-Treibermodul Anruf- / verwenden Sie einen anderen Treiber-Modul schreiben?
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.
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/