“Paramètres non valides” erreur lorsque vous essayez d'insérer un module qui accède à des symboles exportés
J'essaie de partager une variable globale entre les deux modules, afin de comprendre comment utiliser le EXPORT_SYMBOL
macro correctement, mais je reçois un Invalid paramaters
d'erreur lorsque j'essaie d'insérer le deuxième module.
Dans le premier module foo.c
:
#include <linux/module.h>
#include <linux/kernel.h>
extern unsigned myvar;
unsigned myvar = 42;
EXPORT_SYMBOL(myvar);
static int __init foo_init(void){
printk(KERN_INFO "HELLO FROM MODULE 1");
return 0;
}
static void __exit foo_exit(void){
printk(KERN_INFO "BYE FROM MODULE 1");
}
module_init(foo_init);
module_exit(foo_exit);
MODULE_LICENSE("GPL");
Dans le deuxième module bar.c
:
#include <linux/module.h>
#include <linux/kernel.h>
extern unsigned myvar;
static int __init bar_init(void){
printk(KERN_INFO "HELLO FROM MODULE 2");
printk(KERN_INFO "myvar: %u", myvar);
return 0;
}
static void __exit bar_exit(void){
printk(KERN_INFO "BYE FROM MODULE 2");
}
module_init(bar_init);
module_exit(bar_exit);
MODULE_LICENSE("GPL");
Je compile chaque module dans des répertoires distincts séparés des Makefiles. Puis-je insérer chaque module manuellement:
# insmod foo.ko
# insmod bar.ko
Error: could not insert module bar.ko: Invalid parameters
Si je tente d'insérer bar.ko
tout d'abord, je devrait recevoir le symbole inconnu erreur:
# insmod bar.ko
Error: could not insert module bar.ko: Unknown symbol in module
Voici le symbole de vidage:
# nm foo.ko | grep myvar
00000000ec933bae A __crc_myvar
0000000000001118 r __kcrctab_myvar
000000000000057c r __kstrtab_myvar
0000000000000b20 r __ksymtab_myvar
0000000000000180 D myvar
Je suis à court d'un Debian système (noyau v3.2.21) avec un Xenomai patch appliqué:
# uname -r
3.2.21-xenomai-2.6.2.1-ipipe
Malheureusement, je ne pense pas que CONFIG_KALLSYMS_ALL
est activé, donc je ne peux pas regarder dans /proc/kallsyms/
pour vérifier que myvar
est effectivement exportés.
J'ai
extern unsigned myvar;
dans les deux fichiers (j'ai pu le coller dans un fichier d'en-tête, mais l'effet net doit être le même).avoir vos modules module_init() et module_exit() ? Quelque part dans votre code, il existe un EINVAL erreur retournée?
Si je commente les variables, le module de charge très bien sans aucune erreur; l'erreur se produit uniquement lorsque les variables sont sans commentaire. Je code un rapide bare-bones version de chaque module et de modifier ma réponse à montrer ce que je veux dire.
Découvrez ma mise à jour de question.
OriginalL'auteur Vilhelm Gray | 2013-05-03
Vous devez vous connecter pour publier un commentaire.
J'ai décidé de fouiller dans le système pour essayer de trouver la cause de l'erreur:
Dirait que le problème n'était pas avec de l'exportation de la symbole, mais plutôt de la comptabilité pour le symbole version.
La solution est détaillée dans Documentation/kbuild/modules.txt et est assez simple: assurez-vous que le symbole a une entrée dans le
Module.symvers
fichier.Par exemple, dans mon cas, les deux modules où situé dans /home/vilhelm/foo/ et /home/vilhelm/bar/ respectivement. Depuis que j'ai compiler chaque module séparément, chaque répertoire a son propre
Makefile
. J'ai d'abord exécutémake
dans le foo répertoire pour générer laModule.symvers
fichier dans ce répertoire pour lefoo
module.Ensuite, j'ai modifié le
Makefile
pour labar
module en insérant la ligne suivante en haut de laMakefile
:Noter que c'est un chemin d'accès absolu!
Enfin j'exécute
make
dans le bar répertoire, puis insérez le module manuellement:Pas d'erreurs, de sorte que c'est un bon signe.
Et maintenant le moment de vérité:
Succès! 🙂
OriginalL'auteur Vilhelm Gray