Comment puis-je tester mon pilote est chargé et d'accéder ensuite mes fonctions de pilote du noyau linux?

StackOverflow https://stackoverflow.com/questions/1693575

Question

J'ai un pilote qui compile et charges dans le noyau linux très bien. Dans ce pilote sont des fonctions que je voudrais accéder à partir du fichier du noyau « fs / de readdir.c ». De plus, comment puis-je tester si un pilote est chargé?

Je besoin de quelque chose comme ce qui suit.

if(myDriver is loaded){
    myDriver.functionCall();
}

Tous les exemples que j'ai trouvé sur les recherches sur Internet sont en train de faire ce à partir d'applications de l'espace utilisateur.

Était-ce utile?

La solution

L'autre possibilité est d'utiliser EXPORT_SYMBOL(functionCall); dans votre module qui fera votre fonction apparaissent dans la table des symboles du noyau. Vous pouvez ensuite utiliser find_symbol("functionCall", blah, blah) pour vérifier si le symbole existe et de trouver sa valeur / emplacement dynamiquement.

Voir linux / kernel / module.c et module.h

Autres conseils

fs/readdir.c ne lien si le symbole functionCall n'est pas encore dans le noyau. Vous ne pouvez le faire par indirection. Configuration une structure ops dans le code principal du noyau, il init est de fonctions fictives, ou tout simplement NULLs de dire au reste du noyau que votre pilote est pas encore chargé. Dans la routine d'initialisation du pilote définir les pointeurs de fonction dans cette structure aux fonctions de votre module (réinitialiser les paramètres par défaut dans de-init). La structure aura besoin d'une forme de protection de la course, donc vous finirait probablement avoir un sémaphores comme l'un de ses membres. Cela peut être étendu à la structure par appareil, etc.

Vous pouvez ajouter un pointeur de fonction functionCall dans le noyau, l'initialiser à NULL, et attendez que le module pour le pointeur sur une valeur non NULL. Code à readdir vérifierait le pointeur étant non NULL avant déréférencement il. Cela nécessite le module de connaître le pointeur de fonction dans le noyau soit faisant le pointeur global ou de la même facile d'accès à partir d'un module.

Si vous ne voulez pas le conducteur de savoir au sujet de cette modification du noyau, vous pouvez modifier readdir pour rechercher le pilote à charger, puis utilisez find_symbol (comme mentionné par @chrisharris) pour obtenir l'adresse de functionCall et attribuer la valeur renvoyée à un certain pointeur de fonction privée quelque part dans readdir.

Une façon de répondre à la « est le conducteur chargé » question serait d'utiliser register_module_notifier()

static int
my_load_notify(struct notifier_block *self, unsigned long val, void *data)
{
 struct module *m = data;
 if (0 == strcmp(m->name, "myDriver")) {
  // set function pointer(s)
 }
}
static struct notifier_block module_load_nb = {
 .notifier_call = my_load_notify,
};

static int
my_init(void)
{
 ...
 register_module_notifier(&module_load_nb);
 ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top