|
Linux Kernelarchitektur
Konzepte, Strukturen und Algorithmen von Kernel 2.6
Anhänge zum Download und zusätzliche Informationen auf www.linux-kernel.de
Wolfgang Mauerer
Carl Hanser Verlag
EAN: 9783446225664 (ISBN: 3-446-22566-8)
770 Seiten, hardcover, 18 x 25cm, Oktober, 2003
EUR 49,90 alle Angaben ohne Gewähr
|
|
Umschlagtext
Die Leistungsfähigkeit von Linux wurde in der aktuellen Kernelversion 2.6 weiter gesteigert. Das Buch führt den Leser tief unter die Oberfläche des Systems und zeigt, welche Konzepte und Strukturen dem Kern zugrunde liegen und wie seine Teile ineinander greifen. Es führt detailliert in die Datenstrukturen, Algorithmen und Konzepte von Linux ein und gibt praktische Tipps, wie mit den Quellen gearbeitet werden kann. Außerdem erklärt es die Abstraktionsmechanismen, die Linux auf allen modernen Plattformen vom Handheld bis zum Großrechner einsetzbar machen.
Alle relevanten Bestandteile und Subsysteme des Kerns werden behandelt:
• Prozessverwaltung und Scheduling
• Speicherverwaltung und Caching
• Flushing und Swapping
• Dateisysteme (Ext2, Ext3, Proc und das virtuelle Dateisystem)
• Netzwerke und Kommunikationsmechanismen
• Kernelaktivitäten und Zeitverwaltung
• Gerätetreiber, Busse und Hardware-Interaktion
• Systemaufrufe
• Module
Im Internet:
Anhänge zu ergänzenden Themen rund um den Kernel, eine Crossreferenz des Quellcodes, Zusatzdokumente, Links und mehr
Verlagsinfo
Wer die Leistungsfähigkeit von Linux nutzen will, muss verstehen, wie das System arbeitet, welche Konzepte und Strukturen verwendet werden und wie die Teile ineinander greifen. Dieses Buch führt detailliert in die Mechanismen von Linux ein und beschreibt ihre Implementierung.
Alle relevanten Subsysteme des Kerns werden behandelt:
• Prozessverwaltung und Scheduling
• Speicherverwaltung, Caching und Swapping
• Dateisysteme
• Netzwerke und Kommunikationsmechanismen
• Gerätetreiber
• Module
Der Autor zeigt die große Leistungsfähigkeit des Kernels und wie sie optimal genutzt werden kann. Ebenso erklärt er die Abstraktionsmechanismen, die Linux vom Handheld bis zum Großrechner auf allen Plattformen einsetzbar machen. Zahlreiche praktische Tipps zeigen, wie mit den Quellen gearbeitet werden kann.
Inhaltsverzeichnis
1 Einführung und Überblick
1.1 Aufgaben des Kerns
1.2 Implementierungsstrategien
1.3 Bestandteile des Kernels
1.3.1 Prozesse, Taskswitching und Scheduling
1.3.2 Unix-Prozesse
1.3.3 Aufbau des virtuellen Adressraums
1.3.4 Privilegstufen
1.3.5 Virtuelle und physikalische Adressräume
1.3.6 Seitentabellen
1.3.7 Systemaufrufe
1.3.8 Gerätetreiber, Block- und Zeichengeräte
1.3.9 Netzwerke
1.3.10 Dateisysteme
1.3.11 Module
1.3.12 Caching
1.3.13 Listenverwaltung
1.3.14 Datentypen
2 Prozessverwaltung
2.1 Prozessprioritäten
2.2 Lebenszyklus eines Prozesses
2.2.1 Präemptives Multitasking
2.3 Repräsentation von Prozessen
2.3.1 Prozesstypen
2.3.2 Prozessidentifikations-Nummern
2.3.3 Das Tasknetzwerk
2.4 Systemaufrufe zur Prozessverwaltung
2.4.1 Prozessverdoppelung
2.4.2 Kernel-Threads
2.4.3 Starten neuer Programme
2.4.4 Prozesse beenden
2.5 Implementierung des Schedulers
2.5.1 Prozess-Scheduling
2.5.2 Datenstrukturen
2.5.3 Priority Scheduling
2.6 Erweiterungen des Schedulers
2.6.1 Echtzeitprozesse
2.6.2 SMP-Scheduling
2.6.3 Kernel-Präemption
3 Speicherverwaltung
3.1 Überblick
3.2 Organisation nach dem (N)UMA-Modell
3.2.1 Überblick
3.2.2 Datenstrukturen
3.3 Seitentabellen
3.3.1 Datenstrukturen
3.3.2 Einträge erzeugen und manipulieren
3.4 Initialisierung der Speicherverwaltung
3.4.1 Aufsetzen der Datenstrukturen
3.4.2 Architektur-spezisches Setup
3.4.3 Speicherverwaltung während des Bootens
3.5 Verwaltung des physikalischen Speichers
3.5.1 Allokator-API
3.5.2 Seiten reservieren
3.5.3 Seiten zurückgeben
3.5.4 Kernallokation unzusammenhängender Seiten
3.5.5 Kernelmappings
3.6 Der Slab-Allokator
3.6.1 Speicherverwaltung im Kern
3.6.2 Prinzip der Slab-Allokation
3.6.3 Implementierung
3.6.4 Allgemeine Caches
3.7 Verwaltung des virtuellen Prozessspeichers
3.7.1 Der virtuelle Prozess-Adressraum
3.7.2 Datenstrukturen
3.7.3 Operationen mit Regionen
3.7.4 Adressräume
3.7.5 Memory Mappings
3.7.6 Reverse Mapping
3.7.7 Verwaltung des Heaps
3.7.8 Behandlung von Seitenfehlern
3.7.9 Korrektur von Userspace-Seitenfehlern
3.7.10 Kernel-Seitenfehler
3.7.11 Daten kopieren zwischen Kernel- und Userspace
3.8 Prozessorcache- und TLB-Steuerung
4 Interprozesskommunikation und Locking
4.1 Steuerungsmechanismen
4.1.1 Race Conditions
4.1.2 Critical Sections
4.2 Locking-Mechanismen des Kerns
4.2.1 Atomare Operationen
4.2.2 Spinlocks
4.2.3 Semaphoren
4.2.4 Reader/Writer-Locks
4.2.5 Das große Kernel-Lock
4.3 System V-Interprozesskommunikation
4.3.1 System V-Mechanismen
4.3.2 Semaphoren
4.3.3 Message Queues
4.3.4 Shared Memory
4.4 Andere IPC-Mechanismen
4.4.1 Signale
4.4.2 Pipes und Sockets
5 Gerätetreiber
5.1 IO-Architektur
5.1.1 Erweiterungshardware
5.2 Zugriff auf Erweiterungsgeräte
5.2.1 Gerätespezialdateien
5.2.2 Zeichen-, Block- und sonstige Geräte
5.2.3 Gerätekontrolle mit Ioctls
5.3 Treiberregistrierung
5.4 Verbindung mit dem Dateisystem
5.4.1 Gerätedatei-Elemente in Inoden
5.4.2 Repräsentation von Major und Minor Number
5.4.3 Standard-Dateioperationen
5.4.4 Standardoperationen für Zeichengeräte
5.4.5 Standardoperationen für Blockgeräte
5.5 Treiberoperationen
5.5.1 Zeichengeräte
5.5.2 Blockgeräte
5.5.3 Implementierung von Ioctls
5.6 Ressourcen-Reservierung
5.6.1 Ressourcenverwaltung
5.6.2 IO-Memory
5.6.3 IO-Ports
5.7 Bussysteme
5.7.1 Das allgemeine Driver Model
5.7.2 Der PCI-Bus
5.7.3 USB
6 Module
6.1 Module verwenden
6.1.1 Einfügen und Entfernen
6.1.2 Abhängigkeiten
6.1.3 Automatisches Laden
6.1.4 Abfragen von Moduleigenschaften
6.2 Module einfügen und löschen
6.2.1 Modulrepräsentation
6.2.2 Abhängigkeiten und Referenzen
6.2.3 Binärer Aufbau von Modulen
6.2.4 Module einfügen
6.2.5 Module entfernen
6.3 Automatisierung und Hotplugging
6.3.1 Automatisches Laden mit kmod
6.3.2 Hotplug
6.4 Versionskontrolle
6.4.1 Checksummenverfahren
6.4.2 Funktionen zur Versionskontrolle
7 Das virtuelle Dateisystem
7.1 Dateisystemtypen
7.2 Das Common File Model
7.2.1 Inoden
7.2.2 Verknüpfungen
7.2.3 Programmierschnittstelle
7.2.4 Dateien als Universalschnittstelle
7.3 Aufbau des VFS
7.3.1 Strukturüberblick
7.3.2 Inoden
7.3.3 Prozesspezische Informationen
7.3.4 Dateioperationen
7.3.5 Dentry-Cache
7.4 Arbeiten mit VFS-Objekten
7.4.1 Dateisystemoperationen
7.4.2 Dateioperationen
7.5 Standardfunktionen
7.5.1 Generische Leseroutine
7.5.2 Der nopage-Mechanismus
8 Dateisystemimplementierungen
8.1 Second Extended Filesystem
8.1.1 Physikalischer Aufbau
8.1.2 Datenstukturen
8.1.3 Anlegen des Dateisystems
8.1.4 Dateisystemaktionen
8.2 Third Extended Filesystem
8.2.1 Konzepte
8.2.2 Datenstrukturen
8.3 Das proc-Dateisystem
8.3.1 Inhalt von /proc
8.3.2 Datenstrukturen
8.3.3 Initialisierung
8.3.4 Einhängen des Dateisystems
8.3.5 Verwaltung von /proc-Einträgen
8.3.6 Informationen lesen und schreiben
8.3.7 Taskbezogene Informationen
8.3.8 Der System Control-Mechanismus
9 Netzwerke
9.1 Verkettete Computer
9.2 ISO/OSI- und TCP/IP-Referenzmodell
9.3 Kommunikation über Sockets
9.3.1 Anlegen eines Sockets
9.3.2 Verwendung von Sockets
9.3.3 Datagram-Sockets
9.4 Das Schichtmodell der Netzwerkimplementierung
9.5 Socketpuffer
9.5.1 Datenverwaltung mit Socketpuffern
9.5.2 Verwaltungsdaten eines Socketpuffers
9.6 Datenübertragungsschicht
9.6.1 Repräsentation von Netzwerkgeräten
9.6.2 Empfangen von Paketen
9.6.3 Senden von Paketen
9.7 Vermittlungsschicht
9.7.1 IPv4
9.7.2 Empfangen von Paketen
9.7.3 Lokale Auslieferung an die Transportschicht
9.7.4 Paketweiterleitung
9.7.5 Pakete senden
9.7.6 Netlter
9.7.7 IPv6
9.8 Transportschicht
9.8.1 UDP
9.8.2 TCP
9.9 Anwendungsschicht
9.9.1 Socket-Datenstrukturen
9.9.2 Sockets und Dateien
9.9.3 Der socketcall-Systemaufruf
9.9.4 Sockets erzeugen
9.9.5 Daten empfangen
9.9.6 Daten versenden
10 Systemaufrufe
10.1 Grundlagen der Systemprogrammierung
10.1.1 Verfolgung von Systemaufrufen
10.1.2 Unterstützte Standards
10.1.3 Restarting system calls
10.2 Vorhandene Systemaufrufe
10.3 Realisierung von Systemaufrufen
10.3.1 Struktur von Systemcalls
10.3.2 Zugriffe auf den Userspace
10.3.3 Systemcall-Tracing
10.3.4 Systemaufrufe vom Kernel aus
11 Kernel-Aktivitäten und Zeituss
11.1 Interrupts
11.1.1 Interrupt-Typen
11.1.2 Hardware-IRQs
11.1.3 Bearbeiten von Interrupts
11.1.4 Initialisierung und Reservierung von IRQs
11.1.5 Abarbeiten von IRQs
11.2 Software-Interrupts
11.2.1 Starten der SoftIRQ-Verarbeitung
11.2.2 Der SoftIRQ-Daemon
11.3 Tasklets undWork Queues
11.3.1 Tasklets
11.4 Wait Queues und Completions
11.4.1 Wait Queues
11.4.2 Completions
11.4.3 Work Queues
11.5 Kerneltimer
11.5.1 Einsatz von Timern
11.5.2 Zeitdomänen
11.5.3 Der Timer-Interrupt
11.5.4 Datenstrukturen
11.5.5 Dynamische Timer
11.5.6 Aktivierung neuer Timer
11.5.7 Implementierung der timerbezogenen Systemaufrufe
11.5.8 Verwaltung der Prozesszeiten
12 Page- und Buffer-Cache
12.1 Struktur des Page-Caches
12.1.1 Verwalten und Finden gecacheter Seiten
12.1.2 Zurückschreiben modizierter Daten
12.2 Der Buffer-Cache
12.3 Adressräume
12.3.1 Datenstrukturen
12.3.2 Seitenbäume
12.3.3 Operationen auf Adressräumen
12.4 Implementierung des Puffer-Caches
12.4.1 Datenstrukturen
12.4.2 Operationen
12.4.3 Zusammenspiel von Page und Buffer Cache
12.4.4 Eigenständige Puffer
12.4.5 Operationen mit ganzen Seiten
13 Datensynchronisation
13.1 pdflush
13.2 Starten eines neuen Threads
13.3 Thread-Initialisierung
13.4 Durchführen der Arbeit
13.5 Periodisches Zurückschreiben
13.6 Assoziierte Datenstrukturen
13.6.1 Seitenstatus
13.6.2 Writeback-Kontrolle
13.6.3 Anpassbare Parameter
13.7 Zentrale Steuerung
13.8 Superblock-Synchronisation
13.9 Inoden-Synchronisation
13.10 Verstopfungen
13.11 Zurückschreiben unter Druck
13.12 Systemaufrufe zur Synchronisationskontrolle
13.13 Vollständige Synchronisierung
13.13.1 Synchronisieren der Inoden
13.14 Synchronisieren einzelner Dateien
13.15 Synchronisieren von Memory Mappings
14 Swapping
14.1 Überblick
14.1.1 Auslagerbare Seiten
14.1.2 Page Thrashing
14.1.3 Algorithmen zur Seitenersetzung
14.2 Swapping im Linux-Kernel
14.2.1 Organisation des Swap-Bereichs
14.2.2 Überprüfen der Speicherauslastung
14.2.3 Auswahl auszulagernder Seiten
14.2.4 Behandlung von Page Faults
14.2.5 Verkleinern von Kernelcaches
14.3 Verwaltung von Swap-Bereichen
14.3.1 Datenstrukturen
14.3.2 Anlegen
14.3.3 Aktivieren eines Swap-Bereichs
14.4 Der Swap-Cache
14.4.1 Identikation ausgelagerter Seiten
14.4.2 Aufbau des Caches
14.4.3 Einfügen neuer Seiten
14.4.4 Suchen einer Seite
14.5 Zurückschreiben der Daten
14.6 Seitenauswahl ? Swap Policy
14.6.1 Überblick
14.6.2 Datenstrukturen
14.6.3 Verkleinern von Zonen
14.6.4 Auffüllen der inactive-Liste
14.6.5 Auslagern inaktiver Seiten
14.7 Behandlung von Page Faults
14.7.1 Einlagern der Seite
14.7.2 Lesen der Daten
14.7.3 Swap-Readahead
14.8 Auslösen des Swappings
14.8.1 Periodisches Auslagern mit kswapd
14.8.2 Auslagern bei akuter Speicherknappheit
14.9 Verkleinern anderer Caches
14.9.1 Datenstrukturen
14.9.2 Registrieren und Entfernen von Shrinkern
14.9.3 Cache-Verkleinerung
Literaturverzeichnis
Index
Symbole
Folgende Anhänge sind online auf http://www.linux-kernel.de verfügbar:
A Architekturspezifisches
B Arbeiten mit demQuellcode
C Anmerkungen zu C
D Systemstart
E Das ELF-Binärformat
|
|
|