Je ne parviens pas à compiler un module de noyau pour un Raspberry Pi. Je souhaite compiler un module de noyau "hello world" à l’aide du Raspberry Pi lui-même.
J'utilise raspbian Wheezy 3.6.11+.
J'ai essayé de suivre les instructions sur http://elinux.org/RPi_Kernel_Compilation .
Voici le Makefile que j'utilise:
obj-m += hello-1.o
all:
make -C /lib/modules/$(Shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(Shell uname -r)/build M=$(PWD) clean
Voici le code source de hello-1.c:
/*
* hello-1.c - The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
Voici ce que je reçois quand j'essaie de réaliser le projet:
root@raspberrypi:/home/pi/hello-module# make
make -C /lib/modules/3.6.11+/build M=/home/pi/hello-module modules
make: *** /lib/modules/3.6.11+/build: No such file or directory. Stop.
make: *** [all] Error 2
J'ai essayé de créer le répertoire de construction à /lib/modules/3.6.11+
make -C /lib/modules/3.6.11+/build M=/home/pi/hello-module modules
make[1]: Entering directory `/lib/modules/3.6.11+/build'
make[1]: *** No rule to make target `modules'. Stop.
make[1]: Leaving directory `/lib/modules/3.6.11+/build'
make: *** [all] Error 2
J'ai GNU Make 3.81 et gcc (Debian 4.6.3-14 + rpi1) 4.6.3 installés. J'ai aussi installé la source Linux en utilisant
Sudo apt-get install linux-source
Des idées sur ce que je pourrais faire pour que cela soit compilé?
Lors de la compilation d'un module, le paramètre -C
doit pointer sur l'arborescence source dans laquelle le noyau a été construit (ne le nettoyez pas!). Si vous l'avez construit sur le pi, il est probable qu'il se trouve dans un répertoire de votre répertoire personnel.
Le répertoire build
sous /lib/modules/<version>
est un Debian-ism, où une version simplifiée de l’arborescence source est fournie avec juste assez de contexte pour construire des modules. Les noyaux des noyaux de la Fondation Raspberry Pi ne sont pas livrés avec un répertoire build
.
Ils sont peut-être un peu obsolètes, mais raspbian fournit un noyau sous forme de paquet de style Debian, qui devrait inclure le répertoire build
que vous pouvez utiliser pour créer des modules du noyau.
Sudo aptitude install linux-image-rpi-rpfv linux-headers-rpi-rpfv
Voici les étapes que j'ai utilisées pour construire le module de noyau Hello World sur Raspbian.
Exécuter Sudo rpi-update
Voir https://github.com/Hexxeh/rpi-update pour plus de détails sur rpi-update
. Vous devez être sur le dernier firmware et le noyau associé pour pouvoir passer à l'étape suivante.
Installez et exécutez rpi-source
pour installer le code source qui a généré le dernier noyau que vous exécutez. Cela créera l'entrée correcte dans /lib/modules
pour le noyau que vous exécutez. Remarque: vous n'avez pas besoin d'être root pour l'exécuter, mais le script effectuera certaines tâches à l'aide de Sudo
et le mot de passe root sera demandé lors de l'exécution du script.
Les instructions pour installer rpi-source
peuvent être trouvées à https://github.com/notro/rpi-source/wiki
Une fois ces étapes effectuées, vous devriez pouvoir make
le module de noyau Hello World.
johnma@raspberrypi ~/HelloWorld $ make
make -C /lib/modules/3.12.19+/build M=/home/johnma/HelloWorld modules
make[1]: Entering directory `/home/johnma/linux-c3db7205bcd8988cf7c185e50c8849542554b1f5'
CC [M] /home/johnma/HelloWorld/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/johnma/HelloWorld/hello.mod.o
LD [M] /home/johnma/HelloWorld/hello.ko
make[1]: Leaving directory `/home/johnma/linux-c3db7205bcd8988cf7c185e50c8849542554b1f5'
johnma@raspberrypi ~/HelloWorld $ Sudo insmod hello.ko
johnma@raspberrypi ~/HelloWorld $ tail -1 /var/log/syslog
May 15 13:45:39 raspberrypi kernel: [59789.169461] Hello World :)
johnma@raspberrypi ~/HelloWorld $ Sudo rmmod hello.ko
johnma@raspberrypi ~/HelloWorld $ tail -1 /var/log/syslog
May 15 13:46:10 raspberrypi kernel: [59819.503503] Goodbye World!
Vous avez d’abord besoin des en-têtes de noyau (et du binaire du noyau correspondant) pour construire votre module .
Comme le disait Greg, la distribution raspbian fournit les paquets:
Sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv
Ensuite, dites à Raspbian de démarrer votre noyau nouvellement installé (3.10-3-rpi pour moi) .
Ajoutez ceci à la fin de /boot/config.txt
et redémarrez votre Pi:
# Parameters to boot on raspbian kernel (linux-image-rpi-rpfv package)
kernel=vmlinuz-3.10-3-rpi
initramfs initrd.img-3.10-3-rpi followkernel
Ensuite, modifiez votre Makefile pour qu'il pointe les en-têtes du noyau récemment installés:
KERNEL_HEADERS=/lib/modules/$(Shell uname -r)/build
obj-m := hello-1.o
all:
@$(MAKE) -C $(KERNEL_HEADERS) M=$(PWD) modules
clean:
@$(MAKE) -C $(KERNEL_HEADERS) M=$(PWD) clean
C'était une douleur. J'ai dû compiler et installer un pilote en mode noyau. Après une longue recherche, j'ai obtenu les en-têtes de pi 2 (3.18.7-v7 +) de ici .
Sudo apt-get install dkms build-essential
wget http://www.niksula.hut.fi/~mhiienka/Rpi/linux-headers-rpi/linux-headers-3.18.7-v7%2b_3.18.7-v7%2b-2_armhf.deb
Sudo dpkg -i linux-headers-3.18.7-v7+_3.18.7-v7+-2_armhf.deb
Je travaillais sur le même échantillon exact sur mon RPI avec exactement le même noyau. J'ai réussi à compiler le module sur mon RPI, mais lorsque j'ai publié insmod, j'ai reçu une erreur. J'ai suivi les instructions ici sur une machine virtuelle XUbuntu (en utilisant la version 3.6.y du noyau de mon RPI) et cela a parfaitement fonctionné. Vous ne savez pas pourquoi la compilation directe sur le RPI n'a pas fonctionné, ce sera un problème pour un autre jour.
Je devais changer le Makefile pour correspondre au nouvel environnement.
obj-m += hello-1.o
all:
make Arch=arm CROSS_COMPILE=${CCPREFIX} -C /home/cstick/rpi/linux-rpi-3.6.y M=$(PWD) modules
clean:
make -C /home/cstick/rpi/linux-rpi-3.6.y M=$(PWD) clean
Je rencontre le même problème et je le répare simplement avec Sudo apt-get install raspberrypi-kernel-headers