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.ko
je ne peux pas le charger. Il dmesg
y 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?
linux
compiling
kernel-modules
user2799508
la source
la source
Réponses:
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 leModule.symvers
fichier 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-VARIANT
linux-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.config
qui a été utilisée lors de la compilation de votre noyau en cours d'exécution et exécutermake modules_prepare
. Il vous incombe de vérifier que tout correctif que vous avez apporté au noyau n'affecte pas la compatibilité binaire.la source