Linux-Treiber entwickeln - Eine systematische Einführung in die Gerätetreiber- und Kernelprogrammierung - jetzt auch für Raspberry Pi
von: Jürgen Quade, Eva-Katharina Kunst
dpunkt, 2015
ISBN: 9783864917561
Sprache: Deutsch
688 Seiten, Download: 23210 KB
Format: EPUB, PDF, auch als Online-Lesen
Mehr zum Inhalt
Linux-Treiber entwickeln - Eine systematische Einführung in die Gerätetreiber- und Kernelprogrammierung - jetzt auch für Raspberry Pi
Einleitung | 11 | ||
Theorie ist notwendig | 19 | ||
Betriebssystemarchitektur | 19 | ||
Komponenten des Kernels | 20 | ||
Sonstige Betriebssystemkomponenten | 33 | ||
Abarbeitungskontext und Unterbrechungsmodell | 34 | ||
Quellensuche | 37 | ||
Kernelcode-Entwicklung in der Praxis | 41 | ||
Auf der Kommandoebene entwickeln | 42 | ||
Fehler finden | 52 | ||
Techniken der Kernelprogrammierung | 62 | ||
Coding Style: Kernelcode lesen und Kernelcodeschreiben | 62 | ||
Kernelcode kodieren | 64 | ||
Objektbasierte Programmierung und Entwurfsmuster im Kernel | 66 | ||
Hilfsfunktionen | 70 | ||
Cross-Development | 72 | ||
Nicht vergessen: Auswahl einer geeigneten Lizenz | 74 | ||
GPL und LGPL | 75 | ||
MPL und BSD | 76 | ||
Treiber aus Sicht der Applikation | 79 | ||
Die Programmierschnittstelle der Applikation | 79 | ||
Zugriffsmodi | 84 | ||
Einfache Treiber | 89 | ||
Bevor es losgeht … | 90 | ||
Cross-Kompilierung | 92 | ||
Den Kernel erweitern | 93 | ||
Kernelmodule | 93 | ||
Vom Modul zum Treiber | 98 | ||
Einfaches Treibertemplate | 101 | ||
Die Treibereinsprungspunkte | 105 | ||
driver_open: die Zugriffskontrolle | 108 | ||
Aufräumen in driver_close | 111 | ||
Lesezugriffe im Treiber | 111 | ||
Schreibzugriffe im Treiber | 121 | ||
Die Universalschnittstelle IO-Control | 123 | ||
Wenn Applikationen mehrere Ein-/Ausgabekanäleüberwachen | 127 | ||
Daten zwischen Kernel- und Userspace transferieren | 130 | ||
Hardware anbinden | 134 | ||
Datentypen und Datenablage | 135 | ||
Ressourcenmanagement | 136 | ||
Direkter Hardwarezugriff | 145 | ||
Hardware erkennen | 150 | ||
Device Tree | 154 | ||
PCI | 160 | ||
Treiberinstanzen | 173 | ||
Treibertemplate: Basis für Eigenentwicklungen | 175 | ||
Fortgeschrittene Kernelcode-Entwicklung | 181 | ||
Zunächst die Übersicht | 182 | ||
Interrupts | 183 | ||
Interruptverarbeitung klassisch | 183 | ||
Threaded Interrupts | 187 | ||
Interrupts, testen mit dem Raspberry Pi | 191 | ||
Softirqs | 199 | ||
Tasklets | 200 | ||
Timer-Funktionen | 203 | ||
High Resolution Timer | 207 | ||
Tasklet auf Basis des High Resolution Timers | 210 | ||
Kernel-Threads | 211 | ||
kthread-Daemon | 213 | ||
Workqueues | 216 | ||
Event-Workqueue | 221 | ||
Kritische Abschnitte sichern | 222 | ||
Atomare Operationen | 223 | ||
Mutex und Semaphor | 229 | ||
Spinlocks | 240 | ||
Sequencelocks | 247 | ||
Interruptsperre und Kernel-Lock | 250 | ||
Synchronisiert warten | 251 | ||
Memory Barriers | 254 | ||
Per-CPU-Variablen | 256 | ||
Fallstricke | 256 | ||
Vom Umgang mit Zeiten | 258 | ||
Relativ- und Absolutzeiten | 258 | ||
Zeitverzögerungen | 264 | ||
Dynamischen Speicher effizient verwalten | 267 | ||
Buddy-System | 268 | ||
Objekt-Caching | 270 | ||
Große Speicherbereiche reservieren | 275 | ||
Speicher pro Prozessorkern | 276 | ||
Systemaspekte | 281 | ||
Proc-Filesystem | 282 | ||
Schreibzugriffe unterstützen | 287 | ||
Sequencefiles | 290 | ||
Das Gerätemodell | 295 | ||
Implementierungstechnische Grundlagen | 299 | ||
Gerätedateien automatisiert anlegen lassen | 300 | ||
Treiber anmelden | 302 | ||
Geräte anmelden | 304 | ||
Attributdateien erstellen | 310 | ||
Eigene Geräteklassen erstellen | 314 | ||
Neue Bussysteme anlegen | 315 | ||
Green Computing | 316 | ||
Firmware-Interface | 328 | ||
Treiber parametrieren | 334 | ||
Systemintegration | 339 | ||
Modutils | 341 | ||
Hotplug | 344 | ||
Module beim Booten laden | 345 | ||
Kernel Build System | 345 | ||
Treiberquellen als integrative Erweiterung der Kernelquellen | 346 | ||
Modultreiber außerhalb der Kernelquellen | 350 | ||
Module automatisiert generieren (DKMS) | 352 | ||
Intermodul-Kommunikation | 357 | ||
Realzeitaspekte | 362 | ||
Sonstige Treibersubsysteme | 367 | ||
GPIO-Subsystem | 367 | ||
I2C-Subsystem | 372 | ||
Serial Peripheral Interface (SPI) | 380 | ||
USB-Subsystem | 388 | ||
USB programmtechnisch betrachtet | 389 | ||
Den Treiber beim USB-Subsystem registrieren | 393 | ||
Die Geräteinitialisierung und die -deinitialisierung | 395 | ||
Auf das USB-Gerät zugreifen | 397 | ||
Netzwerk-Subsystem | 403 | ||
Datenaustausch zur Kommunikation | 404 | ||
Netzwerktreiber initialisieren | 406 | ||
Netzwerktreiber deinitialisieren | 407 | ||
Start und Stopp des Treibers | 407 | ||
Senden und Empfangen | 408 | ||
Blockorientierte Gerätetreiber | 413 | ||
Bevor es richtig losgeht … | 416 | ||
Daten kerneloptimiert transferieren | 418 | ||
Grundlegendes zu BIO-Blöcken | 424 | ||
Treiberoptimierter Datentransfer | 428 | ||
Crypto-Subsystem | 430 | ||
Kleines Einmaleins der Kryptografie | 430 | ||
Dienste in der Übersicht | 433 | ||
Eigene Algorithmen einbinden | 444 | ||
Über das Schreiben eines guten, performanten Treibers | 451 | ||
Konzeption | 451 | ||
Keine halben Sachen … | 452 | ||
Intuitive Nutzung durch Struktur | 453 | ||
Sicher muss es sein | 454 | ||
Funktional muss es sein | 455 | ||
Realisierung | 455 | ||
Sicherheitsgerichtetes Programmieren | 455 | ||
Mit Stil programmieren | 456 | ||
32 Bit und mehr: Portierbarer Code | 461 | ||
Zeitverhalten | 466 | ||
Anhang | 471 | ||
Kernel generieren und installieren | 473 | ||
Nativ kompilieren: PC-Plattform | 475 | ||
Nativ kompilieren: Raspberry Pi | 479 | ||
Cross-Kompilieren: PC als Host, Raspberry Pi als Target | 480 | ||
Makros und Funktionen des Kernels kurz gefasst | 485 | ||
Literaturverzeichnis | 669 | ||
Index | 671 | ||
www.dpunkt.de | 0 |