Nach diesem Tutorial schreibe ich meinen ersten Treiber.
Das Makefile ist:
# Makefile – makefile of our first driver
# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
obj-m := ofd.o
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
KERNEL_SOURCE := /usr/src/linux 3.8
PWD := $(shell pwd)
default:
${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules
clean:
${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif
Und der Treibercode lautet:
* ofd.c – Our First Driver code */
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>
static int __init ofd_init(void) /* Constructor */
{
printk(KERN_INFO "Namaskar: ofd registered");
return 0;
}
static void __exit ofd_exit(void) /* Destructor */
{
printk(KERN_INFO "Alvida: ofd unregistered");
}
module_init(ofd_init);
module_exit(ofd_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>");
MODULE_DESCRIPTION("Our First Driver");
Beim Erstellen tritt kein Fehler auf. Aber wenn ich es benutze, kann insmod ofd.ko
ich es nicht laden. Darin dmesg
steht:
ist nicht einverstanden mit der Version des Symbols module_layout
uname -r
gibt '3.8.0-38-generic' zurück und die Kernelquelle auch 3.8.modprobe -f ofd.ko
scheitert auch
Ebenfalls:
#56~precise1-Ubuntu SMP Thu Mar 13 16:23:47 UTC 2014
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.4 LTS
Release: 12.04
Codename: precise
Was ist los?
linux
compiling
kernel-modules
user2799508
quelle
quelle
Antworten:
Der Linux-Kernel enthält Datenstrukturen, deren Layout nicht nur von Version zu Version, sondern auch von den Kompilierungsoptionen abhängt. Wenn Sie ein Kernelmodul kompilieren, benötigen Sie daher nicht nur die Header-Dateien aus der Kernel-Quelle, sondern auch einige Header-Dateien, die während der Kernel-Kompilierung generiert werden. Das bloße Entpacken der Kernelquelle reicht nicht aus.
Bei Kerneln, die mit dem erstellt wurden
CONFIG_MODVERSIONS
, kann die Versionsnummer unterschiedlich sein, das Layout der Datenstrukturen muss jedoch identisch sein. Diese Option ist in den Ubuntu-Kerneln aktiviert. Mit dieser Option müssen zusätzlich zu den Headern Module für die richtigeModule.symvers
Datei kompiliert werden. Ubuntu enthält, wie die meisten Distributionen, diese Datei im selben Paket wie die Kernel-Header, die sich aus der Kompilierung ergeben. Das Ubuntu-Kernel-Header-Paket heißt z .linux-headers-VERSION-VARIANT
linux-headers-3.8.0-38-generic
Bei Kerneln, die ohne das erstellt wurden
CONFIG_MODVERSIONS
(was der Fall sein kann, wenn Sie Ihren eigenen Kernel kompiliert haben), ist die Überprüfung beim Laden eines Moduls eine einfache Versionsprüfung. Sie können die entpackte Kernelquelle nehmen.config
, die beim Kompilieren Ihres laufenden Kernels verwendete kopieren und ausführenmake modules_prepare
. Sie müssen überprüfen, ob Patches, die Sie für den Kernel erstellt haben, die Binärkompatibilität nicht beeinträchtigen.quelle