Michael Beck, Harald Böhme, Mirko Dziadzka, Ulrich Kunitz, Robert Magnus, Dirk Verworner Linux-Kernel- Programmierung Algorithmen und Strukturen der Version 1.0 ADDISON-WESLEY PUBLISHING COMPANY Bonn Paris Reading, Massachusetts Menlo Park, California New York Don Mills, Ontario Wokingham, England Amsterdam Milan Sydney Tokyo Singapore Madrid San Juan Seoul Mexico City Taipei, IL/tl/ Taiwan X Cll VI fnv.-nr. 2.0%"i ß-
Inhaltsverzeichnis Vorwort Vorwort der Autoren x x 1 Linux - Das Betriebssystem 1 1.1 Wesentliche Eigenschaften 2 1.2 Linux-Distributionen 5 2 Die Übersetzung des Kerns 7 2.1 Wo finde ich was? 7 2.2 Die Übersetzung 11 2.3 Zusätzliche Konfigurationsmöglichkeiten.. 13 3 Einführung in den Kern 17 3.1 Algorithmen und Datenstrukturen 21 3.1.1 Die Task-Struktur 22 3.1.2 Die Prozeßtabelle 28 3.1.3 -Files und Inodes 30 3.1.4 Dynamische Speicherverwaltung 32 3.1.5 Warteschlangen 34 3.1.6 Systemzeit und Zeitgeber (Timer) 35 3.1.7 Signale 37 3.1.8 Interrupts 38 3.1.9 Booten des Systems 40
vi Inhaltsverzeichnis 3.1.10 Timerinterrupt 42 3.1.11 Scheduler 44 3.2 Implementation von Systemaufrufen 47 3.2.1 Wie funktionieren Systemaufrufe eigentlich? 48 3.2.2 Beispiele für einfache Systemaufrufe 50 ' 3.2.3 Beispiele für komplexere Systemaufrufe 52 3.2.4 Implementation eines neuen Systemaufrufes 63 Die Speicherverwaltung 67 4.1 Die Speicherverwaltung des 386 69 4.2 Segmentierung, 70 4.3 Paging 74 4.4 Speicherinitialisierung unter Linux 77 4.5 Der logische Adreßraum eines Prozesses 80 4.5.1 Der Nutzerbereich 81 4.5.2 Der Systemruf sys-brk() 83 4.5.3 Memory Mapping und virtuelle Speicherbereiche 84 4.5.4 Das Kernelsegment 89 4.5.5 Dynamische Speicherreservierung im Kernelmodus 90 4.6 Das Caching der Blockgeräte 93 4.7 Paging unter Linux 98 4.7.1 Das Finden einer freien Seite. 101 4.7.2 Seitenfehler und das Zurückladen einer Speicherseite... 105 Interprozeßkommunikation. 107 5.1 Synchronisation im Kern.. HO 5.2 Kommunikation über Dateien 112 5.2.1 Das Sperren ganzer Dateien 113 5.2.2 Sperren von Dateibereichen 114 5.3 Pipes 118 5.4 Debugging mit ptrace() 120 5.5 SystemVIPC 125 5.5.1 Zugriffsrechte, Nummern und Schlüssel 125 5.5.2 Semaphore 126 5.5.3 Messagequeues 130 5.5.4 Shared Memory 134 5.5.5 Die Befehle ipcs und ipcrm 139 5.6 IPC mit Sockets 140 5.6.1 Ein einfaches Beispiel 141 5.6.2 Die Implementation von Unix-Domain-Sockets 146
Inhaltsverzeichnis vii 6 Das LlNUX-Dateisystem 151 6.1 Grundlagen 152 6.2 Die Repräsentation von Dateisystemen im Kern.... 154 6.2.1 Das Mounten.. 154 6.2.2 Superblock-Operationen 157 6.2.3 Die Inode 159 6.2.4 Inode-Operationen 162 6.2.5 Die Filestruktur :... 166 6.2.6 File-Operationen 166 6.2.7 Das Öffnen einer Datei 169 6.3 Das proc-dateisystem 171 7 Gerätetreiber unter Linux 177 7.1 Zeichen-und Blockgeräte 179 7.2 Polling-und Interruptbetrieb 180 7.2.1 Polling 181 7.2.2 Interruptbetrieb 182 7.2.3 Bottom Halfs - Die unteren Interrupthälften 184 7.2.4 DMA-Betrieb....^ 186 7.3 Die Hardware.. 187 7.3.1 Hardwareerkennung 191 7.4 Die Implementation eines Treibers. 193 7.4.1 Die Setup-Funktion 195 7.4.2 mit, 196 7.4.3 Open und Release 198 7.4.4 ReadundWrite 199 7.4.5 IOCTL 202 7.4.6 Select.. : 203 7.4.7 Lseek, Readdir, MMap und Fsync 205 8 Netzwerkimplementation 207 8.1 Einführung und Überblick 208 8.1.1 Das Schichtenmodell der Netzwerkimplementation 210. 8.1.2 Die Reise der Daten 210 8.2 Wichtige Strukturen 215 8.2.1 Die socket-struktur :. 216 8.2.2 Die Struktur sk_buff- Pufferverwaltung im Netzwerk... 216 8.2.3 Der INET-Socket - spezieller Teil eines Sockets 219 8.2.4 Protokolloperationen in der proto-struktur 222 8.2.5 Die allgemeine Struktur einer Socketadresse 225 8.2.6 Echte Geräte der Netzwerkimplementation 226
viii Inhaltsverzeichnis 8.3 Abstrakte Netzwerkgeräte unter LINUX 226 8.3.1 Ethernet 232 8.3.2 SLIP und PLIP 233 8.3.3 Das Loopback-Gerät 234 8.4 ARP-Address Resolution Protocol.. 234 8.5 IP 236 8.5.1 Allgemeines über IP 236 8.5.2 Funktionen des IP 238 8.5.3 Routing 241 8.6 UDP 243 8.6.1 Funktionen des UDP 243 8.6.2 Weitere Funktionen 245 8.7 TCP 245 8.7.1 Allgemeines zum TCP 245 8.7.2 Der TCP-Kommunikationsendpunkt 246 8.7.3 Funktionen des TCP 248 8.8 Die Packet-Schnittstelle-eine Alternative? 252 A Systemaufrufe ^ 255. A.l Die Prozeßverwaltung 256 A.2 Das Dateisystem 282 A.3 Die Kommunikation 302 A.4 Die Speicherverwaltung : 305 A.5 Die Initialisierung 307 A.6 Und der ganze Rest 308 A.7 Nachbemerkungen 309 B Kernnahe Kommandos 311 B.l free - Übersicht über den Systemspeicher 311 B.2 ps - Ausgabe der Prozeßstatistik 312 B.3 Nachträgliche Kernkonfiguration 317 B.4 top - Die CPU-Charts 318 B.5 Init - Primus inter pares 319 B.6 shutdown - Das Herunterfahren des Systems 325 B.7 strace - Observierung eines Prozesses 326 B.8' Konfiguration des Netzwerk-Interfaces 327 B.9 traceroute - Der Ariadnefaden im Internet 328 B.10 Konfiguration einer seriellen Schnittstelle 330 B.ll Konfiguration einer parallelen Schnittstelle 333 C Das proc-dateisystem 335
Inhaltsverzeichnis ix D Der Bootprozeß 343 D.l Ablauf des Bootens,343 D.2 LILO-der Linux-Lader :. 346 D.2.1 MS-DOS-MBR startet LILO 346 D.2.2 LILO wird von einem Bootmanager gestartet 346 D.2.3 LILO im Master-Boot-Record : 347 D.2.4 LILO-Dateien 347 D.2.5 LILO-Boot-Parameter. 352 D.2.6 LILO-Startmeldungen 354 D.2.7 Fehlermeldungen 355 L Literaturverzeichnis. 357 I Index 361