2013-11-23 9 views
21

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

Ich benutze Raspbian Wheezy 3.6.11 +.

Ich versuchte, die Anweisungen unter http://elinux.org/RPi_Kernel_Compilation zu folgen.

Hier ist das Makefile 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"); 
} 

Hier ist, was ich bekomme, wenn ich versuche, das Projekt zu machen:

[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 versuchte, das Build-Verzeichnis auf /lib/modules/3.6.11+ 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 installierte auch die Linux-Quelle

sudo apt-get install linux-source

Irgendwelche Ideen auf, was mit ich tun könnte, um dies zu kompilieren?

+0

Auf dem Raspberry gibt es kein Unterverzeichnis "build" im Modulverzeichnis. Ich konnte das auf meinem RPI bestätigen. Daher die Frage: Was ist der "richtige" Weg, um die erforderlichen Daten für den Modulaufbau zu erstellen? – Black

+0

Da Sie bereits einige konkrete Antworten erhalten haben, hier ein kurzer Überblick über die Gründe für das Problem. Sie verwenden den Kernel der Raspberry Pi-Foundation (das Raspbian-Firmware-Paket in Raspbian), der keine Header zur Verfügung stellt, die Sie zum Erstellen von Kernel-Modulen benötigen. Sie können sie entweder mit dem Tool [rpi-source] (https://github.com/notro/rpi-source/wiki) installieren. Oder wechseln Sie stattdessen zu den Kernel + Headern von Raspians (fügen Sie einen 'firmware' Eintrag nach' wheezy main contrib ... 'in'/etc/apt/sources.lst' hinzu, aktualisieren Sie Pakete, entfernen Sie 'raspberrypi-firmware', installieren Sie 'raspberrypi- firmware-nokernel'. – nh2

+0

Tolle Anweisungen in dieser [Frage und die Antwort] (http://raspberrypi.stackexchange.com/q/39845/26266) Ich kompilierte in [ein Skript] (https://github.com/x29a /kernel/blob/master/rpi/prepare.sh) – x29a

Antwort

0

Ich arbeitete an genau der gleichen Probe auf meinem RPI mit dem exakt gleichen Kernel. Ich habe es geschafft, das Modul auf meinem RPI zu kompilieren, aber als ich Insmod ausgegeben habe, habe ich einen Fehler erhalten. Ich folgte den Anweisungen here auf einer virtuellen XUbuntu-Maschine (mit der Kernel-Version 3.6.y meines RPI) und es funktionierte perfekt. Ich bin mir nicht sicher, warum das direkte Zusammenstellen auf dem RPI nicht funktioniert hat, das wird ein Problem für einen anderen Tag sein.

Ich musste das Makefile ändern, um der neuen Umgebung zu entsprechen.

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 
11

Wenn ein Modul der -C Kompilieren Parameter an den Quellbaum, wo der Kernel gebaut wurde (nicht aufräumen!) Anweisen. Wenn Sie es auf dem Pi erstellt haben, ist es wahrscheinlich in einem Verzeichnis unter Ihrem Home-Verzeichnis.

Das build Verzeichnis unter /lib/modules/<version> ist ein Debian-ism, wo eine eingeschränkte Version des Quellbaums mit gerade genug Kontext zum Erstellen von Modulen zur Verfügung gestellt wird. Die Kernel der Raspberry Pi Foundation-Kernel werden nicht mit einem build-Verzeichnis ausgeliefert.

Sie mögen etwas veraltet sein, aber raspbian bietet einen Kernel als Paket im Debian-Stil an, das das Verzeichnis build enthalten sollte, mit dem Sie Kernelmodule erstellen können.

9

Sie benötigen zuerst Kernel-Header (und die entsprechende Kernel-Binärdatei), um Ihr Modul zu erstellen.
Wie Greg sagte, die raspbian Verteilung der Pakete bietet:

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

Dann sagen raspbian neu installierten Kernel (3,10-3-RPI für mich) zu booten.
das Anfügen am Ende des /boot/config.txt und starten Sie Ihren 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 

Dann ändern Sie Ihre Makefile die frisch installierten Kernel-Header Punkt:

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

'Dann, sag raspbian, um deinen neu installierten Kernel zu booten (3.10-3-rpi für mich)." Wie kannst du die Version sagen? – gromit190

11

Hier sind die Schritte, die ich den Bau verwendet Hello World kernel module auf Raspbian.

  1. Perform sudo rpi-update

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

  2. Installieren und starten Sie rpi-source, um den Quellcode zu installieren, der den zuletzt ausgeführten Kernel erstellt hat. Dies erzeugt den korrekten Eintrag in /lib/modules für den Kernel, den Sie ausführen. Hinweis: Sie müssen nicht root sein, um dies auszuführen, jedoch führt das Skript bestimmte Aufgaben unter Verwendung von sudo aus und das root-Passwort wird während der Ausführung des Skripts angefordert.

    Anleitung rpi-source installieren können https://github.com/notro/rpi-source/wiki

gefunden werden Sobald diese Schritte durchgeführt werden, sollten Sie die Hallo Welt Kernel-Modul 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! 
+2

Danke, das hat wunderbar funktioniert Der einzige Fehler, den ich hatte, war "rpi-source". Ich habe einen Python-Fehler gefunden, der besagt, dass /proc/config.gz nicht gefunden werden konnte. Das Ausführen von 'sudo modprobe configs' hat es behoben. –

8

Das war ein Schmerz. Ich musste einen Kernel-Modus-Treiber kompilieren und installieren. Nach langer Suche bekam ich die Header für Pi 2 (3.18.7-v7 +) von here.

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

Das ist großartig! – Hengjie

+0

Bei der Installation die linux headers bekomme ich den folgenden Fehler: "./arch/arm/include/asm/memory.h:24:25: fatal erro r: mach/memory.h: Keine solche Datei oder Verzeichnis ". Irgendwelche Gedanken? – gromit190