Question

Je développe un module chargeable de pilote Linux et je dois utiliser un autre périphérique dans mon pilote. (type de pilote empilé sur un autre pilote)

Comment appeler / utiliser un autre pilote dans mon pilote? Je pense qu’ils sont tous les deux dans le noyau, il pourrait donc y avoir un moyen d’utiliser directement un autre pilote.

Était-ce utile?

La solution

Vous aurez besoin de la macro EXPORT_SYMBOL (ou EXPORT_SYMBOL_GPL ). Par exemple:

/* 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();
    ...

Cela devrait être simple, mais vous devez bien sûr faire attention à l'espace de noms - piétiner les symboles des modules du noyau de quelqu'un d'autre serait malheureux.

Autres conseils

Vous avez oublié de mentionner que vous devriez également étudier try_module_get / module_put / symbol_get / symbol_put / symbol_request, afin de garantir le chargement de l'autre module et le fait qu'il n'est pas déchargé lors de son utilisation. Je ne me souviens pas des détails exacts cependant; Je pense que modprobe s'assurera que l'autre module est chargé, mais je ne suis pas sûr que la dépendance d'exécution pour le déchargement soit ajoutée. Je suppose que ces API peuvent être nécessaires dans certains cas, mais que vous devez les connaître pour vérifier cela.

Btw, le livre gratuit Linux Device Drivers est disponible ici, et il répondra à cette question et bien plus encore: http://lwn.net/Kernel/LDD3/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top