OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch <[email protected]> basierend auf Slides von Bernhard Frömel Institut für Technische Informatik Technische Universität Wien 182.709 Betriebssysteme UE SS16 Mai 2016 1 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Motivation Linux ist erweiterbar – beispielsweise per Einbindung von HW: I Digital Video Broadcasting (DVB) PCI card, IP over Satellite I (LCD) Displays: echo ’Hello World!’ > /dev/disp 2 OSUE Linux Kernel Modul Bonusbeispiel Überblick Christian Hirsch I Kernel Module und Device Drivers I Kernel Modul Build Prozess I Character Devices I Übungsumgebung I Bonus Beispiel 3 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Der Linux Kernel Kernel Modul Appplication vs. Kernel Modul Teil I Kernel Module und Device Drivers Device Drivers 4 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Der Linux Kernel Kernel Modul Appplication vs. Kernel Modul Device Drivers 5 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Komplexizität vs Fehler Wenn Bugs auftreten, dann oft trotzdem schwer zu beheben Der Linux Kernel Kernel Modul Appplication vs. Kernel Modul Device Drivers http://www.phoronix.com/scan.php?page=news_ item&px=MTg1MDc http://codemonkey.org.uk/ 2015/01/08/closure-nasty-bug/ 6 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Allgemeines I Linux Kernel ist monolithisch (gesamtes OS im Ring 0) I Loadable Kernel Module (LKM) Unterstützung Der Linux Kernel Kernel Modul Appplication vs. Kernel Modul Device Drivers I I I erweitern den Kernel um zusätzliche Funktionalität entwickeln, laden und entfernen von Modulen zur System-Laufzeit insbesondere gut geeignet für Device Drivers (Gerätetreiber) I I I nur benötigte Treiber zu tatsächlich vorhandenen Geräten werden geladen vereinfachte Entwicklung (kein Reboot erforderlich) ”Module Stacking”, d.h. aufeinander aufbauende Module, möglich (modprobe(3)) 7 OSUE Linux Kernel Modul Bonusbeispiel A split view of the kernel The System Call Interface Christian Hirsch Der Linux Kernel Kernel Modul Appplication vs. Kernel Modul Device Drivers Process management Memory management Filesystems Device control Networking Concurrency, multitasking Virtual memory Files and dirs: the VFS Ttys & device access Connectivity Archdependent code Memory manager File system types Character devices Network subsystem Kernel subsystems Features implemented Software support Block devices IF drivers Hardware CPU Memory Disks & CDs Consoles, etc. Network interfaces features implemented as modules 8 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Kernel Modul (1) I Der Linux Kernel Kernel Module sind immer serviceorientiert: I Kernel Modul Appplication vs. Kernel Modul Device Drivers I I Keine externen Bibliotheken (insb. keine libc!), aber viele ”bekannte” Funktionen trotzdem vertreten I I I Beim Ladevorgang ”einhängen” in Kernelstrukturen, bzw. Bekanntmachung, welche Services angeboten werden Danach nur noch Bearbeitung von Requests Formatierten String ausgeben: printk (linux/kernel.h) linux/string.h: strcpy, strcat, memset, ... Limitierte Stackgröße: 8 KByte 9 OSUE Linux Kernel Modul Bonusbeispiel Kernel Modul (2) Christian Hirsch I Der Linux Kernel Gleichzeitigkeit (Concurrency) beachten! I Kernel Modul I I Appplication vs. Kernel Modul Device Drivers Sequentieller Code kann immer unterbrochen werden (schon beim Laden des Moduls! –> ”Module Loading Races”) I I Scheduling/Preemption Interrupts (e.g., kernel timers) Symmetric Multi Prozessor (SMP) auf saubere Synchronisation bei shared resources (globale Variablen, Devices, ...) achten! I ”manuelle” Freigabe von Ressourcen notwendig: kein ”Garbage Collector” - auch nicht bei Modulentfernung per rmmod(8)! I Portabilität wichtig: keine Annahmen über Seiten- und Wortgröße, Endianess, . . . treffen. 10 OSUE Linux Kernel Modul Bonusbeispiel (Userspace) Applikation vs. Kernel Modul Christian Hirsch Der Linux Kernel Kernel Modul Appplication vs. Kernel Modul Device Drivers Kriterium Funktion Parameter ”Entry Point” ”Exit Point” Bibliotheken Stack Größe Floating Point Zugriffsverletz. Res. Freigabe Sprache Applikation Kernel Modul task/serviceorientiert nur serviceorientiert Mod. Parameter argv main Funktion ”beliebig” System (libc, libm, ...) MByte ja Segmentation Fault Termination ”beliebig” module_init module_exit nur Kernel KByte nein (CPU context) Kernel Fault keine/Neustart GNU C (C99 Std) 11 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Der Linux Kernel (Userspace) Applikation oder Kernel Modul? ’Rule of thumb’: Alles was im Userspace einfacher implementierbar ist, sollte im Userspace implementiert werden. Fails: I Band ’netcat’ veröffentlicht Album als Linux Kernel Modul1 Kernel Modul Appplication vs. Kernel Modul Device Drivers Their ”music” sounds like one of those sleep CDs.. Charliemopps, Slashdot 1 http://entertainment.slashdot.org/story/14/04/23/2241209/bandreleases-album-as-linux-kernel-module 12 OSUE Linux Kernel Modul Bonusbeispiel Device Drivers (1) Christian Hirsch Der Linux Kernel Kernel Modul I Gerät wird hinter wohldefiniertem Programmierinterface abstrahiert (File in /dev/, Ausnahme: Netzwerkgeräte in Linux nicht unter /dev/ auffindbar) I Policy vs. Mechanism: Treiber soll I Appplication vs. Kernel Modul Device Drivers I I Hauptklassen von Device Treibern I I I I keine (möglichst wenige) Regeln/Richtlinien bezüglich seiner Verwendung dem User aufzwingen die gesamte (möglichst komplette) Hardwarefunktionalität anbieten Character Device (Stream) Block Device (Blocks) Network Device (Packets) Einteilung nach Subsystem: USB, SCSI, Firewire, . . . 13 OSUE Linux Kernel Modul Bonusbeispiel Security Christian Hirsch Der Linux Kernel Kernel Modul Appplication vs. Kernel Modul Device Drivers I Kernel hat ”max. Rechte” im System, d.h. Sicherheitsprobleme im Kernel bedeuten Sicherheitsprobleme im System I typische Security-Bugs: I I I Bufferoverflows Information-Leakage Unchecked User-Input 14 OSUE Linux Kernel Modul Bonusbeispiel Lizenzierung Christian Hirsch Der Linux Kernel Kernel Modul Appplication vs. Kernel Modul I Linux lizenziert unter Version 2 der General Public License (GPL)2 I Deklarierung der Lizenz per MODULE_LICENSE Makro I Proprietäre Module (d.h. Module die nicht GPLv2 kompatibel lizenziert sind) im Kernel ”toleriert” I Proprietäre Module erhalten aber nicht das komplette Kernel API, Umgehungstaktiken: Device Drivers I Linuxant: MODULE_LICENSE ( "GPL\0 f o r f i l e s i n the \"GPL\" d i r e c t o r y ; f o r others , only LICENSE f i l e a p p l i e s " ) ; I 2 Nvidia: open-source glue code, proprietärer Treibercode im closed source binary-blob Free vs Open Source, R. Stallman, https://www.youtube.com/watch?v=Ag1AKIl_2GM 15 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Setup Beispiel Teil II Build Prozess 16 OSUE Linux Kernel Modul Bonusbeispiel Kernel Quellen Christian Hirsch I Setup Kernel Quellen enthalten neben dem Kernel selbst I Beispiel I I I Build System basierend auf Unix Make, –> <kernel_source>/Documentation/kbuild Interfaces für User-Space Applikationen und Kernel Module (Header Files) Unterstützung für zahlreiche Architekturen Device Driver I Linux Kernel Archiv: www.kernel.org I ”configured” Kernel-tree passend zum Laufzeitkernel (uname -a) um gebautes Module laden zu können I I I oft erhältlich als Package in Distributionen (linux-headers-...) (Symlink /usr/src/linux sollte auf Kernelquellen verweisen) Devel- & Testsystem (e.g. Virtual Machine, . . . ) sinnvoll 17 OSUE Linux Kernel Modul Bonusbeispiel Compilieren eigener Kernel Module Christian Hirsch Setup I “out-of-tree” Builds möglich I dabei Makefile ”two-faced” Beispiel I Bei Ausführung im Modulquellverzeichnis: Wechsel in Kernel Source Directory und Ausführung des eigentlichen Kernel Makefiles um das Modul zu übersetzen $(MAKE) -C $(KERNELDIR) M=$(PWD) modules I Bei Kernel-Build Einbindung: wird zu Makefilefragment, das die gesamte Compile-Info für Kernel-Build Vorgang enthält obj-m := cmod1.o cmod2.o ... I Laden und Entfernen von Modulen per insmod(8) und rmmod(8) als Superuser (”root”) zur Laufzeit möglich I aktuelle Liste der geladenen Module: lsmod(8) 18 OSUE Linux Kernel Modul Bonusbeispiel Hello World Modul, ’Makefile’ Christian Hirsch Setup Beispiel % (for kernel build) obj-m := hello_world.o % (for module build) KERNELDIR = /usr/src/linux all: modules modules modules_install clean: $(MAKE) V=1 ARCH=um -C ${KERNELDIR} M=$(PWD) $@ 19 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Setup Beispiel Hello World Modul, ’hello_world.c’ #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("GPL"); static int mod_init(void) { printk(KERN_ALERT "Hello World!\n"); return 0; } static void mod_exit(void) { printk(KERN_ALERT "Bye World!\n"); } module_init(mod_init); module_exit(mod_exit); 20 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Character Devices File Operationen Kernelspace Lifecycle Teil III Character Devices 21 OSUE Linux Kernel Modul Bonusbeispiel Character Devices Christian Hirsch Character Devices File Operationen I zeichenorientierte Geräte, die sich wie Files verhalten z.B. Maus, Keyboard, Serial, ... I implementieren meist open, close, read und write File Operationen I oft nur sequentiell les/schreibbar (z.B. /dev/ttyS0) Kernelspace Lifecycle 22 OSUE Linux Kernel Modul Bonusbeispiel Major/Minor Number Christian Hirsch Character Devices I Special File (mknod(1)) in /dev/ referenziert Device per Typ, Major und Minor Device Number I Dynamische Anforderung (alloc_chrdev_region) od. statische Zuweisung (register_chrdev_region) möglich I Kernel verwaltet Character Devices in struct cdev, die als Member struct file_operations enthält. I Dabei ist struct inode die Kernel-interne Repräsentation einer Datei, und struct file die eines offenen Dateideskriptors File Operationen Kernelspace Lifecycle 23 OSUE Linux Kernel Modul Bonusbeispiel File Operationen Christian Hirsch Character Devices File Operationen Kernelspace Lifecycle I struct file_operations (linux/fs.h) enthält Function Pointer als Members: z.B. int (*open)(struct inode *,struct file *); int (*release) (struct inode *, struct file *); int (*unlocked_ioctl) (struct inode *, struct file *, unsigned int, unsigned long); (ioctl vs. unlocked_ioctl: http://lwn.net/Articles/119652/) ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); loff_t (*llseek) (struct file *, loff_t, int); 24 OSUE Linux Kernel Modul Bonusbeispiel File Operationen I Device Treiber kann Default-Verhalten der File Operationen ”überschreiben” Character Devices I Funktionen werden bei den jeweiligen Operationen (vom Userspace) auf das Character Device aufgerufen File Operationen I Ausführung im Kernelspace, im Kontext des aufrufenden Userspace Prozesses Kernelspace I Setzen des struct module *owner Members wichtig, sodass Modul nicht aus System entfernt werden kann, solange File Operationen ausgeführt werden. Christian Hirsch Lifecycle struct file_operations my_fops = { .owner = THIS_MODULE, .open = my_open, .release = my_release, .unlocked_ioctl = my_ioctl, .read = my_read, .write = my_write, .llseek = my_llseek, }; 25 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Character Devices File Operationen Kernelspace Lifecycle open struct my_dev { struct cdev cdev; /* other members needed for device */ }; int my_open(struct inode *inode, struct file *filp) { struct my_dev *dev; dev = container_of(inode->i_cdev, struct my_dev, cdev); filp->private_data = dev; return 0; } indoe->i_cdev Zeiger auf cdev Member von struct my_dev container_of: http://www.kroah.com/log/linux/container_of.html 26 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Character Devices the file structure when appropriate. The pread and pwrite system calls have different semantics, however; they operate from a given file offset and do not change the file position as seen by any other system calls. These calls pass in a pointer to the user-supplied position, and discard the changes that your driver makes. read/write Figure 3-2 represents how a typical read implementation uses its arguments. ssize_t dev_read(struct file *file, char *buf, size_t count, loff_t *ppos); File Operationen Kernelspace Lifecycle struct file Buffer (in the driver) f_count f_flags f_mode f_pos Buffer (in the application or libc) copy_to_user() .... .... Kernel Space User Space (nonswappable) (swappable) Figure 3-2. The arguments to read Both the read and write methods return a negative value if an error occurs. A return value greater than or equal to 0, instead, tells the calling program how many bytes have been successfully transferred. If some data is transferred correctly and then an 27 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Character Devices Synchronisation I Zugriff auf shared resources muss synchronisiert werden I Semaphoren I Initialisierung: sema_init(struct semaphore *, int); File Operationen I P Operation: z.B. I int down_interruptible(struct semaphore *); V Operation: z.B. void up(struct semaphore *); Kernelspace Lifecycle I I I Spinlocks I I I Als Mutex: Schutz eines kritischen Abschnitts, Initialisierung mit 1 Prozess wird u.U. geblockt (nicht geeignet für Interrupthandler) Deaktiviert Interrupts, Busy Waiting (Multiprozessor) Kann in Interruptbehandlungsroutinen verwendet werden atomic_* Funktionen: z.B. void atomic_inc(atomic_t *v); 28 OSUE Linux Kernel Modul Bonusbeispiel Speichermanagement Christian Hirsch Character Devices I Speicherverwaltung sehr flexibel unter Linux (siehe LDD3, Chapter 8: page-oriented, vmalloc, caches, pools, . . . ); File Operationen I für die meisten Fälle geeignet: I Speicher anfordern: void *kmalloc(size_t, int); I Speicher freigeben: void kfree(void *ptr); I angeforderter Speicher nicht initialisiert (kann beliebigen Inhalt haben) I freigegebener Speicher wird nicht automatisch gelöscht Kernelspace Lifecycle int *data = kmalloc(DATA_SIZE, GFP_KERNEL); /* Fehlerbehandlung und Verwendung von angefordertem Speicher */ kfree(data); 29 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Character Devices File Operationen Datenaustausch Kernelspace <-> Userspace Oft notwendig Bufferinhalte vom Kernel-Space in den User-Space und umgekehrt zu transferieren: I Niemals ungeprüfte Pointer im Kernel dereferenzieren! I copy to/from user Interface (asm/uaccess.h) nutzen: unsigned long copy_to_user(void __user *to, const void *from, unsigned long count); unsigned long copy_from_user(void *to, const void __user *from, unsigned long count); Kernelspace Lifecycle I wie memcpy, zusätzlich: Prüfung des User-Space Pointers I Rückgabe enthält Anzahl der nicht kopierten Bytes (d.h. wenn nicht 0 –> Fehler). I Kopieroperationen können jederzeit unterbrochen werden (Concurrency!) z.B. angeforderte Page nicht im Hauptspeicher 30 OSUE Linux Kernel Modul Bonusbeispiel Lifecycle eines Character Devices Christian Hirsch Character Devices I Initialisierung I File Operationen I Kernelspace Registrierung/Allozierung der Character Device Region: register_chrdev_region Initialisierung der Character Device Struktur struct cdev (inkl. struct file_operations): cdev_init I Lifecycle I Registrierung des Character Devices im Kernel: cdev_add Bemerkung: Ab diesem Zeitpunkt muss damit gerechnet werden, dass das Device verwendet wird - auch wenn die module_init Funktion noch nicht fertig ist! Entfernung I I Deregistrierung des Character Devices: cdev_del Deregistrierung der Character Device Region: unregister_chrdev_region 31 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Übungsumgebung Org Teil IV Angabe LDD3 vs. 4.0.2 Bonusbeispiel Ausblick und Quellen 32 OSUE Linux Kernel Modul Bonusbeispiel Christian Hirsch Übungsumgebung Übungsumgebung I Kernel 4.0.2, Debian 8, Jessie I User Mode Linux (UML) Umgebung im TI-Lab installiert I Read-only Base Image (gross) /opt/osue/uml/osue_bonus.umldisk Org I Angabe Overlay im Homedirectory (nur Änderungen zum Base Image): ~/.uml.cow LDD3 vs. 4.0.2 I Ausblick und Quellen virtuelle Maschine: Linux wird als User-Prozess ausgeführt (Architektur um) I ”sichere” Umgebung für riskantes (und rasches) Entwickeln I Interaktion mit Host per hostfs Filesystem (z.B. Home-Directory kann gemountet werden) I Interaktion mit User über Pseudo Terminals in /dev/pts/ (z.B. per screen(1) verwendbar) I weitere Details: siehe Angabe (im myTI) 33 OSUE Linux Kernel Modul Bonusbeispiel Organisatorisches Christian Hirsch I Übungsumgebung Selbststudium: Linux Device Drivers 3rd Edition (LDD3) zumindest Kapitel 1 bis 3, 5 (Semaphoren) I Richtlinien: I Org I Angabe LDD3 vs. 4.0.2 I I Ausblick und Quellen Beispielabnahme ausschliesslich auf TI-Lab Umgebung GNU C Standard, i.e. C99 Std. mit GNU Erweiterungen (statt C89 Standard und gegebenen CFLAGS für alle anderen Beispiele) debug Modul Parameter (siehe Angabe) Coding Style: /usr/src/linux/Documentation/CodingStyle I I Synchronisation Sauberes Modul Unloading (keine Resourceleaks!) I Abgabedeadline: 26.06.2016 23:59 I Abgabegespräche 27.06.2016 (bei Bedarf 28.06.2016), Anmeldung via myTI, TI Labor I Beginn: ab sofort 34 OSUE Linux Kernel Modul Bonusbeispiel Bonusbeispiel: Secvault - Übersicht Christian Hirsch Übungsumgebung I Character Device Driver soll als Kernel Modul implementiert werden I Verwaltung von bis zu 4 Secure Vaults (Secvaults) Org Angabe LDD3 vs. 4.0.2 Ausblick und Quellen I I I Größe zwischen 1 Byte und 1 MByte (konfigurierbar) verschlüsselt nach XOR Verfahren Userspace Tool: svctl I I anlegen und entfernen von Secvaults Löschung (gesamten Speicher mit 0x0 überschreiben) eines Secvaults. 35 OSUE Linux Kernel Modul Bonusbeispiel Ablauf Christian Hirsch Übungsumgebung I Einmaliges Anlegen der notwendigen Special Files per mknod(1): /dev/sv_ctl, /dev/sv_data0, /dev/sv_data1, /dev/sv_data2, /dev/sv_data3 I Modul stellt nach dem Laden Control Character Device (/dev/sv_ctl) zur Verfügung I Userspace Tool svctl kommuniziert per IOCTL Calls mit Control Device (/dev/sv_ctl) des Treibers Org Angabe LDD3 vs. 4.0.2 Ausblick und Quellen I I Anlegen, Löschen (mit 0x0 überschreiben) und Entfernen eines Secvaults liest Schlüssel über stdin (bis zu 10 Byte, wenn weniger: 0x0). 36 OSUE Linux Kernel Modul Bonusbeispiel Anlegen Christian Hirsch Übungsumgebung Org Angabe LDD3 vs. 4.0.2 Ausblick und Quellen I Überprüfung, ob Secvault schon existiert, falls ja –> Fehler I sonst: I I I Erzeugung eines neuen Character Devices angeforderten Speicher reservieren Schlüssel zum Secvault speichern 37 OSUE Linux Kernel Modul Bonusbeispiel Lesen/Schreiben/Löschen/Entfernen Christian Hirsch Übungsumgebung I Beim Lesen/Schreiben *): Anwendung des symmetrischen Verchlüsselungsverfahren XOR abhängig von Position crypt(pos, data, key) = data[pos] ⊕ key[pos mod keysize ] I Wenn über Speichergrenze des Secvaults hinausgelesen/geschrieben wird: geeignete Fehlerbehandlung I Löschanforderung: den gesamten Secvault mit 0x0 überschreiben (Operation innerhalb des Moduls!) I Entfernung: Speicher- und Characterdevicefreigabe *) Org Angabe LDD3 vs. 4.0.2 Ausblick und Quellen *) hier kann auch überprüft werden, ob der Benutzer berechtigt ist (siehe Fragen in Angabe) 38 OSUE Linux Kernel Modul Bonusbeispiel Secvaults – Relevanz? Christian Hirsch Übungsumgebung Org Angabe LDD3 vs. 4.0.2 Ausblick und Quellen 39 OSUE Linux Kernel Modul Bonusbeispiel Unterschiede LDD3 und Linux 4.0.2 Christian Hirsch Übungsumgebung Org LDD3 für 2.6.10 - API Changes: http://lwn.net/Articles/2.6-kernel-api/ zB: Angabe LDD3 4.0.2 LDD3 vs. 4.0.2 ioctl init_MUTEX(&mutex) current->uid uid_t uid_a == uid_b unlocked_ioctl sema_init(&mutex, 1) current_uid() kuid_t uid_eq(uid_a, uid_b) Ausblick und Quellen Weitere Änderungen ? –> mailto:[email protected] 40 OSUE Linux Kernel Modul Bonusbeispiel Ausblick Christian Hirsch Übungsumgebung I Letzte Vorlesung! Org I Lust auf mehr Linux Kernel Entwicklung? I Angabe I LDD3 vs. 4.0.2 I Ausblick und Quellen Lust auf Konzepte/Design zwischen Hardware and Userspace Software? I I 3 4 Talk: ’Write and Submit your first Linux kernel Patch’3 Linux Kernel Newbies4 Programmierung von Betriebssystemen (ProgOS) 182.710 (Sommersemester) Live Demo http://www.youtube.com/watch?v=LLBrBBImJt4 http://kernelnewbies.org/ 41 OSUE Linux Kernel Modul Bonusbeispiel Quellen und Material Christian Hirsch Übungsumgebung Org Angabe LDD3 vs. 4.0.2 Ausblick und Quellen I ”Linux Device Drivers 3rd Edition” (LDD3) von Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman http://lwn.net/Kernel/LDD3/ I ”Linux Kernel Development 2nd Edition” von Robert Love http://book.chinaunix.net/special/ebook/Linux_Kernel_ Development/0672327201/toc.html I ’Comic’: https://www.kickstarter.com/profile/1694714745 I Ramdump setup: neimod, 3ds scene I Protection rings figure: https://en.wikipedia.org/wiki/Protection_ring 42