Speichersegmentierung - Memory segmentation

Speichersegmentierung ist eine Betriebssystem - Speicherverwaltungstechnik der Teilung eines Computers sind primäre Speicher in Segmente oder Abschnitte . In einem Computersystem, das Segmentierung verwendet, umfasst ein Verweis auf einen Speicherplatz einen Wert, der ein Segment identifiziert, und einen Offset (Speicherplatz) innerhalb dieses Segments. Segmente oder Abschnitte werden auch in Objektdateien von kompilierten Programmen verwendet, wenn sie zu einem Programmbild miteinander verknüpft sind und wenn das Bild in den Speicher geladen wird.

Segmente entsprechen normalerweise natürlichen Unterteilungen eines Programms, wie beispielsweise einzelnen Routinen oder Datentabellen, so dass die Segmentierung für den Programmierer im Allgemeinen besser sichtbar ist als das Paging allein. Verschiedene Segmente können für verschiedene Programm erstellt werden Module oder für verschiedene Klassen von Speichernutzung wie Code und Datensegmenten . Bestimmte Segmente können von Programmen gemeinsam genutzt werden.

Segmentierung wurde ursprünglich als ein Verfahren erfunden , mit denen die Systemsoftware unterschiedliche Software isolieren könnte Prozesse ( Tasks ) und Daten , die sie verwenden. Es sollte die Zuverlässigkeit der Systeme erhöhen, die mehrere Prozesse gleichzeitig ausführen. In einer x86-64-Architektur wird es als Legacy betrachtet und die meisten x86-64-basierten modernen Systemsoftware verwenden keine Speichersegmentierung. Stattdessen handhaben sie Programme und deren Daten, indem sie Memory-Paging verwenden, das auch als Speicherschutz dient. Die meisten x86-64-Implementierungen unterstützen dies jedoch aus Gründen der Abwärtskompatibilität.

Hardwareimplementierung

In einem System, das Segmentierung verwendet, bestehen Computerspeicheradressen aus einer Segment-ID und einem Offset innerhalb des Segments. Eine Hardware- Speicherverwaltungseinheit (MMU) ist dafür verantwortlich, das Segment und den Offset in eine physikalische Adresse zu übersetzen und Prüfungen durchzuführen, um sicherzustellen, dass die Übersetzung durchgeführt werden kann und dass der Verweis auf dieses Segment und diesen Offset erlaubt ist.

Jedem Segment sind eine Länge und ein Satz von Berechtigungen (z. B. read , write , execute ) zugeordnet. Ein Prozess darf nur dann auf ein Segment verweisen, wenn die Art der Referenz durch die Berechtigungen erlaubt ist und der Offset innerhalb des Segments innerhalb des durch die Länge des Segments angegebenen Bereichs liegt. Andernfalls wird eine Hardware-Ausnahme wie ein Segmentierungsfehler ausgelöst .

Segmente können auch verwendet werden, um virtuellen Speicher zu implementieren . In diesem Fall hat jedes Segment ein zugehöriges Flag, das anzeigt, ob es im Hauptspeicher vorhanden ist oder nicht. Wenn auf ein Segment zugegriffen wird, das nicht im Hauptspeicher vorhanden ist, wird eine Ausnahme ausgelöst und das Betriebssystem liest das Segment aus dem Sekundärspeicher in den Speicher.

Die Segmentierung ist eine Methode zur Implementierung des Speicherschutzes . Paging ist eine andere, und sie können kombiniert werden. Die Größe eines Speichersegments ist im Allgemeinen nicht festgelegt und kann nur ein einzelnes Byte betragen .

Die Segmentierung wurde auf verschiedene Weise auf unterschiedlicher Hardware implementiert, mit oder ohne Paging. Die Intel x86-Speichersegmentierung passt nicht zu beiden Modellen und wird weiter unten separat und auch in einem separaten Artikel ausführlicher behandelt.

Segmentierung ohne Paging

Jedem Segment sind Informationen zugeordnet, die angeben, wo sich das Segment im Speicher befindet – die Segmentbasis . Wenn ein Programm auf eine Speicherstelle verweist, wird der Offset zur Segmentbasis hinzugefügt, um eine physikalische Speicheradresse zu erzeugen.

Eine Implementierung von virtuellem Speicher auf einem System, das Segmentierung ohne Paging verwendet, erfordert, dass ganze Segmente zwischen Hauptspeicher und Sekundärspeicher hin und her getauscht werden. Wenn ein Segment eingelagert wird, muss das Betriebssystem genügend zusammenhängenden freien Speicher zuweisen, um das gesamte Segment aufzunehmen. Häufig kommt es zu einer Speicherfragmentierung, wenn nicht genügend zusammenhängender Speicher vorhanden ist, obwohl insgesamt genug vorhanden sein kann.

Segmentierung mit Paging

Anstelle eines tatsächlichen Speicherplatzes enthalten die Segmentinformationen die Adresse einer Seitentabelle für das Segment. Wenn ein Programm auf einen Speicherplatz verweist, wird der Offset unter Verwendung der Seitentabelle in eine Speicheradresse übersetzt. Ein Segment kann einfach erweitert werden, indem eine andere Speicherseite zugewiesen und der Seitentabelle des Segments hinzugefügt wird.

