web-dev-qa-db-fra.com

Comment compiler un module de noyau pour Raspberry pi?

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é?

22
user3025582

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
13
Greg

Voici les étapes que j'ai utilisées pour construire le module de noyau Hello World sur Raspbian.

  1. 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.

  2. 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!
12
HeatfanJohn

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
9
JayDee

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
8
Ryu_hayabusa

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
0
cstick

Je rencontre le même problème et je le répare simplement avec Sudo apt-get install raspberrypi-kernel-headers

0
Michael Hou