it-swarm.com.de

Wie kompiliere ich ein Kernel-Modul für Raspberry Pi?

Ich habe Probleme beim Kompilieren eines Kernel-Moduls für einen Raspberry Pi. Ich möchte ein "Hallo Welt" -Kernel-Modul mit dem Raspberry Pi selbst kompilieren.

Ich verwende Raspbian Wheezy 3.6.11+.

Ich habe versucht, den Anweisungen unter http://elinux.org/RPi_Kernel_Compilation zu folgen.

Hier ist das Makefile, das ich verwende:

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

Hier ist der Quellcode für Hallo-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");
}

Folgendes bekomme ich, wenn ich versuche, das Projekt zu realisieren:

[email protected]:/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

Ich habe versucht, das Build-Verzeichnis unter /lib/modules/3.6.11+ zu erstellen

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

Ich habe GNU Make 3.81 und gcc (Debian 4.6.3-14 + rpi1) 4.6.3 installiert. Ich habe auch die Linux-Quelle mit installiert 

Sudo apt-get install Linux-Quelle

Irgendwelche Ideen, was ich tun könnte, um das zu kompilieren?

22
user3025582

Beim Kompilieren eines Moduls sollte der -C-Parameter auf den Quellbaum verweisen, in dem der Kernel erstellt wurde (bereinigen Sie ihn nicht!). Wenn Sie es auf dem Pi aufgebaut haben, ist es wahrscheinlich in einem Verzeichnis unter Ihrem Heimatverzeichnis.

Das Verzeichnis build unter /lib/modules/<version> ist ein Debian-Ism, in dem eine abgespeckte Version des Quellbaums gerade genug Kontext enthält, um Module daraus zu erstellen. Die Kernel der Raspberry Pi Foundation-Kernel werden nicht mit einem build-Verzeichnis ausgeliefert.

Sie sind zwar etwas veraltet, aber Raspbian stellt einen Kernel als Debian-Paket bereit, das das build-Verzeichnis enthalten sollte, in dem Kernel-Module erstellt werden können.

Sudo aptitude install linux-image-rpi-rpfv linux-headers-rpi-rpfv
13
Greg

Hier sind die Schritte, die ich zum Aufbau des Hello World-Kernelmoduls auf Raspbian verwendet habe.

  1. Ausführen Sudo rpi-update

    Siehe https://github.com/Hexxeh/rpi-update für Details zum rpi-update. Sie müssen sich auf der neuesten Firmware und dem zugehörigen Kernel befinden, um den nächsten Schritt ausführen zu können.

  2. Installieren und führen Sie rpi-source aus, um den Quellcode zu installieren, der den neuesten Kernel erstellt hat, den Sie ausführen. Dadurch wird der richtige Eintrag in /lib/modules für den Kernel erstellt, den Sie ausführen. Hinweis: Sie müssen nicht als root angemeldet sein, das Skript führt jedoch bestimmte Aufgaben mit Sudo aus, und das root-Kennwort wird während der Skriptausführung angefordert.

    Anweisungen zur Installation von rpi-source finden Sie unter https://github.com/notro/rpi-source/wiki

Sobald diese Schritte ausgeführt wurden, sollten Sie das Hello World-Kernelmodul make können.

[email protected] ~/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'

[email protected] ~/HelloWorld $ Sudo insmod hello.ko
[email protected] ~/HelloWorld $ tail -1 /var/log/syslog
May 15 13:45:39 raspberrypi kernel: [59789.169461] Hello World :)

[email protected] ~/HelloWorld $ Sudo rmmod hello.ko
[email protected] ~/HelloWorld $ tail -1 /var/log/syslog
May 15 13:46:10 raspberrypi kernel: [59819.503503] Goodbye World!
12
HeatfanJohn

Sie benötigen zunächst Kernel-Header (und die entsprechende Kernel-Binärdatei), um Ihr Modul zu erstellen .
Wie Greg sagte, stellt die Raspbian-Distribution die Pakete bereit:

Sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv

Dann sagen Sie Raspbian, dass es Ihren neu installierten Kernel booten soll (3.10-3-rpi für mich) .
Hängen Sie dies am Ende von /boot/config.txt an und starten Sie Ihren Pi neu:

# 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

Ändern Sie dann Ihr Makefile so, dass es auf die neu installierten Kernel-Header verweist:

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

Das war ein Schmerz. Ich musste einen Kernelmodustreiber kompilieren und installieren. Nach langer Suche bekam ich die Header für pi 2 (3.18.7-v7 +) von hier .

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

Ich habe an genau demselben Beispiel an meinem RPI mit demselben Kernel gearbeitet. Ich habe es geschafft, das Modul auf meinem RPI zu kompilieren, aber als ich insmod herausgab, erhielt ich einen Fehler. Ich folgte den Anweisungen hier auf einer virtuellen XUbuntu-Maschine (unter Verwendung der Kernel-Version 3.6.y meines RPI) und es hat perfekt funktioniert. Nicht sicher, warum das direkte Kompilieren über das RPI nicht funktioniert hat, wird dies für einen anderen Tag ein Problem sein.

Ich musste das Makefile an die neue Umgebung anpassen.

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

Ich treffe das gleiche Problem und repariere es einfach mit Sudo apt-get install raspberrypi-kernel-headers

0
Michael Hou