Frage Was ist die kompatible Teilmenge der x86-64-Implementierungen von Intel und AMD?


Beim Erlernen der x86-64-Assemblierung stieß ich auf meine erste Inkompatibilität zwischen Intel 64 und AMD64-Implementierungen von "x86-64": Warum kompiliert syscall in NASM 32-Bit-Ausgabe, während Popa nicht in 64-Bit kompiliert?  syscall ist im Kompatibilitätsmodus des einen aber nicht des anderen gültig.

Gibt es einen besseren Weg, diese Inkompatibilitäten herauszufinden, außer beide Handbücher sorgfältig zu lesen und sie zu vergleichen, was fehleranfällig ist und meinen manuellen Leseaufwand verdoppelt, wenn ich nach Portabilität strebe?

Zum Beispiel wäre es viel einfacher, wenn es entweder

  • eine Standard-Untermenge, der sowohl Intel als auch AMD folgen wollen
  • Kommentare zum Intel-Handbuch über die AMD-Kompatibilität, da AMD das x86-64 erfunden hat. Aber das wäre für Intel natürlich schwierig, und die Intel-Handbücher enthalten das Wort AMD nicht.
  • einige allgemeine offizielle oder nicht offizielle Richtlinien, die die Kompatibilität bestimmter Teile gewährleisten. Zum Beispiel, etwas wie: Kompatibilitätsmodus möglicherweise nicht kompatibel, aber 64-Bit-Modus nicht.
  • einige gut gepflegte Liste von Inkompatibilitäten von Intel, AMD oder einigen Dritten

5
2018-04-23 20:43


Ursprung


Antworten:


Verlaufsnotiz: Intel implementierte ihre 64-Bit-ISA, die sie als IA-64 bezeichneten, eine vollständige Ersetzung der 32-Bit-x86-ISA in ihrer Itanium-Prozessorreihe. IA-64 war nicht abwärtskompatibel zu x86 und wurde außerhalb des High-End-Servermarktes nie wirklich populär.

AMD hat die AMD64 ISA als eine inkrementelle Entwicklung gegenüber der x86 IST EIN. AMD64 gewann Popularität und Akzeptanz schnell und Intel nahm es auch an, aber nannte es zu verschiedenen Zeiten IA-32e, EM64T und Intel64. Intel64 und AMD64 sind nahezu identisch mit einigen Unterschieden.

Wikipedia listet diese Unterschiede auf:

  • Die BSF- und BSR-Befehle von Intel 64 verhalten sich anders als die von AMD64, wenn die Quelle Null ist und die Operandengröße 32 Bit beträgt. Der Prozessor setzt das Null-Flag und lässt die oberen 32 Bits des Ziels undefiniert.

  • AMD64 benötigt ein anderes Microcode-Update-Format und steuert MSRs (modellspezifische Register), während Intel 64 Microcode-Updates unverändert von ihren 32-Bit-Prozessoren implementiert.

  • Intel 64 fehlen einige MSRs, die in AMD64 als architektonisch betrachtet werden. Dazu gehören SYSCFG, TOP_MEM und TOP_MEM2.

  • Intel 64 erlaubt SYSCALL / SYSRET nur im 64-Bit-Modus (nicht im Kompatibilitätsmodus) und erlaubt SYSENTER / SYSEXIT in beiden Modi. AMD64 fehlt SYSENTER / SYSEXIT in beiden Untermodi des langen Modus.

  • Im 64-Bit-Modus verhalten sich Beinahe-Zweige mit dem Präfix 66H (Operand Size Override) unterschiedlich. Intel 64 ignoriert dieses Präfix: Der Befehl hat einen 32-Bit-Vorzeichen-erweiterten Offset, und der Befehlszeiger ist nicht abgeschnitten. AMD64 verwendet ein 16-Bit-Offsetfeld in der Anweisung und löscht die obersten 48 Bits des Befehlszeigers.

  • AMD-Prozessoren lösen eine Floating-Point-Ungültige Ausnahme aus, wenn sie eine FLD oder FSTP eines 80-Bit-Signalisierungs-NaN ausführen, während Intel-Prozessoren dies nicht tun.

  • Intel 64 verfügt nicht über die Fähigkeit, eine reduzierte (und somit schnellere) Version des Gleitkommazustands zu speichern und wiederherzustellen (einschließlich der Anweisungen FXSAVE und FXRSTOR).

  • Aktuelle AMD64-Prozessoren haben die begrenzte Segmentierungsunterstützung über das LMSLE-Bit (Long Mode Segment Limit Enable) wieder eingeführt, um die Virtualisierung von 64-Bit-Gästen zu erleichtern.

  • Wenn AMD64-Prozessoren mit SYSRET zu einer nicht-kanonischen Adresse zurückkehren, führen sie den allgemeinen Schutzfehlerhandler in Privilegstufe 3 aus, während sie auf Intel 64-Prozessoren in Privilegstufe 0 ausgeführt werden.


5
2018-04-23 21:10