2016-07-14 10 views
1

Ich lerne jetzt Kernel-Modul, also habe ich ein Ubuntu 16.04 mit kernel 4.4.0-28-generic in einer virtuellen Maschine eingerichtet.Kernel-Modul lernen, module.ko Ursache Modul ist bereits geladen?

Ich installierte diese

Pakete
# dpkg -l | grep linux 
ii console-setup-linux     1.108ubuntu15       all   Linux specific part of console-setup 
ii libselinux1:amd64     2.4-3build2        amd64  SELinux runtime shared libraries 
ii linux-base       4.0ubuntu1        all   Linux image base package 
ii linux-firmware      1.157.2         all   Firmware for Linux kernel drivers 
ii linux-generic      4.4.0.28.30        amd64  Complete Generic Linux kernel and headers 
ii linux-headers-4.4.0-28    4.4.0-28.47        all   Header files related to Linux kernel version 4.4.0 
ii linux-headers-4.4.0-28-generic  4.4.0-28.47        amd64  Linux kernel headers for version 4.4.0 on 64 bit x86 SMP 
ii linux-headers-generic    4.4.0.28.30        amd64  Generic Linux kernel headers 
ii linux-image-4.4.0-28-generic   4.4.0-28.47        amd64  Linux kernel image for version 4.4.0 on 64 bit x86 SMP 
ii linux-image-extra-4.4.0-28-generic 4.4.0-28.47        amd64  Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP 
ii linux-image-generic     4.4.0.28.30        amd64  Generic Linux kernel image 
ii linux-libc-dev:amd64     4.4.0-28.47        amd64  Linux Kernel Headers for development 
ii linux-sound-base      1.0.25+dfsg-0ubuntu5      all   base package for ALSA and OSS sound systems 
ii linux-source       4.4.0.28.30        all   Linux kernel source with Ubuntu patches 
ii linux-source-4.4.0     4.4.0-28.47        all   Linux kernel source for version 4.4.0 with Ubuntu patches 
ii util-linux       2.27.1-6ubuntu3.1      amd64  miscellaneous system utilities 

ich dekomprimiert bereits den Kernel Quellcode-Paket /usr/src/linux-source-4.4.0.tar.bz2 zu /home/test/WorkSpace/Kernel/linux-source-4.4.0.

Mein System uname ist

# uname -a 
Linux ubuntu-ldm 4.4.0-28-generiC#47-Ubuntu SMP Fri Jun 24 10:09:13 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 

und ich schreibe ein Testmodul hello.c

#include <linux/init.h> 
#include <linux/module.h> 

MODULE_LICENSE("Dual BSD/GPL"); 

static int hello_init (void) { 
     printk (KERN_ALERT "Hello, World\n"); 
     return 0; 
} 

static void hello_exit (void) { 
     printk (KERN_ALERT "Goodbye, cruel world\n"); 
} 

module_init (hello_init); 
module_exit (hello_exit); 

Makefile

obj-m += module.o 

module-objs := hello.o 

all: 
     make modules M=`pwd` -C /home/test/WorkSpace/Kernel/linux-source-4.4.0 

clean: 
     make modules clean M=`pwd` -C /home/test/WorkSpace/Kernel/linux-source-4.4.0 

Aber etwas verwirrt mich. Ich mache mein Modul und versuchen zu insmod, und ich habe einen Fehler

# sudo insmod module.ko 
insmod: ERROR: could not insert module module.ko: Invalid module format 

Welche Ursache dieser Fehler?

Habe ich eine falsche Version der Kernelquelle verwendet?


für osgx

Es gibt keine zusätzliche Zeile in der Ausgabe von dmesg nachdem ich insmod versuchen. Die modinfo zeigt diese

# modinfo module.ko 
filename:  /home/test/WorkSpace/LDM/hello/module.ko 
license:  Dual BSD/GPL 
depends: 
vermagic:  4.4.13 SMP mod_unload 

Ich versuche, den Quellpfad in der Datei Makefile zu ändern, remake es, und ich erhalte die neue .ko

Die modinfo des neuen .ko ist

# modinfo module.ko 
filename:  /home/joshua/WorkSpace/LDM/hello/module.ko 
license:  Dual BSD/GPL 
srcversion:  82C361DBCB1C9BB5CA1DB07 
depends: 
vermagic:  4.4.0-28-generic SMP mod_unload modversions 

Aber das Problem ist immer noch da, und die dmesg Protokoll sieht wie folgt aus

[ 28.540701] module: module verification failed: signature and/or required key missing - tainting kernel 
[ 28.540879] module: module is already loaded 

Es sieht aus wie ein Modul module bereits im System benannt ist, so dass ich versuchen, die Zielnamen in dem Makefile-hello.o zu ändern, die neuen Zielnamen als hello.ko machen, danach das Modul funktioniert. Wenn ich lsmod | grep module lief, gibt es kein Modul mit dem Namen module?

+0

Joshua, Sie haben keine zusätzliche Zeilen in Ausgabe von 'dmesg' Befehl nach solchen insmod? Was ist die Ausgabe von 'modinfo' auf Ihrem Modul? Versuchen Sie, mit 'make module M = \' pwd \ '-C/lib/modules/$ (uname -r)/build' zu bauen - das ist Build-Verzeichnis für Ihren aktuellen Kernel mit korrekter Konfiguration, nicht nur 4.4.0 kernel.org (sie sind anders, du solltest genau für deinen Kernel gebaut werden; in ubuntu gibt es dkms https://en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support, um das Modul beim Kernel-Update neu zu kompilieren). – osgx

+0

@osgx Ich habe die Frage für die neue Info-Formatierung aktualisiert. –

+1

Nennen Sie es nicht modul.ko dann nennen Sie es etwas anderes! –

Antwort