raspberry_pi_kernelprogrammierung:helloworld
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
raspberry_pi_kernelprogrammierung:helloworld [2024/01/26 15:01] – [1. Kernel-Quellen (auch Kernel-Header genannt) herunterladen] torsten.roehl | raspberry_pi_kernelprogrammierung:helloworld [2024/01/26 15:49] (aktuell) – [3. Testen des "Hallo Welt" Moduls] torsten.roehl | ||
---|---|---|---|
Zeile 41: | Zeile 41: | ||
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. | 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. | ||
- | {{ : | + | |{{ : |
+ | |Mit '' | ||
+ | Wir werden deshalb erst einmal den Raspberry Pi auf den aktuellen Stand setzen und anschließend die Kernel-Version ermitteln, die heruntergeladen werden muss. | ||
+ | Geben Sie die nachfolgende Zeile auf der Konsole ein: | ||
+ | < | ||
+ | |||
+ | |||
+ | |||
+ | <WRAP center round info 100%> | ||
+ | Mehr zum rpi-update Programm unter https:// | ||
+ | |||
+ | Mit '' | ||
+ | </ | ||
+ | |{{ : | ||
+ | |Nach dem Update steht jetzt der Kernel 3.12 (Patchlevel | ||
+ | |||
+ | 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 '' | ||
+ | <WRAP center round important 100%> | ||
+ | < | ||
+ | gcc version check: mismatch between gcc (4.6.3) and / | ||
+ | Skip this check with --skip-gcc</ | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | rpi-source </ | ||
+ | |||
+ | Die erste Zeile installiert das Programm rpi-source, und in der zweiten Zeile wird es dann aufgerufen. Im Homeverzeichnis wird ein Verzeichnis namens " | ||
+ | |||
+ | <WRAP center | ||
+ | Box: RPI-SOURCE | ||
+ | |||
+ | Mehr zum '' | ||
+ | |||
+ | Insbesondes wenn Sie die nachfolgende Fehlermeldung bekommen, sollten Sie so vorgehen wie im Link beschrieben, | ||
+ | |||
+ | Der Link beschreibt warum die folgenden Befehle angewandt werden müssen. Vergessen Sie nicht anschließend, | ||
+ | < | ||
+ | sudo update-alternatives --install / | ||
+ | sudo update-alternatives --install / | ||
+ | sudo update-alternatives --config gcc | ||
+ | sudo apt-get install libncurses5-dev</ | ||
+ | </ | ||
==== 2. Hallo Welt Modul erstellen und übersetzen (compilieren) ==== | ==== 2. Hallo Welt Modul erstellen und übersetzen (compilieren) ==== | ||
+ | Ein minimales Kernel-Modul wird nun übersetzt. Dazu legen wir im Verzeichnis ''/ | ||
+ | |||
+ | |||
+ | <Code C linenums: | ||
+ | # | ||
+ | # | ||
+ | |||
+ | /* Metainformation */ | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | /* Loads the module in the kernel */ | ||
+ | | ||
+ | { | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | /* Removes the module from kernel */ | ||
+ | | ||
+ | { | ||
+ | | ||
+ | } | ||
+ | |||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | == Erläuterung == | ||
+ | Das Einbinden | ||
+ | |||
+ | Mit dem MODULE_XXX-Makros können Metainformationen gesetzt werden. Sie können mit dem modinfo tool ausgelesen werden, lediglich das Makro MODULE_LICENCE ist obligatorisch. | ||
+ | |||
+ | Die Funktion init_helloworld | ||
+ | Die Funktion exit_helloworld | ||
+ | |||
+ | Die beiden Makros module_init und module_exit sorgen dafür, dass man die Funktionsnamen (hier init_helloworld und exit_helloworld) frei wählen kann. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Das Einbinden | ||
+ | |||
+ | Mit dem '' | ||
+ | |||
+ | Die Funktion '' | ||
+ | Die Funktion '' | ||
+ | |||
+ | Die beiden Makros '' | ||
+ | Die Datei kann mit einem Editor (z.B. Kate oder vi) erstellt werden. | ||
+ | |||
+ | |||
+ | |||
=== Vom Quellcode zum Modul: === | === Vom Quellcode zum Modul: === | ||
+ | |||
+ | Um ein vollständiges Kernel-Modul zu erstellen, muss der Quellcode noch übersetzt werden. Das Übersetzen (Kompilieren) des Quellcodes (Sourcecode) in ein ausführbares Programm erledigt man am besten mit einer Steuerdatei (Makefile) und dem Programm '' | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | obj-m := hello_world.o | ||
+ | |||
+ | else | ||
+ | KDIR := / | ||
+ | PWD := $(shell pwd) | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | Beim Makefile ist auf einiges zu achten, z.B.: | ||
+ | |||
+ | * Die Datei muss exakt Makefile geschrieben werden. | ||
+ | * Die Zeilen 2, 5, 6 und 9 müssen mit //" | ||
+ | |||
+ | Um nicht an dieser Stelle zu scheitern, empfehle ich, dieses Makefile downzuloaden: | ||
+ | Angenommen, im Verzeichnes '' | ||
+ | < | ||
+ | Damit '' | ||
+ | |||
==== 3. Testen des "Hallo Welt" Moduls ==== | ==== 3. Testen des "Hallo Welt" Moduls ==== | ||
+ | |||
+ | Um das Modul zu testen werden die Modul-Utilities benötigt. Darunter versteht man einen Satz von Hilfsprogrammen, | ||
+ | |||
+ | Um das Modul zu laden/ | ||
+ | |||
+ | Folgende Programme ('' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | === Beispiel === | ||
+ | Hier die Ausgabe des '' | ||
+ | |||
+ | < | ||
+ | filename: | ||
+ | description: | ||
+ | author: | ||
+ | license: | ||
+ | srcversion: | ||
+ | depends: | ||
+ | vermagic: | ||
+ | |||
+ | Laden des Moduls: | ||
+ | < | ||
+ | Überprüfen, | ||
+ | |||
+ | < | ||
+ | hello_world | ||
+ | |||
+ | Um die Ausgabe von lsmod nicht zu lang zu machen, können wir mit grep hello_world nach hello_world suchen. Die Ausgabe zeigt an, dass die Suche erfolgreich war, d.h. das Modul korrekt geladen wurde. | ||
+ | |||
+ | Entladen des Moduls: | ||
+ | < | ||
+ | |||
+ | Lohnend ist auch ein Blick in die Datei ''/ | ||
+ | |||
+ | < | ||
+ | May 16 16: | ||
+ | May 16 16:26:16 kernel: GoodBye World: exit_helloworld</ | ||
===== Zusammenfassung ===== | ===== Zusammenfassung ===== |
raspberry_pi_kernelprogrammierung/helloworld.1706281268.txt.gz · Zuletzt geändert: 2024/01/26 15:01 von torsten.roehl