Benutzer-Werkzeuge

Webseiten-Werkzeuge


raspberry_pi_kernelprogrammierung:helloworld

Dies ist eine alte Version des Dokuments!


Raspberry Pi Kernelprogrammierung: HelloWorld

Dieses Projekt führt in die Linux-Kernelprogrammierung für den Raspberry Pi ein. Das klassische „HelloWorld“-Programm ist nun ein minimales Kernel-Modul. Kernelprogrammierung gehört zu den anspruchsvolleren Themen der Linuxprogrammierung. Dennoch - der Einstieg in die große Welt des Linux-Kernels ist gar nicht so schwierig.

Ein Kernel-Modul ist eine Software, die zur Laufzeit in den Kernel eingebunden und auch wieder entfernt werden kann. Dies ist eine sehr elegante Methode, denn sie hält den eigentlichen Laufzeitkernel schlank. Nur diejenigen Module, die tatsächlich benötigt werden, brauchen so geladen zu werden. Außerdem ermöglicht diese Methode auch eine bequeme Softwareentwicklung, da der Rechner nicht jedesmal neu gestartet werden muss, um Änderungen am Modul zu registrieren. Kernel-Module werden z.B. für folgende Anwendungen benötigt:

  • Gerätetreiber
  • Netzwerktreiber
  • Treiber für Dateisysteme
  • Systemcalls

Wann immer man also „echte“ Hardware ansteuern will, wird ein Kernel-Modul (Kerneltreiber) benötigt.

Ein Kernel-Modul zur Ansteuerung des GPIO-Ports des Raspberry Pi kann 250 mal schneller sein als ein herkömmlicher Zugriff auf die Ports!

Voraussetzung

  • Gute Linuxkenntnisse und C-Programmierung.
  • Getestet wurde mit Rasbian Debian-Wheezy, d.h. ein Raspberry Pi mit installiertem Linux-System muss zur Verfügung stehen.

Grundsätzlich ist ein Raspberry Pi nicht notwendig um ein Kernel-Modul zu programmieren, dann muss aber auf dem Entwicklungsrechner (Hostrechner) eine sogenannte Cross-Entwicklungsumgebung eingerichtet werden, worauf dieser Abschnitt aber nicht eingeht (siehe http://elinux.org/RPi_Kernel_Compilation ). Die in diesem Abschnitt erklärte Methode unterscheidet sich auch von der auf „offiziellen“ Methode, wie sie auf elinux.org beschrieben wurde. Die dort beschriebene Methode erfordert mehr Fachwissen, insbesondere wenn nicht alles wie vorgegeben abläuft. Die hier vorgestellte Vorgehensweise erstellt auch keinen neuen Kernel, was ausgesprochen bequem ist, denn das erstellen eines Kernel auf dem Raspberry Pi kann 10-12 Stunden dauern.

Überblick

Die Quellen des Linux-Kernels müssen installiert werden, um einen Treiber (Treiber werden in der Regel als Kernel-Modul zur Verfügung gestellt) übersetzen zu können. Außerdem muss das System für die Modul Programmierung konfiguriert werden.

  1. Kernel-Quellen (auch Kernel-Header genannt) herunterladen
  2. Hallo Welt Modul erstellen und übersetzen (compilieren)
  3. Testen des „Hallo Welt“ Moduls

Details

1. Kernel-Quellen (auch Kernel-Header genannt) herunterladen

Es können nicht irgendwelche Kernel-Quellen heruntergeladen werden, sondern nur die, die zu dem installierten Betriebssystem passen. Auch muss das erstellte Kernel-Modul genau (Versionsmatching) zum laufenden Kernel passen, da der Kernel sonst seine Zusammenarbeit verweigert. In diesem Fall können wir das Modul gar nicht erst laden. Außerdem müssen die verwendeten Programme wie z.B. insmod, modprobe, lsmod, rmmod oder gcc zum kompilierten Kernel passen.

Mit uname -r kann die Version des Installierten Kernel in Erfahrung gebracht werden. Es handelt sich hier um einen Kernel 3.10 (Patchlevel 10, Sublevel 25).

Wir werden deshalb ersteinmal den Raspberry Pi auf den aktuellen Stand setzen und anschließend die Kernel-Version ermitteln, die heruntergeladen werden muss.

Gegen Sie die nachfolgende Zeile auf der Konsole ein:

 sudo rpi-update

Mehr zum rpi-update Programm unter https://github.com/Hexxeh/rpi-update.

Mit sudo apt-get install rpi-update kann das Programm gegebenenfalls nachinstalliert werden.

Nach dem Update steht jetzt der Kernel 3.12 (Patchlevel 12, Sublevel 19) zur Verfügung. Für diesen Kernel müssen nun die Kernel-Quellen heruntergeladen werden.

Als nächstes müssen die Kernelheader (Kernel-Quellen) installiert werden, damit man in der Lage ist, ein Kernel-Modul auch übersetzen zu können.

Falls Sie die nachfolgende Fehlermeldung bekommen wenn Sie rpi-source aufrufen, sollten Sie die Anweisung in der RPI-SOURCE Box berücksichtigen und Anschließend noch einmal rpi-source aufrufen.

ERROR:
gcc version check: mismatch between gcc (4.6.3) and /proc/version (4.7.2)
Skip this check with --skip-gcc
sudo wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source -O /usr/bin/rpi-source && sudo chmod +x /usr/bin/rpi-source && /usr/bin/rpi-source -q --tag-update

rpi-source 

Die erste Zeile installiert das Programm rpi-source in der zweiten Zeile wird es dann aufgerufen. Im Homeverzeichnis wird ein Verzeichnis linux angelegt. Dieses Verzeichnis ist ein Link auf das Verzeichnis linux-c3db7205bcd8988cf7c185e50c8849542554b1f5, was sich ebenfalls im Homeverzeichnis befindet. Die Heruntergelade Datei (linux-c3db7205bcd8988cf7c185e50c8849542554b1f5.tar.gz) kann, um Speicherplatz zu sparen, gelöscht werden.

2. Hallo Welt Modul erstellen und übersetzen (compilieren)

Vom Quellcode zum Modul:

3. Testen des "Hallo Welt" Moduls

Zusammenfassung

Auch wenn der Quellcode keine zwanzig Zeilen lang ist, gibt es bei der Erstellung jedoch diverse Fehlermöglichkeiten. Wenn alles bis hier geklappt hat, wurde jedoch eine Menge erreicht:

  • Die Kernelquellen und modutils sind installiert und lauffähig.
  • Der Kompiler und make sind lauffähig.
  • Das fertige Kernel-Modul hello_world.ko wurde erfolgreich zur Laufzeit in den Kernel geladen und entladen.

Ein komplettes System für die Kernelentwicklung auf dem Raspberry Pi steht nun zur Verfügung.

Literatur

  • Jürgen Quade, Eva-Katharina Kunst: Linux-Treiber entwickeln (dpunkt.verlag)
  • Jürgen Quade: Embedded Linux lernen mit dem Raspberry (dpunkt.verlag)
raspberry_pi_kernelprogrammierung/helloworld.1706281609.txt.gz · Zuletzt geändert: 2024/01/26 15:06 von torsten.roehl