it-swarm.com.de

insmod-Fehler: './hello.ko' einfügen: -1 Ungültiges Modulformat "

Ich habe gerade mein erstes Treibermodul erstellt, das Hallo Weltmodul nach LDD3. Leider ist dieser Fehler aufgetreten:

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

Ich mache dies auf Ubuntu 11.04 und meiner Umgebung:

$ uname -r
2.6.38-8-generic

Ich bekomme die Kernel-Quelle so:

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

mein/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

und dann kompiliere ich den Kernel

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

und dann kompiliere ich mein Kernel-Modul

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

mit Makefile:

obj-m := hello.o

und dann endlich, wenn ich das Modul stecke:

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

was ich in dmesg gefunden habe:

hello: disagrees about version of symbol module_layout

Also, was ist das Problem?

Ich habe auch bemerkt, dass die linux-header is -2.26.38-generic- und Quellcode-Version -2.26.38 ist. Ist dies das Problem? aber ich habe wirklich kein linux-source-2.26.38-generic-paket im web gefunden.

status update: Ich habe festgestellt, dass die Datei/lib/moduels/$ (name -r)/build/Makefile meine laufende Kernel-Version angibt:

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

Also lade ich die linux-2.6.38.2 herunter und kompiliere, aber immer noch der gleiche fehler.

Ich habe auch festgestellt, dass es eine Zeile in/boot/config - $ (uname -r) gibt:

CONFIG_VERSION_SIGNATURE="Ubuntu 2.6.38-8.42-generic 2.6.38.2"

Weiß jemand, was das bedeutet? Ich sehe es nicht in der Konfigurationsdatei des Kernels, den ich baue.

7
roMoon

Der Kernel, aus dem Sie Ihr Kernel-Modul erstellen und in das Sie ein Modul einfügen, sollte dieselbe Version haben. Wenn Sie sich nicht um diese Sache kümmern möchten, können Sie folgendes Makefile verwenden.

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

Jetzt können Sie das Modul erstellen und versuchen, es einzufügen.

Ich schlage vor, dass Sie sich vor dieser Zeile als root anmelden 

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

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

Alternativ können Sie auch die folgende Make-Datei verwenden

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

Versuchen Sie es mit Cross Compile. Bitte schauen Sie sich den Code unten für die Make-Datei an. Achten Sie auf die Einrückung, andernfalls erhalten Sie möglicherweise einen Fehler wie fehlende Trennzeichen. Halt

obj-m += hello_.o #dieser Name sollte der Name Ihrer .c-Datei sein. Ich benutze nur Hallo zum Beispiel

Ich schlage vor, der beste Ansatz ist die Cross-Compilierung

Erstellen Sie eine Variable, die den Verzeichnisnamen enthält, in dem sich das Linux-Kernel-Verzeichnis befindet. Ändern Sie in meinem Beispiel den Wert "PATH_TO_LINUX_KERNEL_DIRECTORY" in einen tatsächlichen Pfadwert Beispiel ~/linux Sie müssen dies wirklich tun, damit die make-Datei wissen kann, wo Sie arm-linux-gnueabi- finden können. Andernfalls stoßen Sie wahrscheinlich auf Probleme mit 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