Die Speichersegmentierung ist ein Verfahren der Speicherverwaltung, bei dem der Speicher in logisch zusammengehörige, variabel große Segmente aufgeteilt wird. Ein Programm besteht typischerweise aus Segmenten für Programmcode, Daten, Stack und Heap. Anders als beim Paging mit seinen festen Seitengrößen sind die Segmente für den Programmierer und den Compiler sichtbar und besitzen eine fachliche Bedeutung.
Adressierung und Segmenttabelle
Eine Speicheradresse setzt sich aus einer Segmentnummer und einem Offset innerhalb des Segments zusammen. Eine Segmenttabelle (in der Hardware oft Deskriptortabelle genannt) hält für jedes Segment Basisadresse und Länge. Dadurch lassen sich pro Segment Zugriffsrechte und Schutz vergeben: Ein Codesegment kann als ausführbar, ein Datensegment als beschreibbar markiert werden. Auch das Teilen von Segmenten zwischen Prozessen (Shared Libraries) ist möglich.
Segmentierung im Vergleich zum Paging
- Segmentierung: variable Blockgröße, logische Einheiten, externe Fragmentierung durch wechselnde Belegung — Gegenmittel ist die Kompaktierung.
- Paging: feste Seitengröße, physische Sicht, keine externe Fragmentierung, dafür interne Fragmentierung im letzten Seitenrest.
- In der Praxis kombinieren viele Systeme beide Verfahren (segmentiertes Paging): Segmente werden logisch gebildet und intern in Seiten aufgeteilt.
Segmentierung auf x86-Prozessoren
Die Intel-x86-Architektur kennt Segmentregister (CS, DS, SS, ES, FS, GS) und Deskriptortabellen (GDT, LDT). Im Protected Mode wird die Segmentierung mit Paging kombiniert; im 64-Bit-Modus (Long Mode) ist die klassische Segmentierung weitgehend abgeschaltet und durch ein flaches Speichermodell (Flat Model) ersetzt. Die Speicherverwaltung moderner Betriebssysteme stützt sich daher fast vollständig auf Paging — die zugrunde liegenden Seiten werden im Kern häufig über das Buddy-System allokiert.
Verwandte Grundlagen: Fragmentierung, Memory Paging, Virtueller Speicher, Call Stack, Heap.