Eine Implementierung von virtuellem Speicher auf einem System, das Segmentierung mit Paging verwendet, bewegt normalerweise nur einzelne Seiten zwischen Hauptspeicher und Sekundärspeicher hin und her, ähnlich wie bei einem ausgelagerten nicht segmentierten System. Seiten des Segments können sich überall im Hauptspeicher befinden und müssen nicht zusammenhängend sein. Dies führt normalerweise zu einer geringeren Eingabe/Ausgabe zwischen Primär- und Sekundärspeicher und zu einer verringerten Speicherfragmentierung.

Geschichte

Der B5000- Computer der Burroughs Corporation war einer der ersten, der eine Segmentierung implementierte, und "vielleicht der erste kommerzielle Computer, der virtuellen Speicher bereitstellte", basierend auf der Segmentierung. Der spätere B6500- Computer implementierte auch die Segmentierung; eine Version seiner Architektur wird noch heute auf den Unisys ClearPath Libra-Servern verwendet.

Der Computer GE-645 , eine Modifikation des GE-635 mit Segmentierungs- und Paging-Unterstützung, wurde 1964 entwickelt, um Multics zu unterstützen .

Der 1975 begonnene Intel iAPX 432 versuchte, eine echte segmentierte Architektur mit Speicherschutz auf einem Mikroprozessor zu implementieren.

Die 960MX-Version der Intel i960- Prozessoren unterstützte Lade- und Speicherbefehle, wobei die Quelle oder das Ziel ein "Zugriffsdeskriptor" für ein Objekt und ein Offset in das Objekt ist, wobei sich der Zugriffsdeskriptor in einem 32-Bit-Register und mit dem Offset befindet berechnet aus einem Basis-Offset im nächsten Register und aus einem zusätzlichen Offset und optional einem in der Anweisung angegebenen Indexregister. Ein Zugriffsdeskriptor enthält Erlaubnisbits und einen 26-Bit-Objektindex; Der Objektindex ist ein Index in eine Tabelle von Objektdeskriptoren, die einen Objekttyp, eine Objektlänge und eine physikalische Adresse für die Daten des Objekts, eine Seitentabelle für das Objekt oder die Seitentabelle der obersten Ebene für ein zweistufiges . angibt Seitentabelle für das Objekt, abhängig vom Objekttyp.

Prime- , Stratus- , Apollo- , IBM System/38- und IBM AS/400- (einschließlich IBM i ) Computer verwenden eine Speichersegmentierung.

x86-Architektur

Die von frühen x86- Prozessoren, beginnend mit dem Intel 8086 , verwendete Speichersegmentierung bietet keinen Schutz. Jedes Programm, das auf diesen Prozessoren läuft, kann ohne Einschränkungen auf jedes Segment zugreifen. Ein Segment wird nur durch seine Startposition identifiziert; Es gibt keine Längenprüfung. Die Granularität der Segment-Startadresse beträgt 16 Byte und der Offset beträgt 16 Bit, wodurch Segmentgrößen bis zu 64 KiB unterstützt werden Offset-Wrap-Around).

Die Segmentierung in den Intel 80286 und höher bietet Schutz: Mit der Einführung des 80286 hat Intel den alleinigen Betriebsmodus der bisherigen x86-CPU-Modelle rückwirkend „ Real Mode “ genannt und einen neuen „ Protected Mode “ mit Schutzfunktionen eingeführt. Aus Gründen der Abwärtskompatibilität starten alle x86-CPUs im "Real Mode" ohne Speicherschutz, festen 64-KB-Segmenten und nur 20-Bit-(1024-KB-)Adressierung. Ein Prozessor 80286 oder höher muss per Software in einen anderen Modus geschaltet werden, um seinen vollen Adressraum und die erweiterten MMU-Funktionen nutzen zu können.

Der Intel 80386 und neuere Prozessoren unterstützen auch Paging; in diesen Prozessoren enthält die Segmenttabelle, anstatt auf eine Seitentabelle für das Segment zu zeigen, die Segmentadresse im linearen Speicher . Adressen im linearen Speicher werden dann unter Verwendung einer separaten Seitentabelle auf physikalische Adressen abgebildet, wenn das Paging aktiviert ist.

Die x86-64- Architektur verwendet keine Segmentierung im Long-Modus (64-Bit-Modus). In einer x86-64-Architektur wird es als Legacy betrachtet und die meisten x86-64-basierten modernen Systemsoftware verwenden keine Speichersegmentierung. Stattdessen handhaben sie Programme und deren Daten, indem sie Memory-Paging verwenden, das auch als Speicherschutz dient. Obwohl die meisten x86-64-Implementierungen es aus Gründen der Abwärtskompatibilität immer noch unterstützen. Vier der Segmentregister: CS, SS, DS und ES werden auf 0 und die Grenze auf 2 64 gezwungen . Die Segmentregister FS und GS können immer noch eine Basisadresse ungleich Null haben. Dadurch können Betriebssysteme diese Segmente für spezielle Zwecke verwenden.

Siehe auch

Verweise

Externe Links