web-dev-qa-db-fra.com

erreur insmod: insertion de './hello.ko': -1 Format de module non valide "

Je viens de réaliser mon premier module de pilote, le module hello world, à la suite de LDD3. Malheureusement, j'ai rencontré cette erreur:

insmod: error inserting './hello.ko': -1 Invalid module format.

Je le fais sur Ubuntu 11.04 et mon environnement:

$ uname -r
2.6.38-8-generic

Je reçois la source du noyau comme ceci:

Sudo apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-2.6.38 - Linux kernel source for version 2.6.38 with Ubuntu patches
$Sudo apt-get install linux-source-2.6.38

mon/usr/src:

$ls /usr/src/
linux-headers-2.6.38-8          linux-source-2.6.38          vboxguest-5.0.10
linux-headers-2.6.38-8-generic  linux-source-2.6.38.tar.bz2

puis je compile le noyau

$Sudo cp /boot/config-2.6.38-8-generic ./.config
$Sudo make menuconfig -- load the .config file
$make
$make modules

puis je compile mon module de noyau

$make -C /usr/src/linux-source-2.6.38/linux-source-2.6.38 M=`pwd` modules

avec Makefile:

obj-m := hello.o

et puis finalement quand j'insère le module:

$Sudo insmod hello_world.ko
insmod: error inserting 'hello_world.ko': -1 Invalid module format

ce que j'ai trouvé dans dmesg:

hello: disagrees about version of symbol module_layout

Donc quel est le problème?

J'ai également remarqué que la version de linux-header is -2.26.38-generic et du code source est -2.26.38, est-ce le problème? mais je n'ai vraiment pas trouvé de paquet linux-source-2.26.38-generic sur le web.

status update: J'ai constaté que le fichier/lib/moduels/$ (nom -r)/build/Makefile indique la version de mon noyau en cours d'exécution:

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 38
EXTRAVERSION = .2

Donc, je télécharge le linux-2.6.38.2 et compile, mais toujours la même erreur.

J'ai également constaté qu'il y a une ligne dans/boot/config - $ (uname -r):

CONFIG_VERSION_SIGNATURE="Ubuntu 2.6.38-8.42-generic 2.6.38.2"

Est-ce que quelqu'un sait ce que cela signifie? Je ne le vois pas dans le fichier de configuration du noyau que je construis.

7
roMoon

Le noyau à partir duquel vous construisez votre module de noyau et auquel vous insérez le module doit être de la même version. Si vous ne voulez pas vous occuper de cela, vous pouvez utiliser le suivant Makefile.

obj−m += hello−world.o

all:
 make −C /lib/modules/$(Shell uname −r)/build M=$(PWD) modules
clean:
 make −C /lib/modules/$(Shell uname −r)/build M=$(PWD) clean

Vous pouvez maintenant construire et essayer d’insérer un module.

Je vous suggère de devenir root si possible avant cette ligne 

$ Sudo cp /boot/config-2.6.38-8-generic ./.config

$su
#cp /boot/config-2.6.38-8-generic ./.config
#insmod hello_world.ko

Sinon, vous pouvez également utiliser le fichier make suivant

TARGET  := hello-world
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS  := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
CC      := gcc-3.0

${TARGET}.o: ${TARGET}.c

.PHONY: clean

clean:
    rm -rf ${TARGET}.o
5
Punit Vara

Essayez d'utiliser la compilation croisée. Veuillez regarder le code ci-dessous pour le fichier make. Tenez compte de l'indentation, sinon vous risquez de rencontrer une erreur telle que un séparateur manquant. Arrêtez

obj-m += hello_.o #Ce nom devrait être le nom de votre fichier .c. J'utilise juste bonjour par exemple

Je suggère que la meilleure approche est via la compilation croisée

Créez une variable pour contenir le nom du répertoire où réside le répertoire du noyau linux. Dans mon exemple, remplacez la valeur "PATH_TO_LINUX_KERNEL_DIRECTORY" par une valeur de chemin d'accès réelle Exemple ~/linux Vous devez vraiment faire cela pour que le fichier make sache où trouver arm-linux-gnueabi- Sans cela, vous risquez de rencontrer des problèmes avec arm-linux-gnueabi-

KDIR := PATH_TO_LINUX_KERNEL_DIRECTORY

all:
    make Arch=arm CROSS_COMPILE=arm-linux-gnueabi- -C $(KDIR) M=$(Shell pwd) modules

clean:
    make -C $(KDIR) M=$(Shell pwd) clean
0
rocksyne