Benutzer-Werkzeuge

Webseiten-Werkzeuge


raspberry_pi_kernelprogrammierung:helloworld

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
raspberry_pi_kernelprogrammierung:helloworld [2024/01/26 15:13] – [2. Hallo Welt Modul erstellen und übersetzen (compilieren)] torsten.roehlraspberry_pi_kernelprogrammierung:helloworld [2024/01/26 15:49] (aktuell) – [3. Testen des "Hallo Welt" Moduls] torsten.roehl
Zeile 44: Zeile 44:
 |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).| |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.+Wir werden deshalb erst einmal 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:+Geben Sie die nachfolgende Zeile auf der Konsole ein:
 <code> sudo rpi-update</code> <code> sudo rpi-update</code>
  
Zeile 73: Zeile 73:
 rpi-source </code> rpi-source </code>
  
-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.+Die erste Zeile installiert das Programm rpi-source, und in der zweiten Zeile wird es dann aufgerufen. Im Homeverzeichnis wird ein Verzeichnis namens "linuxangelegt. Dieses Verzeichnis ist ein Link auf das Verzeichnis "linux-c3db7205bcd8988cf7c185e50c8849542554b1f5"das sich ebenfalls im Homeverzeichnis befindet. Die heruntergeladene Datei (linux-c3db7205bcd8988cf7c185e50c8849542554b1f5.tar.gz) kann, um Speicherplatz zu sparen, gelöscht werden.
  
 <WRAP center  box 100%> <WRAP center  box 100%>
 Box: RPI-SOURCE  Box: RPI-SOURCE 
  
-Mehr zum rpi-source Programm:   https://github.com/notro/rpi-source/wiki+Mehr zum ''rpi-source'' Programm:   https://github.com/notro/rpi-source/wiki
  
 Insbesondes wenn Sie die nachfolgende Fehlermeldung bekommen, sollten Sie so vorgehen wie im Link beschrieben, um auch den richtigen Compiler (GCC Version) zu bekommen. Insbesondes wenn Sie die nachfolgende Fehlermeldung bekommen, sollten Sie so vorgehen wie im Link beschrieben, um auch den richtigen Compiler (GCC Version) zu bekommen.
Zeile 121: Zeile 121:
 </Code> </Code>
  
 +== Erläuterung ==
 Das Einbinden  der Header-Dateien (*.h). So sind z.B. __init und __exit in init.h definiert. Das Einbinden  der Header-Dateien (*.h). So sind z.B. __init und __exit in init.h definiert.
  
Zeile 147: 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 ''make''.
 +
 +
 +
 +
 +<code>ifneq ($(KERNELRELEASE),)
 +   obj-m := hello_world.o
 + 
 + else
 +   KDIR := /lib/modules/$(shell uname -r)/build
 +   PWD := $(shell pwd)
 + 
 + default:
 +   $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
 + endif</code>
 +
 +
 +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 //"Tab"// (Tabulatortaste) beginnen.
 +
 +Um nicht an dieser Stelle zu scheitern, empfehle ich, dieses Makefile downzuloaden: ''kernel.zip''.
 +Angenommen, im Verzeichnes ''kernel'' befinden sich nun die Dateien ''helloworld.c'' und ''Makefile'', dann genügt ein einfacher Aufruf von ''make'', um das Modul zu erstellen.
 +<code>pi@raspberrypi ~/kernel $ make</code>
 +Damit ''make'' weiß, was es tun soll, sollte man sich im Verzeichnis kernel befinden.
 +
 ==== 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 //Kernelmodule// zu laden, entladen u.s.w.
 +
 +Um das Modul zu laden/entladen, werden //Rootrechte// benötigt.  
 +
 +Folgende Programme (''modutils'') werden verwendet:
 +
 +  * ''modinfo'': liefert Informationen über ein Modul 
 +  * ''insmod'': fügt zur Laufzeit Module in den Linux-Kernel ein
 +  * ''lsmod'': zeigt alle geladenen Module an
 +  * ''rmmod'': entfernt Laufzeitmodule aus dem Kernel
 +
 +=== Beispiel ===
 + Hier die Ausgabe des ''modinfo''-Programms:
 +
 +<code>pi@raspberrypi ~/kernel $ modinfo hello_world.ko
 +filename:       /home/pi/kernel/hello_world.ko
 +description:    Sample hello_world kernel module
 +author:         Torsten Röhl <devel@physics4school.de>
 +license:        GPL
 +srcversion:     793A736C473976825C9475C
 +depends:        
 +vermagic:       3.12.19+ preempt mod_unload modversions ARMv6 </code>
 +
 +Laden des Moduls:
 +<code>pi@raspberrypi ~/kernel $ sudo insmod hello_world.ko</code>
 +Überprüfen, ob das Modul korrekt geladen wurde:
 +
 +<code>spi@raspberrypi ~/kernel $ lsmod | grep hello_world
 +hello_world              735  0 </code>
 +
 +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:
 +<code>pi@raspberrypi ~/kernel $ sudo rmmod hello_world.ko</code>
 +
 +Lohnend ist auch ein Blick in die Datei ''/var/log/messages'':
 +
 +<code># cat /var/log/messages
 +May 16 16:24:38  kernel: Hello World: init_helloworld
 +May 16 16:26:16 kernel: GoodBye World: exit_helloworld</code>
  
 ===== Zusammenfassung ===== ===== Zusammenfassung =====
raspberry_pi_kernelprogrammierung/helloworld.1706282034.txt.gz · Zuletzt geändert: 2024/01/26 15:13 von torsten.roehl