LFD430 Entwicklung von Gerätetreibern für Linux-Systeme
Classroom Schulung | Deutsch | Anspruch
Schulungsdauer: 4 Tage
Ziele
Lernen Sie, Gerätetreiber für Linuxsysteme zu entwickeln. Dieser Kurs wird Ihnen sowohl die verschiedenen Typen der Linux Gerätetreiber nahebringen, als auch die angemessenen APIs und die Methoden, mit denen die Geräte sich mit dem Kernel verbinden.
- Die verschiedenen Arten von Gerätetreibern in Linux
- Die Schnittstellen zwischen Devices (Hard- und Software) und dem Kernel
- Notwendige Module und Techniken für die Entwicklung und das Debuggen von Linux Treibern
- u.v.m.
Die vermittelten Lerninhalte lassen sich in allen großen Linux-Distributionen anwenden.
Zielgruppe
Dieser Lehrgang richtet sich an erfahrene Entwickler, welche die Treiberentwicklung für Linux-Systeme erlernen möchten.
Voraussetzungen
- Erfahrung in der C-Programmierung
- Vertrautheit mit Linux Dienstprogrammen und Texteditoren
- Kenntnisse zu Kernel-Schnittstellen und Methoden wie Schreiben, Kompilieren, Load und Unload von Modulen, Synchronisation
- Grundkenntnisse im Bereich Speicherzuweisung und Speicherverwaltung, entsprechend LFD420.
Agenda
Einführungen
- Linux Distributionen
- Plattformen
- Vorbereitung Ihres Systems
- Verwendung und Herunterladen einer virtuellen Maschine
Linux Datei-System Tree Layout
- OPreliminaries
Wie man in OSS-Projekten arbeitet
- Überblick über die korrekte Durchführung von Übertragungen.
- Sicherheit und Qualität durch die Nähe zur Mainline
- Projekt-DNA erforschen und verstehen
- Das Anliegen erkennen und verfolgen
- Bestimmung der Entwickler und deren Arbeitsabläufe und Methoden
- Frühzeitige Informationen einholen und freier arbeiten
- Tragen Sie inkrementelle Bits bei und meiden Sie große Code-Dumps.
- Kein Platz für Ego: Denke nicht engstirnig.
- Seien Sie geduldig, entwickeln Sie langfristige Partnerschaften und seien Sie hilfreich
Gerätetreiber
- Gerätetypen
- Mechanismen vs. Richtlinien
- Vermeidung von Binary Blobs
- Energie-Management
- Wie Applikationen Gerätetreiber verwenden
- Durchlaufen eines Systemaufrufs Zugriff auf ein Gerät
- Fehlermeldungen
- printk()
- Geräte: Verwaltungs-Ressourcen für Geräte
Modul- und Gerätetreiber
- Die module_driver()-Makros
- Module und Hot-Plug
Speichermanagement und Zuweisung
- Virtual- und physikalischer Speicher
- Speicherbereiche
- Seiten-Tabellen
- kmalloc()
- __get_free_pages()
- vmalloc()
Character Devices
- Geräte-Knotenpunkte
- Major- und Minor-Nummern
- Reservierung von Major-/Minor-Nummern
- Zugriff auf den Geräte-Knotenpunkt
- Registrierung des Geräts
- udev
- dev_printk() und zugehörige
- file_operations-Struktur
- Treiber-Einstiegspunkte
- Die Datei- und Inode-Strukturen
- Diverse Charakter-Treiber
Kernel Funktionen
- Bestandteile des Kernels
- Anwenderbereich vs. Kernel-Bereich
- Was sind Systemaufrufe?
- Verfügbare Systemaufrufe
- Zeitplanungsalgorithmen und Task-Strukturen
- Prozess-Kontext
Übertragung von Benutzer- und Kernelbereich
- Übertragung zwischen den Bereichen
- put(get)_user() und copy_to(from)_user()
- Direkte Übertragung: Kernel-E/A und Speicher-Mapping
- Kernel-E/A
- Zuordnung von Benutzerseiten
- Speicher-Zuordnung (Memory Mapping)
- Anwender-Funktionen für mmap()
- Treibereinstiegspunkt für mmap()
- Dateizugriff aus dem Kernel
Störungen und Ausnahmen
- Was sind Interrupts und Exceptions?
- Ausnahmen
- Asynchrone Interrupts
- MSI
- Aktivieren/Deaktivieren von Interrupts
- Was Sie zur Interrupt-Zeit nicht tun können
- IRQ-Daten-Strukturen
- Installieren eines Interrupt-Handlers
Zeitmessung
- Verschiedene Arten von Zeitmessungen
- Jiffies
- Bestimmung der aktuellen Zeit
- Zeitquellen
- Real Time Clock
- Programmierbarer Intervall-Timer
- Zeitstempelzähler
- HPET
Kernel-Timer
- Verzögerungen einfügen
- Was sind Kernel-Timer?
- Timer-Funktionen mit niedriger Auflösung
- Timer-Implementierung mit niedriger Auflösung
- Timer mit hoher Auflösung
- Einsatz von hochauflösenden Timern
ioctls
- Was sind ioctls?
- Einstiegspunkt des Treibers für ioctls
- Definition von ioctls
Unified Device Model und sysfs
- Einheitliches Geräte-Modell
- Grundlegende Strukturen
- Reale Geräte
- sysfs
- kset- und kobject-Beispiele
Firmware
- Was ist Firmware?
- Laden der Firmware
Sleeping und Wait Queues
- Was sind Queues?
- Sleep und Waking Up
- Sleep Details
- Exclusive Sleeping
- Waking Up Details
- Polling
Störungs-Handling: Verzögerte Funktionen und Benutzer Treiber
- Top and Bottom Halves
- Softirqs
- Tasklets
- Work Queues
- New Work Queue API
- Kernel Threads erstellen
- Threaded Interrupt Handlers
- Interrupt Handling im User-Space
Hardware I/O
- Anschlüsse und Ports
- Speicherbarrieren
- Registrierung von E/A-Ports
- Daten aus E/A-Registern lesen und schreiben
- Zuweisung und Mapping von I/O-Speicher
- Zugriff auf I/O-Speicher
- Benutzerzugriff - ioperm(), iopl(), /dev/port
PCI
- Was ist PCI?
- PCI-Gerätetreiber
- Lokalisierung von PCI-Geräten
- Zugriff auf den Konfigurationsbereich
- Zugriff auf I/O- und Speicherbereiche
- PCI-Express
Plattformtreiber
- Was sind Plattformtreiber?
- Hauptdatenstrukturen
- Registrierung von Plattformgeräten
- Festcodierte Plattformdaten
- Der neue Weg: Gerätestrukturen
Direkter Speicherzugriff (DMA)
- Was ist DMA?
- Direktzugriff (DMA) zum Anwender
- Unterbrechungen und DMA
- DMA-Speicherbeschränkungen
- DMA-Masken
- DMA-API
- DMA-Pools
- Scatter/Gather-Zuordnungen
Netzwerktreiber I: Grundlagen
- Netzwerkschichten und Datenkapselung
- Datenverbindungsebene
- Netzwerk-Gerätetreiber
- Laden/Entladen
- Öffnen und Schließen
Netzwerk-Treiber II: Datenstrukturen
- net_device Struktur
- net_device_ops Struktur
- sk_buff Struktur
- Socket-Buffer-Funktionen
- netdev_printk() und Konsorten
Netzwerktreiber III: Senden und Empfangen
- Senden von Daten und Timeouts
- Empfangen von Daten
- Statistik
Netzwerktreiber IV: Ausgewählte Themen
- Multicasting
- Änderungen im Link-Status
- ioctls
- NAPI und Unterbrechungsunterdrückung
- NAPI-Details
- TSO und TOE
- MII und ethtool
USB-Treiber
- Was ist USB?
- USB-Topologie
- Terminologie
- Endpunkte
- Deskriptoren
- USB-Geräte-Klassen
- USB-Unterstützung in Linux
- Registrierung von USB-Gerätetreibern
- Daten verschieben
Energie-Management
- ACPI und APM
- Zustände der Systemleistung
- Rückruffunktionen
Blocktreiber
- Was sind Blocktreiber?
- Puffern
- Registrieren eines Blocktreibers
- Gendisk-Struktur
- Behandlung von Anfragen
Ziele
Lernen Sie, Gerätetreiber für Linuxsysteme zu entwickeln. Dieser Kurs wird Ihnen sowohl die verschiedenen Typen der Linux Gerätetreiber nahebringen, als auch die angemessenen APIs und die Methoden, mit denen die Geräte sich mit dem Kernel verbinden.
- Die verschiedenen Arten von Gerätetreibern in Linux
- Die Schnittstellen zwischen Devices (Hard- und Software) und dem Kernel
- Notwendige Module und Techniken für die Entwicklung und das Debuggen von Linux Treibern
- u.v.m.
Die vermittelten Lerninhalte lassen sich in allen großen Linux-Distributionen anwenden.
Zielgruppe
Dieser Lehrgang richtet sich an erfahrene Entwickler, welche die Treiberentwicklung für Linux-Systeme erlernen möchten.
Voraussetzungen
- Erfahrung in der C-Programmierung
- Vertrautheit mit Linux Dienstprogrammen und Texteditoren
- Kenntnisse zu Kernel-Schnittstellen und Methoden wie Schreiben, Kompilieren, Load und Unload von Modulen, Synchronisation
- Grundkenntnisse im Bereich Speicherzuweisung und Speicherverwaltung, entsprechend LFD420.
Agenda
Einführungen
- Linux Distributionen
- Plattformen
- Vorbereitung Ihres Systems
- Verwendung und Herunterladen einer virtuellen Maschine
Linux Datei-System Tree Layout
- OPreliminaries
Wie man in OSS-Projekten arbeitet
- Überblick über die korrekte Durchführung von Übertragungen.
- Sicherheit und Qualität durch die Nähe zur Mainline
- Projekt-DNA erforschen und verstehen
- Das Anliegen erkennen und verfolgen
- Bestimmung der Entwickler und deren Arbeitsabläufe und Methoden
- Frühzeitige Informationen einholen und freier arbeiten
- Tragen Sie inkrementelle Bits bei und meiden Sie große Code-Dumps.
- Kein Platz für Ego: Denke nicht engstirnig.
- Seien Sie geduldig, entwickeln Sie langfristige Partnerschaften und seien Sie hilfreich
Gerätetreiber
- Gerätetypen
- Mechanismen vs. Richtlinien
- Vermeidung von Binary Blobs
- Energie-Management
- Wie Applikationen Gerätetreiber verwenden
- Durchlaufen eines Systemaufrufs Zugriff auf ein Gerät
- Fehlermeldungen
- printk()
- Geräte: Verwaltungs-Ressourcen für Geräte
Modul- und Gerätetreiber
- Die module_driver()-Makros
- Module und Hot-Plug
Speichermanagement und Zuweisung
- Virtual- und physikalischer Speicher
- Speicherbereiche
- Seiten-Tabellen
- kmalloc()
- __get_free_pages()
- vmalloc()
Character Devices
- Geräte-Knotenpunkte
- Major- und Minor-Nummern
- Reservierung von Major-/Minor-Nummern
- Zugriff auf den Geräte-Knotenpunkt
- Registrierung des Geräts
- udev
- dev_printk() und zugehörige
- file_operations-Struktur
- Treiber-Einstiegspunkte
- Die Datei- und Inode-Strukturen
- Diverse Charakter-Treiber
Kernel Funktionen
- Bestandteile des Kernels
- Anwenderbereich vs. Kernel-Bereich
- Was sind Systemaufrufe?
- Verfügbare Systemaufrufe
- Zeitplanungsalgorithmen und Task-Strukturen
- Prozess-Kontext
Übertragung von Benutzer- und Kernelbereich
- Übertragung zwischen den Bereichen
- put(get)_user() und copy_to(from)_user()
- Direkte Übertragung: Kernel-E/A und Speicher-Mapping
- Kernel-E/A
- Zuordnung von Benutzerseiten
- Speicher-Zuordnung (Memory Mapping)
- Anwender-Funktionen für mmap()
- Treibereinstiegspunkt für mmap()
- Dateizugriff aus dem Kernel
Störungen und Ausnahmen
- Was sind Interrupts und Exceptions?
- Ausnahmen
- Asynchrone Interrupts
- MSI
- Aktivieren/Deaktivieren von Interrupts
- Was Sie zur Interrupt-Zeit nicht tun können
- IRQ-Daten-Strukturen
- Installieren eines Interrupt-Handlers
Zeitmessung
- Verschiedene Arten von Zeitmessungen
- Jiffies
- Bestimmung der aktuellen Zeit
- Zeitquellen
- Real Time Clock
- Programmierbarer Intervall-Timer
- Zeitstempelzähler
- HPET
Kernel-Timer
- Verzögerungen einfügen
- Was sind Kernel-Timer?
- Timer-Funktionen mit niedriger Auflösung
- Timer-Implementierung mit niedriger Auflösung
- Timer mit hoher Auflösung
- Einsatz von hochauflösenden Timern
ioctls
- Was sind ioctls?
- Einstiegspunkt des Treibers für ioctls
- Definition von ioctls
Unified Device Model und sysfs
- Einheitliches Geräte-Modell
- Grundlegende Strukturen
- Reale Geräte
- sysfs
- kset- und kobject-Beispiele
Firmware
- Was ist Firmware?
- Laden der Firmware
Sleeping und Wait Queues
- Was sind Queues?
- Sleep und Waking Up
- Sleep Details
- Exclusive Sleeping
- Waking Up Details
- Polling
Störungs-Handling: Verzögerte Funktionen und Benutzer Treiber
- Top and Bottom Halves
- Softirqs
- Tasklets
- Work Queues
- New Work Queue API
- Kernel Threads erstellen
- Threaded Interrupt Handlers
- Interrupt Handling im User-Space
Hardware I/O
- Anschlüsse und Ports
- Speicherbarrieren
- Registrierung von E/A-Ports
- Daten aus E/A-Registern lesen und schreiben
- Zuweisung und Mapping von I/O-Speicher
- Zugriff auf I/O-Speicher
- Benutzerzugriff - ioperm(), iopl(), /dev/port
PCI
- Was ist PCI?
- PCI-Gerätetreiber
- Lokalisierung von PCI-Geräten
- Zugriff auf den Konfigurationsbereich
- Zugriff auf I/O- und Speicherbereiche
- PCI-Express
Plattformtreiber
- Was sind Plattformtreiber?
- Hauptdatenstrukturen
- Registrierung von Plattformgeräten
- Festcodierte Plattformdaten
- Der neue Weg: Gerätestrukturen
Direkter Speicherzugriff (DMA)
- Was ist DMA?
- Direktzugriff (DMA) zum Anwender
- Unterbrechungen und DMA
- DMA-Speicherbeschränkungen
- DMA-Masken
- DMA-API
- DMA-Pools
- Scatter/Gather-Zuordnungen
Netzwerktreiber I: Grundlagen
- Netzwerkschichten und Datenkapselung
- Datenverbindungsebene
- Netzwerk-Gerätetreiber
- Laden/Entladen
- Öffnen und Schließen
Netzwerk-Treiber II: Datenstrukturen
- net_device Struktur
- net_device_ops Struktur
- sk_buff Struktur
- Socket-Buffer-Funktionen
- netdev_printk() und Konsorten
Netzwerktreiber III: Senden und Empfangen
- Senden von Daten und Timeouts
- Empfangen von Daten
- Statistik
Netzwerktreiber IV: Ausgewählte Themen
- Multicasting
- Änderungen im Link-Status
- ioctls
- NAPI und Unterbrechungsunterdrückung
- NAPI-Details
- TSO und TOE
- MII und ethtool
USB-Treiber
- Was ist USB?
- USB-Topologie
- Terminologie
- Endpunkte
- Deskriptoren
- USB-Geräte-Klassen
- USB-Unterstützung in Linux
- Registrierung von USB-Gerätetreibern
- Daten verschieben
Energie-Management
- ACPI und APM
- Zustände der Systemleistung
- Rückruffunktionen
Blocktreiber
- Was sind Blocktreiber?
- Puffern
- Registrieren eines Blocktreibers
- Gendisk-Struktur
- Behandlung von Anfragen