Segment-Deskriptor
Englisch: segment descriptor
Ein Teil der Segmentierungseinheit, die verwendet wird, um eine logische Adresse in eine lineare Adresse zu übersetzen.
Segmentdeskriptor: Speicherübersetzungsdatensatz in x86-Prozessoren
Ein Segmentdeskriptor ist eine 64-Bit-Datenstruktur in einer Segmenttabelle, die den Speicherort, die Größe und die Zugriffsberechtigung eines Speichersegments beschreibt. Der Prozessor nutzt sie, um eine logische Adresse (Segmentauswahl plus Offset) in eine lineare Adresse umzuwandeln, die auf den eigentlichen physikalischen Speicher zeigt. Diese Übersetzung läuft im geschützten Modus auf x86- und x86-64-Architekturen in Mikrosekunden ab und findet bei jedem Speicherzugriff statt.
Jeder Deskriptor enthält die Basisadresse des Segments (32 Bit bei 386-Prozessoren und später), die Segmentgrenze (die Größe oder Obergrenze des Segments definiert), und Steuerbits, die den Segmenttyp (Code, Daten oder System), die Privilegierungsstufe und Lese- und Schreibberechtigungen angeben. Der Deskriptor umfasst auch ein Present-Bit, das signalisiert, ob das Segment aktuell im Speicher geladen ist, und ein Granularitäts-Bit, das festlegt, ob die Grenze in Bytes oder in 4-Kilobyte-Seiten gemessen wird.
Wo Deskriptoren gespeichert werden und wie sie funktionieren
Segmentdeskriptoren werden je nach Umfang und Zweck in der Global Descriptor Table (GDT), der Local Descriptor Table (LDT) oder der Interrupt Descriptor Table (IDT) gespeichert. Wenn Software einen Segmentauswahl in ein Segmentregister lädt (CS für Code, DS für Daten usw.), ruft der Prozessor automatisch den entsprechenden Deskriptor aus der zugehörigen Tabelle ab und speichert ihn in einem verborgenen Register. Nachfolgende Speicheroperationen nutzen diesen gepufferten Deskriptor zur Adressübersetzung, bis sich das Segmentregister ändert.
Das Privilegierungsstufen-Feld im Deskriptor (2 Bit, das 4 Ebenen von 0 bis 3 ermöglicht) setzt Speicherschutz durch, indem es verhindert, dass Code mit niedrigerer Privilegierung auf höher privilegierte Segmente zugreift. Ein Deskriptor mit Privilegierungsstufe 0 ist nur für Kernel-Code zugänglich; einer mit Stufe 3 ist für Benutzeranwendungen zugänglich. Wenn Code versucht, auf ein Segment zuzugreifen, für das ihm die Berechtigung fehlt, löst der Prozessor einen General Protection Fault aus.
Häufige Probleme entstehen, wenn Deskriptoren fehlerhaft konfiguriert sind: Eine falsche Basisadresse oder Grenze führt dazu, dass Speicherzugriffe vom oder an den falschen Speicherort erfolgen, oft mit Beschädigung anderer Daten oder Code; ein fehlende Present-Bit löst eine Ausnahme aus. Das Debuggen von Deskriptorproblemen erfordert direktes Lesen der GDT und LDT mit Kernel-Tools, da die gepufferten Werte in den Segmentregistern für Software nicht direkt sichtbar sind.