Impossible de charger le module: n'est pas d'accord sur la version du symbole module_layout

12

Suite à ce tutoriel pour écrire mon premier pilote.

Le Makefile est:

# 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

Et le code du pilote est:

* 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");

Il n'y a aucune erreur lors de la création. Mais quand j'utilise insmod ofd.koje ne peux pas le charger. Il dmesgy est écrit:

n'est pas d'accord sur la version du symbole module_layout

  • uname -r renvoie '3.8.0-38-generic' et la source du noyau aussi 3.8.
  • modprobe -f ofd.ko échoue également

Aussi:

#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

Qu'est-ce qui se passe?

user2799508
la source
Quelques commentaires évidents. Premièrement, la source du noyau est-elle exactement la même que le noyau Ubuntu? Vous devez utiliser la source du noyau Ubuntu correspondant exactement à votre noyau. L'amont ne fonctionnera probablement pas, car les distributions corrigent leurs noyaux. Deuxièmement, afaik vous pouvez compiler avec les en-têtes du noyau, vous n'avez pas besoin de la source du noyau. Les en-têtes doivent également être disponibles sous forme de package binaire. Vous pouvez également consulter le manuel du noyau Debian , qui contient des informations instructives sur les noyaux, etc. sur Debian, qui s'applique également à Ubuntu.
Faheem Mitha

Réponses:

13

Le noyau Linux contient des structures de données dont la disposition varie non seulement d'une version à l'autre mais également en fonction des options de compilation. Par conséquent, lorsque vous compilez un module du noyau, vous devez avoir non seulement les fichiers d'en-tête de la source du noyau, mais également certains fichiers d'en-tête générés lors de la compilation du noyau. Décompresser simplement la source du noyau ne suffit pas.

Avec les noyaux construits avec le CONFIG_MODVERSIONS, le numéro de version peut différer, mais la disposition des structures de données doit être la même. Cette option est activée dans les noyaux Ubuntu. Avec cette option, en plus des en-têtes, les modules doivent être compilés avec le Module.symversfichier approprié . Ubuntu, comme la plupart des distributions, inclut ce fichier dans le même paquet que les en-têtes du noyau résultant de la compilation. Le paquet d'en-tête du noyau Ubuntu est appelé , par exemple .linux-headers-VERSION-VARIANTlinux-headers-3.8.0-38-generic

Avec les noyaux construits sans le CONFIG_MODVERSIONS(ce qui peut être le cas si vous avez compilé votre propre noyau), la vérification lors du chargement d'un module est une simple vérification de version. Vous pouvez prendre la source du noyau décompressée, copier celle .configqui a été utilisée lors de la compilation de votre noyau en cours d'exécution et exécuter make modules_prepare. Il vous incombe de vérifier que tout correctif que vous avez apporté au noyau n'affecte pas la compatibilité binaire.

Gilles 'SO- arrête d'être méchant'
la source