Comment faire pour compiler un module noyau linux pour Raspberry pi?
Je vais avoir des ennuis pour compiler un module du noyau pour un raspberry pi. Je veux compiler un "hello world" module de noyau à l'aide de la raspberry pi lui-même.
Je suis à l'aide de raspbian wheezy 3.6.11+.
J'ai essayé de suivre les instructions à http://elinux.org/RPi_Kernel_Compilation.
Voici le Makefile, je suis en utilisant:
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 pour bonjour-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 j'obtiens quand j'essaie de rendre 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 dans /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é. J'ai aussi installé la source de linux à l'aide de
sudo apt-get install linux-source
Toutes les idées sur ce que je pourrais faire pour obtenir cette compiler?
- Sur le Raspberry il n'y a pas de "construire" le sous-répertoire dans le répertoire des modules. J'ai pu confirmer que sur mon RPI. D'où la question: qu'est-Ce que la "bonne" façon de créer avec les données requises pour le module de construction?
- Puisque vous avez déjà reçu des réponses spécifiques, voici un bref aperçu sur les raisons du problème. Vous êtes à l'aide de la Raspberry Pi foundation noyau (le
raspberrypi-firmware
paquet dans Raspbian) qui ne fournit pas les en-têtes dont vous avez besoin pour faire des modules du noyau. Vous pouvez les installer à l'aide de la rpi-source outil. Ou de passer à Raspian le noyau de+en-têtes à la place (ajouter unfirmware
entrée aprèswheezy main contrib ...
dans/etc/apt/sources.lst
, packages de mise à jour, supprimerraspberrypi-firmware
, installerraspberrypi-firmware-nokernel
. - Grand instructions dans ce la question et la réponse j'ai compilé dans script
Vous devez vous connecter pour publier un commentaire.
Lors de la compilation d'un module de la
-C
paramètre doit pointer vers la source de l'arbre où le noyau a été construit (ne pas le ménage!). Si vous l'avez construite sur le pi sa probable dans un sous-répertoire de votre répertoire d'accueil.La
build
répertoire sous/lib/modules/<version>
est une Debian-ism, où un coupe-bas version de l'arbre source est fourni avec juste assez de contexte pour construire des modules contre. Les grains de la Raspberry Pi Foundation noyaux ne sont pas livrés avec unbuild
répertoire.Ils peuvent être un peu obsolète, mais raspbian fournit un noyau Debian-ensemble de style, qui devrait inclure les
build
répertoire que vous pouvez utiliser pour construire des modules de noyau contre.Voici les étapes que j'ai utilisé pour construire le Bonjour tout le Monde, le module du noyau sur Raspbian.
Effectuer
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 associés noyau pour être en mesure d'effectuer l'étape suivante.Installer et exécuter
rpi-source
pour installer le code source qui a construit le dernier noyau en cours d'exécution. Cela va créer une entrée correcte dans/lib/modules
pour le noyau en cours d'exécution. Remarque: vous n'avez pas besoin d'être root pour exécuter ce, cependant, le script va effectuer certaines tâches à l'aide desudo
et le mot de passe root vous sera demandé lors de l'exécution de script.Instructions pour installer
rpi-source
peut être trouvé à https://github.com/notro/rpi-source/wikiUne fois que ces étapes sont effectuées, vous devriez être en mesure de
make
le Bonjour tout le Monde, le module du noyau.rpi-source
. J'ai rencontré un Python d'erreur disant qu'il ne pouvait pas trouver /proc/config.gz. L'exécution desudo modprobe configs
il fixe.Vous devez les en-têtes du noyau (et le noyau binaire) pour la construction de votre module.
Comme Greg l'a dit, la distribution raspbian fournit les paquets :
Alors, dites-raspbian pour démarrer votre noyau nouvellement installé (3.10-3-rpi pour moi).
Ajouter ceci à la fin de l'
/boot/config.txt
et redémarrez votre Pi :Ensuite, modifiez votre fichier Makefile pour point fraîchement installé en-têtes du noyau :
Then, tell raspbian to boot your newly installed kernel (3.10-3-rpi for me).
Comment pouvez-vous dire de la version?C'était une douleur. J'ai dû compiler et installer un pilote en mode noyau.Après de longues recherches, j'ai obtenu les en-têtes pour pi 2 (3.18.7-v7+) à partir de ici.
Je travaillais sur le même échantillon sur mon RPI avec exactement le même noyau. J'ai réussi à compiler le module sur mon RPI, mais quand j'ai émis insmod j'ai reçu un message d'erreur. J'ai suivi les instructions ici sur une XUbuntu machine virtuelle (à l'aide de mon RPI du noyau de la version 3.6.y) et cela a fonctionné parfaitement. Je ne sais pas pourquoi compiler directement sur le RPI n'a pas de travail, qui va être un problème pour un autre jour.
J'ai dû modifier le Makefile pour correspondre à la nouvelle de l'environnement.
Je rencontre le même problème et résoudre le problème par
sudo apt-get install raspberrypi-kernel-headers