wake-up-neo.com

Wofür ist das Register "FS" / "GS" bestimmt?

Ich weiß also, wie die folgenden Register und ihre Verwendung aussehen sollen:

  • CS = Code Segment (wird für IP verwendet)

  • DS = Datensegment (wird für MOV verwendet)

  • ES = Zielsegment (wird für MOVS usw. verwendet)

  • SS = Stack Segment (wird für SP verwendet)

Aber wofür sollen die folgenden Register verwendet werden?

  • FS = "Dateisegment"?

  • GS = ???

Hinweis: Ich frage nicht nach einem bestimmten Betriebssystem - ich frage, wofür sie von der CPU verwendet werden sollen, wenn überhaupt.

82
Mehrdad

Es gibt das, wofür sie gedacht waren und wofür sie von Windows und Linux verwendet werden.

Die ursprüngliche Absicht hinter den Segmentregistern war es, einem Programm den Zugriff auf viele verschiedene (große) Speichersegmente zu ermöglichen, die unabhängig und Teil eines beständigen virtuellen Speichers sein sollten. Die Idee stammt aus dem 1966 Multics-Betriebssystem , das Dateien als einfach adressierbare Speichersegmente behandelt. Keine BS "Datei öffnen, Datensatz schreiben, Datei schließen", nur "Diesen Wert in diesem virtuellen Datensegment speichern" mit Dirty Page Flushing.

Unsere aktuellen Betriebssysteme für 2010 sind ein großer Rückschritt, weshalb sie als "Eunuchen" bezeichnet werden. Sie können nur Ihr das einzelne Segment des Prozessraums adressieren, wodurch ein sogenannter "flacher (IMHO langweiliger) Adressraum" entsteht. Die Segmentregister auf der x86-32-Maschine können weiterhin für echte Segmentregister verwendet werden, aber niemand hat sich darum gekümmert (Andy Grove, ehemaliger Intel-Präsident, hatte im vergangenen Jahrhundert einen ziemlich bekannten öffentlichen Eindruck, als er herausfand, nachdem all diese Intel-Ingenieure Energie und Energie ausgegeben hatten sein Geld, um dieses Feature zu implementieren, dass niemand es benutzen würde.

AMD entschied auf 64-Bit umzugehen, dass es ihnen egal war, ob sie Multics als Option eliminierten (das ist die gemeinnützige Interpretation; die gemeinnützige ist, dass sie keine Ahnung von Multics hatten) und deaktivierte so die allgemeine Fähigkeit von Segmentregistern im 64-Bit-Modus. Es bestand immer noch eine Notwendigkeit für Threads, auf den lokalen Thread-Speicher zuzugreifen, und jeder Thread benötigte einen Zeiger ... irgendwo im unmittelbar zugänglichen Thread-Zustand (z. B. in den Registern) ..., um den lokalen Speicher zu fädeln. Da Windows und Linux beide FS und GS (danke Nick für die Klarstellung) für diesen Zweck in der 32-Bit-Version verwendeten, hat AMD beschlossen, die 64-Bit-Segmentregister (GS und FS) im Wesentlichen nur für diesen Zweck zu verwenden (ich denke, Sie können dies tun) Stellen Sie sicher, dass sie auf eine beliebige Stelle in Ihrem Prozessraum verweisen (keine Ahnung, ob der Anwendungscode sie laden kann oder nicht). Intel geriet in Panik, auf 64-Bit-Basis keine Marktanteile an AMD zu verlieren, und Andy, der im Ruhestand war, entschloss sich, nur das AMD-Schema zu kopieren.

Es wäre meiner Meinung nach architektonisch schöner gewesen, die Speicherzuordnung jedes Threads mit einer absoluten virtuellen Adresse (z. B. 0-FFF) auszustatten, die der lokale Speicher des Threads war (es wird kein [Segment] -Registerzeiger benötigt!); Ich habe dies in den 1970er Jahren unter einem 8-Bit-Betriebssystem getan und es war äußerst praktisch, als hätte man einen weiteren großen Stapel von Registern zum Arbeiten.

Die Segmentregister sind jetzt so ähnlich wie in Ihrem Anhang. Sie dienen einem urkundlichen Zweck. Zu unserem kollektiven Verlust.

Diejenigen, die die Geschichte nicht kennen, sind nicht dazu verdammt, sie zu wiederholen. Sie sind dazu verdammt, etwas Dümmeres zu tun.

90
Ira Baxter

Die Register FS und GS sind Segmentregister. Sie haben keinen prozessordefinierten Zweck, sondern werden durch die Betriebssysteme bestimmt, auf denen sie ausgeführt werden. In Windows 64-Bit wird das Register GS verwendet, um auf vom Betriebssystem definierte Strukturen zu verweisen. FS und GS werden häufig von Betriebssystemkernen verwendet, um auf den threadspezifischen Speicher zuzugreifen. In Windows wird das Register GS zur Verwaltung des threadspezifischen Speichers verwendet. Der Linux-Kernel verwendet GS, um auf den CPU-spezifischen Speicher zuzugreifen.

38
cytinus

[~ # ~] fs [~ # ~] wird verwendet, um auf den Thread-Informationsblock (TIB) bei Windows-Prozessen zu verweisen.

ein typisches Beispiel ist ( SEH ), das einen Zeiger auf eine Rückruffunktion in FS:[0x00] speichert.

[~ # ~] gs [~ # ~] wird üblicherweise als Zeiger auf einen Thread Local Storage (TLS) verwendet. und ein Beispiel, das Sie vielleicht schon einmal gesehen haben, ist der Stack-Canary-Schutz (Stackguard), in gcc sieht es vielleicht so aus:

mov    eax,gs:0x14
mov    DWORD PTR [ebp-0xc],eax
6
zerocool

Nach Angaben des Intel-Handbuchs sollen diese Register im 64-Bit-Modus als zusätzliche Basisregister für einige lineare Adressberechnungen verwendet werden. Ich habe dies aus Abschnitt 3.7.4.1 gezogen (S. 86 im 4-Volume-Set). Wenn sich die CPU in diesem Modus befindet, ist die lineare Adresse in der Regel mit der effektiven Adresse identisch, da in diesem Modus die Segmentierung häufig nicht verwendet wird.

In diesem flachen Adressraum spielen also FS & GS eine Rolle bei der Adressierung nicht nur lokaler Daten, sondern bestimmter Datenstrukturen des Betriebssystems (S. 2793, Abschnitt 3.2.4), weshalb diese Register verwendet werden sollten Durch das Betriebssystem bestimmen jedoch diese bestimmten Designer.

Es gibt einige interessante Tricks bei der Verwendung von Overrides im 32- und 64-Bit-Modus, aber dies beinhaltet privilegierte Software.

Aus der Perspektive der "ursprünglichen Absichten" ist es schwer zu sagen, dass es sich nicht nur um zusätzliche Register handelt. Wenn sich die CPU in Real Address Mode befindet, ist dies so, als ob der Prozessor mit einer hohen Geschwindigkeit von 8086 läuft und ein Programm explizit auf diese Register zugreifen muss. Für eine echte 8086-Emulation würden Sie die CPU in Virtual-8086-Modus ausführen, und diese Register würden nicht verwendet.

1
Robert Houghton