Linux Kernel Module - HS Esslingen
Document Details
Uploaded by RevolutionaryFern2779
Hochschule Esslingen
Profs. Grewe & Keller
Tags
Summary
This document is a lecture on Linux Kernel Module. It covers various topics such as what a Linux kernel module is, how to manage them, develop your own, and practical exercises. The lecture notes include summaries, diagrams and examples.
Full Transcript
BETRIEBSSYSTEME (BS) VI. LINUX KERNEL MODULE PROF. DR.-ING. RAINER KELLER PROF. DR. DENNIS GREWE 1 AGENDA l Was ist der Linux Kernel? l Was sind Linux Kernel Module und wie funktionieren sie? l Wie verwalte ich Module mittels systemnahen Programmen? l...
BETRIEBSSYSTEME (BS) VI. LINUX KERNEL MODULE PROF. DR.-ING. RAINER KELLER PROF. DR. DENNIS GREWE 1 AGENDA l Was ist der Linux Kernel? l Was sind Linux Kernel Module und wie funktionieren sie? l Wie verwalte ich Module mittels systemnahen Programmen? l Wie entwickle ich ein eigenes Linux Kernel Modul? 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 2 ZIELE l Wissen wie Linux Module aufgebaut sind! l Wissen wie man Linux Kernel Module selbst programmieren kann? l Zusammenführung des bisher gelernten… 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 3 QUIZ ZUR WIEDERHOLUNG https://partici.fi/54815345 [Bild von vecstock auf Freepik] 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Systemaufrufe & Interrupts 4 WIEDERHOLUNG LINUX HISTORIE 5 LINUX RELEASES l 09.1991 Linux v0.01 10.239 Lines-of-code (LOC) l 12.1991 Linux v0.11 (ohne MINIX) l 02.1991 Linux v0.12 unter GPL l 03.1991 X Windows System ~40k LoC 20k Benutzer l 03.1994 Linux v1.0 176.250 LoC 100k Benutzer l 03.1995 Linux v1.2 310.950 LoC l 06.1996 Linux v2.0 716.119 LoC l 01.1999 Linux v2.2 1.800.847 LoC l 01.2001 Linux v2.4 3.377.902 LOC l 12.2003 Linux v2.6 5.929.913 LOC, bis 2011, dann 3.0-Schema l 01.2012 Linux v3.2 14.998.651 LOC l 10.2015 Linux v4.2.3. 18.756.142 LOC l 11.2019 Linux v5.8.3 24.711.894 LOC l 02.2022 Liunx v5.16.11 29.086.702 LOC (Unser Stable-Kernel) l 11.2022 Linux v6.1 ~28.000.000 LOC 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 6 ÜBERSICHT: LINUX KERNEL l Die Struktur des Linux Kernel hat sich seit Beginn nicht geändert: l documentation/ (Alles über Linux) l arch/ (Architektur-abhängige Dateien, z.B. x86) l drivers/ (Alle Low-Level Treiber für Hardware!!!) l fs/ (Schnittstelle und Code für Filesysteme!) l include/ (Alle C-Header Dateien) l init/ (Einsprung nach dem Booten: start_kernel) l kernel/ (Architektur-unabhängige Schnittstellen) l mm/ (Memory Management Schnittstelle) l net/ (Netzwerk Schnittstelle – ohne Treiber) l Wir werden uns Interrupts und Scheduler unter kernel anschauen l Aber zunächst wollen wir den Linux-Kernel übersetzen. 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 7 WIE FINDET MAN SICH IM LINUX KERNEL ZURECHT? l Die interaktive Webseite Linux Kernel- Map bietet eine gute Möglichkeit sich die Struktur des Linux Kernels anzusehen. l Aktuell bis Linux v5.1 (2022) 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 8 LINUX KERNEL MODULE Quelle: [Image by freepik] 9 WAS IST EIN LINUX KERNEL MODUL? Anwendungsprogramme Grafische Benutzeroberfläche l Linux Module sind Softwarekomponenten, welche dynamisch in den Systemnahe Programme Bibliotheken Kernel eines laufenden Linux-Systems geladen oder entfernt werden OS (Kern+Module) Software Hardware können. l Linux Module erweitern die Funktionalität des Kernels, ohne dass ein Neustart des Systems erforderlich ist. l Linux Kernel Module werden häufig verwendet, um Hardware-Treiber (Grafik, Netzwerkkarten), Dateisysteme (NTFS Festplatten, Mac Partition), Netzwerkprotokolle oder andere Kernelfunktionen bereitzustellen. 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 10 WO FINDE ICH LINUX KERNEL MODULE? l Die compilierten/ übersetzten Linux Module liegen in den Verzeichnissen unterhalb von /lib/modules/VERSION/, wobei VERSION die Versionsnummer des Kernels ist. l Linux Kernel Module sind Objektdateien, die in den laufenden Kernel nachgeladen werden; wie in der Programmiersprache C die.o-Dateien plus weitere Daten -> Dateien mit Endung.ko (kernel object) last SretwelchRemel Libmodules 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 11 WO FINDE ICH LINUX KERNEL MODULE? l Linux Kernel Module sind spezielle Objektdateien mit der Endung.ko (kernel object): Virtueller Speicher: Prozess main() Text / OS-Mment:... Code myfunc() Segment PID... Ressourcen myvar=0 Data... mama=42 Segment Register: Alloc. HEAP IP Speicher Speicher SP RAX IP-RetAddr Stack int i; Segment int myval; RDX... 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 13 UNTERSCHIED LINUX MODULE ZU „NORMALEN” PROGRAMMEN l Keine main() Funktion l während C-Programme unter Unix als Prozess in der main() Funktion gestartet werden. l Werden nicht rein sequentiell ausgeführt l Modul registriert sich Handler für bestimmte Events bei der Initialisierung l Können während der Ausführung unterbrochen werden l Bspw. durch mehrfachen Aufruf aus Threads einer Anwendung unterliegen diese Interrupts l Haben eine höhere Ausführungspriorität l Kernel Module laufen mit höherer Priorität und mehr Rechte um bestimmte Instruktionen auszuführen l Dürfen keine Fließkommaoperation ausführen 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 14 SYSTEMNAHE PROGRAMME FÜR LINUX MODULE Anwendungsprogramme Grafische Benutzeroberfläche l Für die Interaktion mit Linux Modulen gibt es systemnahe Programme Systemnahe Programme Bibliotheken die zur Verwaltung herangezogen werden können: OS (Kern+Module) Software l lsmod↵ # Liste der derzeit geladenen Module Hardware l depmod↵ # Dependencies (Abhängigkeiten) erkennen l modprobe↵ # Module & Dependencies aus /lib/modules laden l insmod↵ # Ein bestimmtes Modul (auch im CWD!) laden l rmmod↵ # Ein Modul wieder entfernen l modinfo↵ # Modulinformationen wie z.B. Funktion, Parameter (allesamt aus Section.modinfo!) anzeigen. l Und weiter Tools die auf diesen aufbauen, z.B.: l udevd↵ # lädt automatisch Module, sobald Gerät angeschlossen l automount↵# macht Dateisystem dem OS bekannt, sobald angeschlossen 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 15 HILFREICHE TOOLS LINUX MODULE PROGRAMME Quelle: [Image by Freepik] 16 LINUX MODULE PROGRAMM: MODINFO l Informationen zu einem Module liefert das Programm modinfo: l $ modinfo rfcomm↵ # Zeige alle Modulinfos zu ‘rfcomm‘ filename: /lib/modules/3.5.0-18- generic/kernel/net/bluetooth/rfcomm/rfcomm.ko alias: bt-proto-3 alias: pci:v00001283d... license: GPL version: 1.11 description: Bluetooth RFCOMM ver 1.11 author: Marcel Holtmann srcversion: CC35386D02177A222DBB63D depends: bluetooth intree: Y vermagic: 3.5.0-18-generic SMP mod_unload modversions 686 parm: disable_cfc:Disable credit based flow cntrl (bool)m 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 17 LINUX MODULE PROGRAMM: DEPMOD l Mittels depmod werden Abhängigkeiten zwischen Modulen ermittelt und in einer Datenbank abgespeichert. Eine Beispielausgabe der Datenbank: l $ cat /lib/modules/3.XXX.0-27-ray/modules.dep↵ l... kernel/drivers/video/nvidia/nvidiafb.ko: kernel/drivers/video/fb_ddc.ko l d.h. der NVIDIA-Framebuffer Treiber benötigt den FB Data-Display-Channel Treiber (welcher die Monitor-Auflösung mittels DDC/EDID ausliest)… l depmod muss immer ausgeführt werden, sobald Module mit Abhängigkeiten geändert wurden l Hinweis: das macht make modules_install automatisch in Hintergrund 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 19 LINUX MODULE PROGRAMM: MODPROBE l Das Tool modprob ist ein „Allrounder“ und kann Module l mit allen Abhängigkeiten laden, l Kann „Aliase“ (andere Namen für ein Modul) umwandeln l Abhängigkeiten anzeigen lassen und l Module wieder entladen l Aber: l Es arbeitet nur mit Modulen welche in (Unter-)Verzeichnissen unter /lib/modules/VERSION/ abgelegt sind 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 20 LINUX MODULE PROGRAMM: INSMOD & RMMOD l Das Tool insmod fügt ein Modul zur Laufzeit dem Kernel hinzu: l $ insmod ↵ # Einfügen von l Beispiel: l $ insmod./modul.ko↵ # Einfügen aus diesem Verzeichnis l Das Tool rmmod entfernt das Modul aus dem Kernel: l $ rmmod ↵ # Entlädt 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 21 WIEDERHOLUNG: STRACE l Das Tool strace zeigt alle Systemcalls (mit Parameter und Rückgabe) für jeden systemnahen Programmaufruf auf der Konsole an: l $ strace ↵ # Nachverfolgung von 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 22 LINUX KERNEL MODUL LADEN (II) l Das laden eines Modules in den Kernel können wir uns mittels strace “anschauen“: l $ cd /lib/modules/3.11.5/kernel/drivers/block # wechseln in Verzeichnis mit Modulen l $ sudo strace insmod floppy.ko ↵ # Laden des Moduls floppy.ko 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 23 LINUX MODULE PROGRAMM: PCIUTILS l Das Paket pciutils beinhaltet Tools zum Auflisten und Verwalten von Geräten am PCI-Bus. PCI-Geräte haben eine eindeutige Nummer: l $ lspci↵ 00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge 00:01.0 Ethernet controller: Red Hat, Inc. Virtio network device 00:02.0 Display controller: Red Hat, Inc. Virtio GPU (rev 01) l In pciutils gibt es das Programm pcimodules: l $ pcimodules↵ # Liste v. Modulen für inst. PCI-Geräte l D.h. man kann die kleinste Anzahl an Modulen ermitteln, die man für (PCI-) Geräteunterstützung benötigt! 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 25 AI MACHEN SIE AM RECHNER MIT HANDS-ON TIME LINUX MODULE PROGRAMME Quelle: [Image by Freepik] 26 LINUX KERNEL MODUL LADEN (I) l Starten Sie die Ubuntu VM l Loggen Sie sich als User „test“ ein (pw: „test“) l Starten Sie ein Terminal (CTRL + T) 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 27 EIGENES LINUX KERNEL MODUL BAUEN (I) l Der Linux Kernel ist in der Programmiersprache C entwickelt; also auch die Module. l Es gibt keine (User-Space) Bibliotheken, z.B.: libc, auf die wir zurückgreifen können … l Alle Funktionen kommen vom Kernel und dessen Modulen und müssen mittels und in das Programm „inkludiert“ werden. 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 28 EIGENES LINUX KERNEL MODUL BAUEN (II) l Ein einfaches Linux Kernel Modul sieht wie folgt aus: // C-Preprocessor directives #include #include MODULE_LICENSE(”GPL"); __init int my_init_module(void) { printk(KERN_DEBUG ”Hello\n"); return 0; } __exit void my_cleanup_module(void) { } module_init(my_init_module); module_exit(my_cleanup_module); 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 29 EIGENES LINUX KERNEL MODUL ÜBERSETZEN (III) l Das Modul von Hand zu übersetzen ist schwierig, da Abhängigkeitsbaum zu Kernel, Header- Dateien, Versions-Info, gcc, etc. fehlen: l Linux macht es uns mit einem Makefile einfach: # Makefile für eigenes Kernel Module obj-m = linux_module.o # Name der Objekt-Datei dieses Moduls # Kernelversion für die übersetzt warden soll; hier durch ‘uname’ gegeben KVERSION = $(shell uname -r) # das Makefile-Target ‘modules’ kenn wir schon und bauen damit alle Module # im derzeitigen Directory modules all: make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules clean: make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 30 EIGENES LINUX KERNEL MODUL ÜBERSETZEN (IV) l Anschließend wird make genutzt um das Modul zu bauen: l $ make modules↵ # Alle Kommandos v. Target modules im Makefile; verbose V=1' make -C /lib/modules/3.5.0-18/build M=/mnt/../linux_module modules make: Entering dir /usr/src/linux-headers-3.5.0-18-generic CC [M] /mnt/../linux_module/linux_module.o Building modules, stage 2. MODPOST 1 modules CC /mnt/../linux_module/linux_module.mod.o LD [M] /mnt/../linux_module/linux_module.ko l Anschließend kann das Modul geladen werden: l $ insmod./linux_module.ko l Und es anzeigen lassen mittels lsmod: Huch, warum >12kB? 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 31 BESONDERHEITEN BEI MODULEN: PRINTK()-FUNKTION l Die printk()-Funktion schreibt Text, welche das Device /dev/kmesg sammelt, bzw. vom Programm dmesg ausgegeben werden. l Der printk()-Funktion kann man einen Log-Level mitgeben: l KERN_DEBUG "7" wird typischerweise ausgefiltert l KERN_INFO "6" Einfache Information l KERN_NOTICE "5" Nachricht an Benutzer l KERN_WARNING "4" Warnung l KERN_ERR "3" Fehler, sollte nicht ignoriert werden l KERN_CRIT "2" Kritischer Zustand! l KERN_ALERT "1" Problem, Benachrichtigung d. Users! l KERN_EMERG "" Notfall, System wohl tot... l Diese Log-Level Strings werden dem Text vorangestellt (kein Komma) l printk(KERN_DEBUG "Just read Byte:%d\n", byte); l Das Programm sysctl mit kernel.printk kann das filtern! 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 32 BESONDERHEITEN BEI MODULEN: MAKROS l Folgende Makros werden in Linux Modulen definiert: l MODULE_LICENSE: Gibt die Source-Code Lizenz für dieses Module an. Sollte kein Open Source unter GPL- Code gesetzt sein, wird der Kernel nach dem Laden auf “Tainted” gesetzt. Ein Kernel-Oops (Linux-Äquivalent zu einem Blue-Screen of Death) würde dieses TAINT beinhalten... l MODULE_AUTHOR: Der / Die Autoren des Modules l MODULE_DESCRIPTION: Die Kurzbeschreibung des Modules l MODULE_VERSION: Die Versionsnummer als String 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 33 BESONDERHEITEN BEI MODULEN: PARAMETER l Beim Laden eines Modules können Parameter übergeben werden. Hierfür müssen Variablen vorab definiert werden: static char *name = "world"; // Statische Variable // Module Parameter bekannt machen: // name ist ein „Char pointer“, also ein String // S_IRUGO String darf nur gelesen, nicht geändert werden module_param(name, charp, S_IRUGO); // Eine Beschreibung zu dieser Variable MODULE_PARM_DESC(name, "The name to display"); l Beim Laden des Modules: insmod module name=Yeah l Andere erlaubte Datentypen für Modulparameter sind: byte, short, ushort, int, uint, long, ulong = unsigned long; charp (character pointer) = String; bool = Boolean, also 0/1, y/n oder Y/N; invbool = inverted Boolean, also (0=true) oder (Y=false) 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 34 WEITERE QUELLEN UND LITERATUR l Jürgen Quade, Eva-Katharina Kunst: Linux-Treiber entwickeln: Eine systematische Einführung in die Gerätetreiber- und Kernelprogrammierung, Okt. 2015, dpunkt.Verlag l Frau Kunst‘s Kolumne „Kern-Technik“ im Linux-Magazin: bspw. in Ausgabe 12/2016 die Folge 89 über „Raspberry PI 3 64-Bit Programmierung“ 01.10.2024 Profs. Grewe & Keller | Betriebssysteme | Linux Kernel 35