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:10] – [2. Hallo Welt Modul erstellen und übersetzen (compilieren)] 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 73: | Zeile 73: | ||
rpi-source </ | 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 | + | Die erste Zeile installiert das Programm rpi-source, und in der zweiten Zeile wird es dann aufgerufen. Im Homeverzeichnis wird ein Verzeichnis |
<WRAP center | <WRAP center | ||
Box: RPI-SOURCE | Box: RPI-SOURCE | ||
- | Mehr zum rpi-source Programm: | + | Mehr zum '' |
Insbesondes wenn Sie die nachfolgende Fehlermeldung bekommen, sollten Sie so vorgehen wie im Link beschrieben, | Insbesondes wenn Sie die nachfolgende Fehlermeldung bekommen, sollten Sie so vorgehen wie im Link beschrieben, | ||
Zeile 92: | Zeile 92: | ||
==== 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 ''/ | + | Ein minimales Kernel-Modul wird nun übersetzt. Dazu legen wir im Verzeichnis ''/ |
+ | <Code C linenums: | ||
+ | # | ||
+ | # | ||
- | Das Einbinden | + | /* 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 '' | Mit dem '' | ||
Zeile 109: | Zeile 147: | ||
=== 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.1706281834.txt.gz · Zuletzt geändert: 2024/01/26 15:10 von torsten.roehl