Linux Advanced Programming {Development} Tutorial
Teil 1 Linux-Kernel Teil 2 Linux-Kernel-Modul-Programmierhandbuch Teil 3 Linux-Programmierhandbuch Teil 4 Linux-Kernel-Konzept Systemstruktur Teil 5 Linux-Kernel-spezifische Systemstruktur
Inhaltsverzeichnis Einführung in Raymonds Vorwort
„Ankündigung“ der Linux Documentation Engineering Group
Vorwort des Übersetzers Teil eins Vorwort zum Linux-Kernel
Kapitel 1 Hardware-Grundlagen und Software-Grundlagen 6
1.1 Hardware-Grundlagen 6
1.1.1 CPU 7
1.1.2 Speicher 8
1.1.3 Bus 8
1.1.4 Controller und Peripheriegeräte 8
1.1.5 Adressraum 9
1.1.6 Uhr 9
1.2 Software-Grundlagen 9
1.2.1 Computersprache 9
1.2.2 Was ist ein Betriebssystem 11
1.2.3 Kernel-Datenstruktur 13
Kapitel 2 Speicherverwaltung 15
2.1 Abstraktes Modell des virtuellen Speichers 15
2.1.1 Anforderungsseite 17
2.1.2 Austausch 17
2.1.3 Gemeinsamer virtueller Speicher 18
2.1.4 Physikalischer Adressierungsmodus und virtueller Adressierungsmodus 18
2.1.5 Zugangskontrolle 18
2.2 Caching 19
2.3 Linux-Seitentabelle 20
2.4 Seitenzuweisung und -recycling 21
2.4.1 Seitenzuordnung 22
2.4.2 Seitenrecycling 22
2.5 Speicherzuordnung 22
2.6 Anforderungsseite 23
2.7 Linux-Seiten-Cache 24
2.8 Seitentausch und Eliminierung 25
2.8.1 Reduzierung der Puffer- und Seiten-Cache-Größen 25
2.8.2 System V-Shared-Memory-Seiten austauschen 26
2.8.3 Seiten austauschen und zurückziehen 27
2.9 Swap-Cache 27
2.10 Seitenwechsel 28
Kapitel 3 Prozess 29
3.1 Linux-Prozesse 29
3.2 Identifikatoren 31
3.3 Terminplanung 32
3.4 Dokumentation 34
3.5 Virtueller Speicher 35
3.6 Erstellen eines Prozesses 36
3.7 Zeit und Timer 37
3.8 Programm ausführen 38
3.8.1 ELF 39
3.8.2 Skriptdateien 40
Kapitel 4 Interprozess-Kommunikationsmechanismus 41
4.1 Signalmechanismus 41
4.2 Rohre 42
4.3 Steckdosen 44
4.3.1 Der prozessübergreifende Kommunikationsmechanismus von System V 44
4.3.2 Nachrichtenwarteschlange 44
4.3.3 Semaphor 45
4.3.4 Gemeinsamer Speicher 47
Kapitel 5 PCI 49
5.1 PCI-Adressraum 49
5.2 PCI-Konfigurationsheader 50
5.3 PCI-E/A und Speicheradressraum 51
5.4 PCI-ISA-Brücke 51
5.5 PCI-PCI-Brücke 51
5.5.1 PCI-PCI-Brücke: PCI-E/A- und Speicheradressen
Fenster zum Raum 51
5.5.2 PCI-PCI-Brücke: PCI-Konfigurationszyklus und PCI
Buslinie 52
5.6 Linux PCI-Initialisierung 53
5.6.1 PCI-Datenstruktur des Linux-Kernels 53
5.6.2 PCI-Gerätetreiber 53
5.6.3 PCI-BIOS-Funktionen 56
5.6.4 PCI-Korrekturprozess 57
Kapitel 6 Interrupt-Handhabung und Gerätetreiber 60
6.1 Interrupts und Interrupt-Behandlung 60
6.1.1 Programmierbarer Interrupt-Controller 61
6.1.2 Interrupt-Verarbeitungsdatenstruktur initialisieren 61
6.1.3 Interrupt-Behandlung 62
6.2 Gerätetreiber 63
6.2.1 Prüfung und Unterbrechung 64
6.2.2 Direkter Speicherzugriff (DMA) 65
6.2.3 Speicher 66
6.2.4 Schnittstelle zwischen Gerätetreiber und Kernel 66
6.2.5 Festplatte 69
6.2.6 Netzwerkausrüstung 74
Kapitel 7 Dateisysteme 77
7.1 Das zweite erweiterte Dateisystem EXT2 78
7.1.1 Inode-Knoten des EXT2-Systems 79
7.1.2 Superblock im EXT2-System 80
7.1.3 Gruppendeskriptoren für EXT2-Systeme 80
7.1.4 Verzeichnis des EXT2-Systems 81
7.1.5 Dateien im EXT2-Dateisystem finden 81
7.1.6 Dateien im EXT2-Dateisystem ändern
Größe 82
7.2 Virtuelles Dateisystem 83
7.2.1 Superblock des VFS-Dateisystems 84
7.2.2 Inode-Knoten des VFS-Dateisystems 84
7.2.3 Registrierung des Dateisystems 85
7.2.4 Zusammenbau des Dateisystems 85
7.2.5 Dateien in einem virtuellen Dateisystem finden 87
7.2.6 Dateisystem aushängen 87
7.2.7 Inode-Cache des VFS-Dateisystems 87
7.2.8 Verzeichnis-Caching 88
7.3 Puffer-Caching 88
7.3.1 bdflush-Kernel-Daemon 90
7.3.2 Update-Prozess 90
7.4 /proc-Dateisystem 91
7.5 Spezielle Gerätedateien 91
Kapitel 8 Netzwerk 92
8.1 Überblick über das TCP/IP-Netzwerk 92
8.2 TCP/IP-Netzwerkhierarchie in Linux 95
8.3 BSD-Socket-Schnittstelle 96
8.4 INETs Socket-Schicht 97
8.4.1 Erstellen eines BSD-Sockets 98
8.4.2 Bindungsadresse für INET BSD Socket 99
8.4.3 Herstellen einer INET BSD Socket-Verbindung 99
8.4.4 INET BSD Socket Listening 100
8.4.5 Verbindungsanfragen annehmen 100
8.5 IP-Schicht 100
8.5.1 Socket-Puffer 100
8.5.2 IP-Nachrichten empfangen 101
8.5.3 IP-Pakete versenden 102
8.5.4 Daten-Sharding 102
8.6 Adressauflösungsprotokoll 103
8.7 IP-Routing 104
Kapitel 9 Kernelmechanismen und -module 107
9.1 Kernel-Mechanismus 107
9.1.1 Kontrolle der unteren Hälfte 107
9.1.2 Aufgabenwarteschlange 108
9.1.3 Timer 109
9.1.4 Warteschlange 110
9.1.5 Spinlock 110
9.1.6 Semaphor 110
9.2 Module 111
9.2.1 Modul laden 112
9.2.2 Deinstallation des Moduls 113
Kapitel 10 Prozessoren 115
10,1X86 115
10.2 ARM 115
10.3 Alpha AXP Prozessor 115
Kapitel 11 Linux-Kernel-Quellcode 117
11.1 So erhalten Sie den Linux-Kernel-Quellcode 117
11.2 Anordnung des Kernel-Quellcodes 117
11.3 Wo soll ich anfangen 118
Kapitel 12 Linux-Datenstrukturen 120
Anhang A Nützliche Web- und FTP-Sites 138
Anhang B Glossar 139
Teil 2 Programmierhandbuch für Linux-Kernel-Module Danksagungen Vorwort Kapitel 1 Hallo Welt 145
1.1 Makefiles des Kernelmoduls 146
1.2 Multi-File-Kernelmodul 147
Kapitel 2 Zeichengerätedateien 149
Kapitel 3 /proc-Dateisystem 158
Kapitel 4 /proc für die Eingabe verwenden 162
Kapitel 5 Verwenden von Gerätedateien für die Eingabe 170
Kapitel 6 Startparameter 182
Kapitel 7 Systemaufrufe 185
Kapitel 8 Blockierungsbehandlung 190
Kapitel 9 Ersetzen von printk 199
Kapitel 10 Aufgabenplanung 202
Kapitel 11 Interrupt-Handler 207
Kapitel 12 Symmetrisches Multiprocessing 211
Kapitel 13 Häufige Fehler 212
Anhang A Unterschiede zwischen 2.0 und 2.2 213
Anhang B Weitere Ressourcen 214
Anhang C Geben Sie Ihre Bewertung 215 ab
Teil 3 Linux-Programmierhandbuch Kapitel 1 Linux-Betriebssystem 219
Kapitel 2 Linux-Kernel 220
Kapitel 3 Linux libc-Paket 221
Kapitel 4 Systemaufrufe 222
Kapitel 5 „Schweizer Taschenmesser“: ioctl 223
Kapitel 6 Linux-Interprozesskommunikation 224
6.1 Einleitung 224
6.2 Halbduplex-Unix-Pipes 224
6.2.1 Grundbegriffe 224
6.2.2 Pipelines in C-Sprache erstellen 225
6.2.3 Einfache Methode 229
6.2.4 Atomare Operationen an Rohren 233
6.2.5 Einige Dinge, die Sie bei Halbduplex-Pipes beachten sollten
Ausgabe 233
6.3 Benannte Pipes 234
6.3.1 Grundbegriffe 234
6.3.2 FIFO 234 erstellen
6.3.3 FIFO-Betrieb 235
6.3.4 Sperrwirkung auf FIFO 236
6.3.5 SIGPIPE-Signal 237
6.4 System V IPC 237
6.4.1 Grundbegriffe 237
6.4.2 Nachrichtenwarteschlange 239
6.4.3 Semaphor 251
6.4.4 Semtool: interaktive Semaphoroperationen
Programm 260
6.4.5 Gemeinsamer Speicher 267
Kapitel 7 Soundprogrammierung 274
7.1 Interne Lautsprecherprogrammierung 274
7.2 Soundkartenprogrammierung 274
Kapitel 8 Zeicheneinheitsgrafiken 276
8.1 I/O-Funktionen in libc 277
8.1.1 Formatierte Ausgabe 277
8.1.2 Formatierte Eingabe 278
8.2 Termcap-Bibliothek 278
8.2.1 Vorwort 278
8.2.2 Terminalbeschreibung 279 abrufen
8.2.3 Terminalbeschreibung anzeigen 279
8.2.4 Termcap-Funktionen 280
8.3 Einführung in Ncurses 280
8.4 Initialisierung 282
8.5 Windows 283
8.6 Ausgabe 284
8.6.1 Formatierte Ausgabe 285
8.6.2 Zeichen/Zeile einfügen 286
8.6.3 Zeichen/Zeilen löschen 286
8.6.4 Kästchen und Linien 287
8.6.5 Hintergrundzeichen 287
8.7 Eingabe 288
8.8 Optionen 289
8.8.1 Ausgabeoptionen 289
8.8.2 Eingabemöglichkeiten 290
8.8.3 Terminaleigenschaften 291
8.8.4 Optionen verwenden 291
8.9 Terminal 292 aktualisieren
8.10 Videoeigenschaften und Farben 293
8.11 Cursor- und Bildschirmkoordinaten 294
8.12 Rollen 294
8.13 Tastatur 295
8.14 Soft-Tags 295
8.15 Sonstiges 295
8.16 Low-Level-Zugang 296
8.17 Bildschirmdump 296
8.18 Termcap-Simulation 296
8.19 Termininfo-Funktion 296
8.20 Debugging-Funktionen 297
8.21 Terminfo-Funktionen 297
8.21.1 Boolesche Fähigkeiten 297
8.21.2 Numerische Fähigkeiten 298
8.21.3 String-Fähigkeiten 299
8.22 [N]Curses-Funktionsübersicht 306
Kapitel 9 I/O-Port-Programmierung 307
9.1 Mausprogrammierung 307
9.2 Modemprogrammierung 308
9.3 Druckerprogrammierung 308
9.4 Joystick-Programmierung 308
Kapitel 10 Portieren von Anwendungen auf Linux 309
10.1 Einleitung 309
10.2 Signalverarbeitung 309
10.2.1 Unter SVR4, BSD und POSIX.1
Signal 310
10.2.2 Linux-Signaloptionen 310
10.2.3 Signale unter Linux 310
10.2.4 Von Linux 311 unterstützte Signale
10.3 Terminal I/O 311
10.4 Prozessinformationen und -steuerung 311
10.4.1 KVM-Prozess 312
10.4.2 Ptrace- und /proc-Dateisystem 312
10.4.3 Prozesssteuerung unter Linux 312
10.5 Tragbare bedingte Kompilierung 313
10.6 Ergänzende Anleitung 314
Anhang Alphabetisches System ruft 315 auf
Teil 4 Zusammenfassung der Systemstruktur des Linux-Kernel-Konzepts 323
Vorwort 324
Kapitel 1 Systemstruktur 325
1.1 Systemübersicht 325
1.2 Ziele des Kernels 325
1.3 Übersicht über die Kernelstruktur 325
1.4 Unterstützung mehrerer Entwickler 327
1.5 Systemdatenstruktur 328
1.5.1 Aufgabenliste 328
1.5.2 Speicherzuordnung 328
1.5.3 Indexknoten 328
1.5.4 Datenverbindung 329
Kapitel 2 Systemstruktur von Subsystemen 330
2.1 Prozessplaner-Systemstruktur 330
2.1.1 Ziele 330
2.1.2 Modul 330
2.1.3 Datenausdruck 331
2.1.4 Abhängigkeiten, Datenfluss und Kontrollfluss 331
2.2 Struktur des Speichermanagersystems 331
2.2.1 Ziele 331
2.2.2 Module 331
2.2.3 Datendarstellung 331
2.2.4 Datenfluss, Kontrollfluss und Abhängigkeiten 332
2.3 Systemstruktur des virtuellen Dateisystems 333
2.3.1 Ziele 333
2.3.2 Module 333
2.3.3 Datendarstellung 333
2.3.4 Datenfluss, Kontrollfluss und Abhängigkeiten 334
2.4 Struktur des Netzwerkschnittstellensystems 334
2.4.1 Ziele 334
2.4.2 Module 334
2.4.3 Datendarstellung 335
2.4.4 Datenfluss, Kontrollfluss und Abhängigkeiten 335
2.5 Struktur des prozessübergreifenden Kommunikationssystems 335
Kapitel 3 Fazit 336
Anhang A Definition der Begriffe 337
Anhang B Referenzen 338
Teil 5 Zusammenfassung der spezifischen Systemstruktur des Linux-Kernels 341
Kapitel 1 Vorwort 342
1.1 Ziele 342
1.2 Einführung in Linux 342
1.3 Hintergrundwissen zur Softwaresystemstruktur 342
1.4 Methoden und Ansätze 343
1,5 Leser, für die dieses Buch gedacht ist 344
1.6 Kapitelanordnung dieses Teils 344
Kapitel 2 Systemstruktur 345
Kapitel 3 Subsystemstruktur 346
3.1 Prozessplaner 346
3.1.1 Ziele 346
3.1.2 Externe Schnittstelle 346
3.1.3 Subsystembeschreibung 346
3.1.4 Datenstruktur 347
3.1.5 Subsystemstruktur 348
3.1.6 Subsystemabhängigkeiten 348
3.2 Speichermanager 348
3.2.1 Ziele 348
3.2.2 Externe Schnittstelle 349
3.2.3 Subsystembeschreibung 349
3.2.4 Datenstruktur 350
3.2.5 Subsystemstruktur 350
3.2.6 Subsystemabhängigkeiten 351
3.3 Virtuelles Dateisystem 352
3.3.1 Ziele 352
3.3.2 Externe Schnittstelle 352
3.3.3 Subsystembeschreibung 353
3.3.4 Gerätetreiber 353
3.3.5 Logisches Dateisystem 354
3.3.6 Module 354
3.3.7 Datenstruktur 355
3.3.8 Subsystemstruktur 355
3.3.9 Subsystemabhängigkeiten 355
3.4 Kommunikation zwischen Prozessen 355
3.4.1 Ziele 355
3.4.2 Externe Schnittstelle 357
3.4.3 Subsystembeschreibung 357
3.4.4 Datenstruktur 358
3.4.5 Subsystemstruktur 359
3.4.6 Subsystemabhängigkeiten 359
3.5 Netzwerkschnittstelle 360
3.5.1 Ziele 360
3.5.2 Externe Schnittstelle 361
3.5.3 Subsystembeschreibung 361
3.5.4 Datenstruktur 362
3.5.5 Subsystemstruktur 363
3.5.6 Subsystemabhängigkeiten 363
Kapitel 4 Fazit 365
Anhang A Definition der Begriffe 366
Anhang B Referenzen 368
Teil Sechs Anhang Anhang A Kopierlizenz für Linux-Dokumentprojekte 372
Anhang B GNU General Public License 374
Expandieren