IA-32e 64-Bit-IDT-Gate-Deskriptor

8

Es gibt einen Segment Selector in Intels 64-Bit IDT Gate Descriptor. Aus meinem Verständnis über die 5-teiligen Intel-Handbücher wird jedoch die lineare Adresse des Interrupt-Handlers aus dem 64-Bit-Offset, der in dem IDT-Gate-Deskriptor spezifiziert ist, in RIP geladen.

Die einzige Verwendung des Segmentselektors besteht darin, Folgendes zu überprüfen:

  1. wenn es eine Änderung der Berechtigungsstufen
  2. gibt
  3. Der Interrupt-Handler zeigt wirklich auf ein Codesegment

Meine Fragen sind dann:

  1. Wird RIP nur vom 64-Bit-Offset genommen? Oder ist RIP = Offset (Vorzeichen erweitert auf 64-Bit) + Segment Selektor Basis?
  2. Wird die Basisadresse, auf die der Segmentselektor im IDT Gate Descriptor zeigt, ignoriert? Oder hat es einen Nutzen?

Vielen Dank im Voraus!

    
Vern 27.11.2011, 09:59
quelle

1 Antwort

6

Wenn ich das richtig interpretiere, verwendet x64 laut den Intel-Handbüchern keine Segmentierung. Ich lese AMDs Systemprogrammierung für AMD64 um einen Sinn daraus zu machen, da ich ihre Erklärungen viel leichter nachvollziehen kann sie befassen sich explizit mit x86_64 (sie haben es erfunden, nehme ich an); sie sagen:

  

Im Langmodus hängen die Auswirkungen der Segmentierung davon ab, ob der Prozessor kompatibel ist   Modus oder 64-Bit-Modus:

     
  • Im Kompatibilitätsmodus funktioniert die Segmentierung genauso wie im Legacy-Modus unter Verwendung der Legacy-16-Bit- oder 32-Bit-Protected-Mode-Semantik.
  •   
  • 64-Bit-Modus, die Segmentierung ist deaktiviert, wodurch ein flacher 64-Bit-Bereich für virtuelle Adressen entsteht. Wie man sehen wird, bestimmte Funktionen von einigen   Segmentregister, insbesondere die System-Segmentregister, fahren fort   im 64-Bit-Modus verwendet werden.
  •   

Suchen Sie speziell nach Abschnitt 4.8 Long-Segment-Deskriptoren. Um deine zweite Frage zu beantworten:

  

Felder im 64-Bit-Modus ignoriert. Die Segmentierung ist in 64-Bit deaktiviert   Modus und Code-Segmente umfassen den gesamten virtuellen Speicher. In diesem Modus werden Code-Segment-Basisadressen ignoriert. Für die Berechnung virtueller Adressen wird die Basisadresse so behandelt, als hätte sie den Wert Null.

Zur Interpretation: Da ein "Segment" in x86_64 der gesamte Adressraum ist, macht eine Basisadresse keinen Sinn außer 0, da Offsets absolut (relativ zu 0) sind.

Dies würde daher die erste Frage beantworten, die ich glaube - RIP wird als der 64-Bit-Offset-Wert genommen. Von der Gatedeskriptorseite des gleichen Kapitels:

  

Im Long-Modus werden Gate-Deskriptoren um 64 Bit erweitert, sodass sie 64-Bit-Offsets beibehalten können.

Im Umgang mit Datensegmenten wird es jedoch komplizierter:

  

Datensegmente, die von den FS- und GS-Segmentregistern referenziert werden, erhalten eine spezielle Behandlung in 64-Bit   Modus. Für diese Segmente wird das Basisadressfeld nicht ignoriert, und ein Wert ungleich null kann verwendet werden   in virtuellen Adressberechnungen. Eine 64-Bit-Segment-Base-Adresse kann mithilfe von   spezifische Register. Weitere Informationen finden Sie unter "FS- und GS-Register im 64-Bit-Modus" auf Seite 70.

In diesem Abschnitt heißt es:

  

FS- und GS-Register im 64-Bit-Modus. Im Gegensatz zu den Segmenten CS, DS, ES und SS sind dies FS und GS   Segmentüberschreibungen können im 64-Bit-Modus verwendet werden. Wenn FS- und GS-Segmentüberschreibungen in 64-Bit verwendet werden   Modus werden ihre jeweiligen Basisadressen in der Berechnung der effektiven Adresse (EA) verwendet. Das Ganze   Die EA-Berechnung wird dann (FS oder GS) .Base + Basis + (Skalierung * Index) + Verschiebung. Die FS.base   und GS.base-Werte werden auch auf die volle virtuelle 64-Bit-Adressgröße erweitert, wie in Abbildung 4-5 dargestellt.   Die resultierende EA-Berechnung kann positive und negative Adressen einschließen.

     

Im 64-Bit-Modus werden FS-Segment- und GS-Segment-Overrides nicht auf Limit oder Attribute geprüft. Stattdessen,   Der Prozessor prüft, ob alle Verweise auf virtuelle Adressen in kanonischer Form vorliegen.

Mit anderen Worten, Datensegmente können so funktionieren, wie eine Segmentierung verwendet wird, obwohl nur die Form der Segmentierung geprüft wird, anstatt zu prüfen, ob die Form des Zugriffs innerhalb der Grenzen des Segments liegt.

Ich denke, das ist die richtige Interpretation; Korrekturen / Zeiger werden jedoch sehr geschätzt.

    
user257111 27.11.2011, 19:32
quelle