Modul kann nicht geladen werden: Nicht einverstanden mit der Version des Symbols module_layout

12

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.koich es nicht laden. Darin dmesgsteht:

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?

user2799508
quelle
Einige offensichtliche Kommentare. Erstens ist die Kernelquelle genau die gleiche wie der Ubuntu-Kernel? Sie sollten die Ubuntu-Kernelquelle verwenden, die genau Ihrem Kernel entspricht. Upstream wird wahrscheinlich nicht funktionieren, da Distributionen ihre Kernel patchen. Zweitens, afaik Sie können gegen die Kernel-Header kompilieren, brauchen Sie nicht die Kernel-Quelle. Die Header sollten auch als Binärpaket verfügbar sein. Vielleicht möchten Sie auch einen Blick in das Debian-Kernel-Handbuch werfen , das lehrreiche Informationen zu Kerneln usw. auf Debian enthält, das auch für Ubuntu gilt.
Faheem Mitha

Antworten:

13

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 richtige Module.symversDatei 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-VARIANTlinux-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ühren make modules_prepare. Sie müssen überprüfen, ob Patches, die Sie für den Kernel erstellt haben, die Binärkompatibilität nicht beeinträchtigen.

Gilles 'SO - hör auf böse zu sein'
quelle