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 |