Linux-Gerätetreiber – Grundlagen: Schritt für Schritt Linux‑Kernel‑Treiber schreiben und debuggen.
Hands‑on mit Modulen, Character Devices, Kernel‑Logs und APIs.
Speicherverwaltung, Interrupts und Synchronisation an realen Beispielen erkunden.
Praktische Erfahrung sammeln durch Labs (~70%), in denen Treiber gebaut und getestet werden.
Nutzen: Kernel‑User‑Grenzen und Best Practices der Treiberentwicklung verstehen.
Für wen: konzipiert für Personen mit C‑/Linux‑Grundlagen, die Kernel‑Skills wollen.
Am Ende baust und debuggst du funktionierende Treiber mit Sicherheit.
Curriculum
Einführung
- Kernel versions
- Kernel sources und die Nutzung von git
- Rolling your own kernel
- Plattformen
- Arten von Device Drivers
- Elemente eines Embedded-Linux-Projekts (Überblick)
Device drivers
- Gerätetypen; mechanism vs. policy; Vermeidung von binary blobs
- Wie Applikationen Device Drivers verwenden
- Der System-Call-Mechanismus
- Error numbers
- printk()
- devres: managed device resources
- Module und Device Drivers: module_driver()-Macros, Modules und Hot Plug
Speicherverwaltung und -allokation
- Virtueller und physischer Speicher
- Memory zones
- Page tables
- kmalloc(), __get_free_pages(), vmalloc()
- Slabs und Cache-Allokationen
Character devices
- Device nodes
- Major und Minor Numbers; Reservierung
- Zugriff auf den Device Node
- Registrierung des Geräts (registering the device)
- udev
- dev_printk() und verwandte Funktionen
- Struktur file_operations
- Driver Entry Points
- Die Strukturen file und inode
Transfer zwischen User- und Kernel-Space
- User-Space vs. Kernel-Space; System Calls; Process Context
- Linked List und weitere Datenstrukturen
- put(get)_user() und copy_to(from)_user()
- Direkter Transfer: Kernel I/O und Memory Mapping
- User-Space-Funktionen für mmap()
- Driver Entry Point für mmap()
Interrupts und Exceptions
- Interrupts und Exceptions
- Asynchronous interrupts
- MSI
- Interrupts aktivieren/deaktivieren
- Was man während eines Interrupts nicht tun sollte
- IRQ-Datenstrukturen
- Einen Interrupt Handler installieren
Zeitmessungen
- Arten von Messungen
- Jiffies
- Aktuelle Zeit ermitteln
- Clock Sources
- Programmable Interval Timer
- Time Stamp Counter
- HPET
- Tickless Kernels
Kernel-Timer
- Delays einfügen
- Low Resolution Timer
- High Resolution Timer
ioctls
- Driver Entry Points für ioctls
- Locked und Lockless ioctls
- ioctls definieren
Unified Device Model und sysfs
- Grundlegende Datenstrukturen
- Reale Geräte
- sysfs
- kset- und kobject-Beispiele
Sleeping und Wait Queues
- In den Schlafmodus gehen und Aufwachen
- Exclusive Sleeping
- Polling
Interrupt Handling
- Top und Bottom Halves
- Deferrable Functions und Softirqs
- Tasklets
- Work Queues
- Threaded Interrupt Handlers
- Interrupt Handling im User-Space
Hardware I/O
- Buses und Ports
- Memory Barriers
- I/O-Ports registrieren
- Zugriff auf I/O-Register und I/O-Speicher
- Zugriff aus dem User-Space: ioperm(), iopl(), /dev/port
Applikation (falls Zeit bleibt)
- Implementierung eines LED-Treibers
- Implementierung eines Temperatursensor-Treibers
Kursablauf
- Part 1: 09:00–10:30
- Break: 10:30–10:45
- Part 2: 10:45–12:15
- Lunch break: 12:15–13:15
- Part 3: 13:15–15:15
- Break: 15:15–15:30
- Part 4: 15:30–17:30