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:05] – [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 44: | Zeile 44: | ||
|Mit '' | |Mit '' | ||
- | Wir werden deshalb | + | Wir werden deshalb |
- | Gegen Sie die nachfolgende Zeile auf der Konsole ein: | + | Geben Sie die nachfolgende Zeile auf der Konsole ein: |
< | < | ||
Zeile 62: | Zeile 62: | ||
Falls Sie die nachfolgende Fehlermeldung bekommen wenn Sie '' | Falls Sie die nachfolgende Fehlermeldung bekommen wenn Sie '' | ||
+ | <WRAP center round important 100%> | ||
< | < | ||
gcc version check: mismatch between gcc (4.6.3) and / | gcc version check: mismatch between gcc (4.6.3) and / | ||
Skip this check with --skip-gcc</ | 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.1706281518.txt.gz · Zuletzt geändert: 2024/01/26 15:05 von torsten.roehl