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?
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
Hier sind die Schritte, die ich zum Aufbau des Hello World-Kernelmoduls auf Raspbian verwendet habe.
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.
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!
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
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
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
Ich treffe das gleiche Problem und repariere es einfach mit Sudo apt-get install raspberrypi-kernel-headers