Was ist der Zweck von Segmentregistern im geschützten x86-Modus?

8

Ich muss einige DLLs ändern, aber ich weiß nicht, was genau die Segmentregister ( DS , SS , ...) im geschützten Modus macht. Ich habe in der Schule über den echten 16-Bit-Modus gelernt, bei dem die Segmentregister um 16 multipliziert werden und der Versatz im normalen Register die effektive Adresse im physikalischen Speicher angibt. Im geschützten Modus gibt es ein flaches Speichermodell und virtuellen Speicher, wobei jeder Prozess 4GB Speicher hat, also wenn Register 32-Bit haben, kann ich jedes Byte des virtuellen Speichers nur durch das "Offset" -Register adressieren. Also welche puproses haben im geschützten Modus Segment-Register, zum Beispiel

%Vor%     
Krab 11.03.2013, 09:27
quelle

3 Antworten

6

Grundlegend ist der Zweck der gleiche wie im Real-Modus, außer dass sie etwas anders funktionieren. DS in Ihrem Beispiel wählt einen Speicherdeskriptor in Ihrem GDT (google diesen Begriff, wenn Sie das wirklich verstehen wollen, "Global descriptor table"), der Informationen wie Basisadresse, Endadresse, Granularität usw. enthält. Ihr Offset wird dann zur Basisadresse addiert , das Ende. Wenn Sie auf Windows sind (ich wette auf Linux ist das gleiche), müssen Sie sich im Allgemeinen keine Gedanken über diese Segmentregister machen, wie Sie sein flaches Modell sagten, das bedeutet, dass es nur einen Deskriptor für den gesamten Speicher geben sollte Diese Register sollten so funktionieren, als ob sie gar nicht existierten.

    
Pyjong 11.03.2013, 10:19
quelle
5

Historischer Hintergrund

Der 8086 verwendete immer ein festes 64KiB-Fenster pro Segment, dessen Startadresse berechnet wurde durch (Segmentregister * 16). Seit dem 80286 gibt es einige spezielle Tabellen im Speicher (GDT und LDT). Diese Tabellen enthalten die Startadresse, die Länge und die Zugriffsrechte eines Segments. Die Segmentregister (CS, DS, ES, SS - und seit 80386: FS, GS) enthalten Indizes zu diesen Tabellen.

Theoretisch kann also ein Betriebssystem den Offset und die Länge eines Segments so einstellen, wie er es möchte: Auf 8086 DS = 0x0123 bedeutet: Segment ist 64KiB, beginnend bei der Adresse 0x01230. Im 32-Bit-Modus kann DS = 0x0123 bedeuten: Segmentstart bei Adresse 0xABCD, Länge ist 0xEF Bytes - dies ist abhängig vom Inhalt der vom Betriebssystem erstellten GDT- und LDT-Tabellen. Wenn Sie versuchen, auf ein Segment außerhalb dieses Bereichs zuzugreifen (DS: 0x1000, wenn die Länge & lt; 0x1000 ist), wird eine Ausnahme (Interrupt) verursacht.

Aktuelle Situation

Die meisten modernen 32-Bit-Betriebssysteme verwenden jedoch keine Segmentregister mehr. Ihre Werte werden abhängig vom Modus (Kernel oder Benutzer) aufgrund von Zugriffsrechten festgelegt. Die Startadresse ist typischerweise 0 und die Länge ist 4GiB.

Der echte Speicherschutz erfolgt über die MMU, so dass im Benutzermodus nicht auf einige Speicherbereiche zugegriffen werden kann. In modernen Betriebssystemen ist die MMU absolut essentiell. Es bildet eine "absolute" virtuelle Adresse auf eine reale physikalische Adresse ab, die nach Verletzungen des Zugriffsrechts sucht.

Es gibt eine Ausnahme: Einige Betriebssysteme (z. B. Windows und Linux) verwenden die FS- und / oder GS-Segmente, um wirklich auf einen anderen Speicherbereich zu zeigen.

Aus diesem Grund verwenden die x86-Prozessoren im 64-Bit-Modus das CS-Register nur für Zugriffsrechte, und FS und GS können verwendet werden, um jeder Adresse einen Offset hinzuzufügen. Soweit ich weiß, werden DS, ES und SS nicht verwendet, während der Inhalt der Register FS und GS keine Rolle spielt, aber es gibt spezielle Register, die explizit den Offset angeben, der zu einer Operation hinzugefügt wird, die FS oder GS verwendet >     

Martin Rosenau 11.11.2013 10:50
quelle
0

Ich gebe Ihnen eine einfache Antwort, aber für weitere Informationen empfehle ich den unten stehenden Link zu AMDs Architekturdokumenten, sehr einfach zu lesen. PS: Ich habe hier nicht Xeon oder PAE behandelt ..

IA-32 (x86) -Architektur verfügt über einen physischen 32-Bit-Adressbus für RAM.

Der 32-Bit-Bus ist weiter unterteilt in 2x 16-Bit-Segmente, von denen jedes auf 2 GB RAM mit insgesamt 4 GB zugreifen kann.
Dies wird Speicherbankumschaltung genannt.

Um den Schutz zu ermöglichen, entschied sich Intel zusammen mit MS dafür, ein Segment für den Kernelmodus und das andere für den Benutzermodus zu verwenden. Aus diesem Grund hatte Windows in der Vergangenheit einen Adressraum mit 2 GB Usermode. Es ist eine x86-Hardwarebeschränkung, keine Windows-Beschränkung.

Das Segment registriert getrennte Kernel-Space- und Userspace-Adressen. So wurde der Speicherschutz implementiert.

Außerdem hatte IA-32 general auch 32bit interne Register, so dass es nicht pagen konnte. Dies ist der Realmodus (keine Adressübersetzung).

Paging benötigt 36bits Ich denke (zitieren Sie mich nicht), wo IA32e kam. Die zusätzlichen Bits auf IA-32e erlaubt Paging von der Festplatte, dies ist die einzige Möglichkeit, es unter x64 Windows ausführen konnte, da x64 NX und Es befindet sich bei 63.

Bitte lesen Sie die AMD-Architekturdokumente, persönlich finde ich sie informativer als die Intel-Versionen.

Ссылка

PS mit AMD64 Flat Memory wurde eingeführt, die Segmente wurden entfernt.

32-Bit-Prozesse benötigen jedoch immer noch Segmentregister. Auf AMD64, wenn ein 32-Bit-Prozess den oberen Teil des Stapels erreicht, wird ein Zeiger auf eine Basisadresse in einem neuen Segmentregister geworfen. Auf diese Weise können 32-Bit-Apps effektiv so viel RAM verbrauchen, wie sie wollen, keine Begrenzung. Nun, im Rahmen der ...:)

Hoffe, das hilft.

    
Robert Fischer 03.08.2017 13:41
quelle

Tags und Links