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:
Meine Fragen sind dann:
Vielen Dank im Voraus!
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.
Tags und Links assembly intel x86-64 operating-system