Ho appena fatto il mio primo modulo del driver, il modulo mondo Ciao seguente LDD3 Tuttavia purtroppo riscontrato questo errore:errore insmod: inserendo './hello.ko':. -1 formato modulo non valido"
insmod: error inserting './hello.ko': -1 Invalid module format.
sto facendo questo su Ubuntu 11.04, e il mio ambiente:
$ uname -r
2.6.38-8-generic
ho la sorgente del kernel in questo modo:
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
mio/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
e poi compilare il kernel
$sudo cp /boot/config-2.6.38-8-generic ./.config
$sudo make menuconfig -- load the .config file
$make
$make modules
e poi posso compilare il modulo del kernel
$make -C /usr/src/linux-source-2.6.38/linux-source-2.6.38 M=`pwd` modules
con Makefile:
obj-m := hello.o
e infine quando inserisco il modulo:
$sudo insmod hello_world.ko
insmod: error inserting 'hello_world.ko': -1 Invalid module format
quello che ho trovato in dmesg:
hello: disagrees about version of symbol module_layout
Allora qual è il problema?
Ho anche notato che la versione linux-header is -2.26.38-generic
e codice sorgente è -2.26.38, è questo il problema? ma non ho davvero trovato un pacchetto linux-source-2.26.38-generic
sul web.
aggiornamento di stato: ho trovato che il file/lib/moduels/$ (nome -r)/build/Makefile indicare la mia versione del kernel in esecuzione:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 38
EXTRAVERSION = .2
Così ho scaricare il linux-2.6. 38.2 e compilare, ma ancora lo stesso errore.
Ho anche scoperto che c'è una linea in/boot/config - $ (uname -r):
CONFIG_VERSION_SIGNATURE="Ubuntu 2.6.38-8.42-generic 2.6.38.2"
Se uno sa che cosa è questo? Non lo vedo nel file di configurazione del kernel che sto costruendo.
L'errore in 'insmod' suggerisce che il modulo è stato inserito in una diversa noleggia il kernel rispetto a quello su cui è stato compilato. Assicurati di avviare lo stesso kernel che stavi compilando ... – dragosht
@dragosht, puoi indicare come trovare il codice sorgente del kernel esatto che il mio sistema sta eseguendo? Il passo sopra è quello che ho trovato su google, ma ancora non funziona. – roMoon
uname -r mostra il kernel che viene avviato e per selezionare il kernel particolare, tenendo premuto il tasto Maiusc al momento dell'avvio. – Rusty