2015-04-23 10 views
5

Durante l'apprendimento dell'assembly x86-64, ho trovato la mia prima incompatibilità tra le implementazioni di Intel 64 e AMD64 di "x86-64": Why does syscall compile in NASM 32 bit output while popa does not compile in 64 bit?syscall è valido nella modalità di compatibilità dell'uno ma non dell'altro.Qual è il sottoinsieme compatibile delle implementazioni x86-64 di Intel e AMD?

C'è un modo migliore per scoprire quelle incompatibilità oltre a leggere attentamente entrambi i manuali e confrontarli, che è soggetto a errori e duplica il mio sforzo di lettura manuale quando si mira alla portabilità?

Per esempio, sarebbe molto più facile se ci fosse uno:

  • un sottoinsieme standard che sia Intel che pretesa AMD a seguire
  • commenti sul manuale Intel sulla compatibilità di AMD in quanto AMD è stata quella inventare x86-64. Ma naturalmente, per Intel sarebbe difficile da mantenere, e i manuali Intel non contengono la parola AMD.
  • alcune linee guida generali ufficiali o non ufficiali che garantiscono la compatibilità di alcune parti. Ad esempio, qualcosa di simile: la modalità di compatibilità potrebbe essere incompatibile, ma la modalità a 64 bit no.
  • qualche lista ben tenuta di incompatibilità da parte di Intel, AMD o qualche terza parte
+2

Come sempre , [Wikipedia] (http://en.wikipedia.org/wiki/X86-64#Differences_between_AMD64_and_Intel_64) è un buon punto di partenza! – RaGe

+0

@RaGe hai ragione, e mi sento stupido :-) –

risposta

5

Storia nota: Intel implementato il loro 64-bit ISA, che hanno chiamato IA-64 che era una sostituzione completa dei 32-bit x86 ISA, nella loro linea di processori Itanium. IA-64 non era retrocompatibile con x86 e non è mai diventato popolare al di fuori del mercato dei server di fascia alta.

AMD ha creato l'AMD64 ISA come evoluzione incrementale rispetto allo standard x86 ISA. L'AMD64 ha guadagnato rapidamente popolarità e accettazione e Intel lo ha adottato, ma lo ha chiamato IA-32e, EM64T e Intel64 in vari momenti. Intel64 e AMD64 sono quasi identici con alcune differenze.

Wikipedia liste queste differenze:

  • istruzioni BSF e BSR di Intel 64 agire in modo diverso rispetto AMD64, quando la sorgente è pari a zero e la dimensione degli operandi è di 32 bit. Il processore imposta il flag di zero e lascia i 32 bit superiori della destinazione indefiniti.

  • AMD64 richiede un formato di aggiornamento microcodice diverso e controlla MSR (registri specifici del modello) mentre Intel 64 implementa l'aggiornamento del microcodice invariato rispetto ai processori solo a 32 bit.

  • Intel 64 manca alcuni MSR che sono considerati architettonici in AMD64. Questi includono SYSCFG, TOP_MEM e TOP_MEM2.

  • Intel 64 consente SYSCALL/SYSRET solo in modalità a 64 bit (non in modalità di compatibilità) e consente SYSENTER/SYSEXIT in entrambe le modalità. AMD64 non ha SYSENTER/SYSEXIT in entrambe le sotto-modalità della modalità lunga.

  • In modalità a 64 bit, vicino ai rami con il prefisso 66H (operando di ridimensionamento della dimensione) si comportano in modo diverso. Intel 64 ignora questo prefisso: l'istruzione ha un offset esteso con segno a 32 bit e il puntatore di istruzioni non viene troncato. AMD64 utilizza il campo offset a 16 bit nell'istruzione e cancella i 48 bit superiori del puntatore di istruzioni.

  • I processori AMD generano un punto fluttuante Eccezione non valida quando si esegue un FLD o FSTP di un NaN di segnalazione a 80 bit, mentre i processori Intel no.

  • Intel 64 non ha la possibilità di salvare e ripristinare una versione ridotta (e quindi più veloce) dello stato a virgola mobile (che coinvolge le istruzioni FXSAVE e FXRSTOR).

  • I recenti processori AMD64 hanno reintrodotto il supporto limitato per la segmentazione, tramite il bit LMSLE (Long Mode Segment Limit Enable), per semplificare la virtualizzazione degli ospiti a 64 bit.

  • Quando si ritorna a un indirizzo non canonico utilizzando SYSRET, processori AMD64 eseguire il gestore generale errore di protezione a livello di privilegio 3, mentre su Intel 64 processori che viene eseguito in livello di privilegio 0.

+2

Hai ottenuto la tua storia all'indietro: IA64/Itanium (che è totalmente diverso da IA32/x86) precede AMD64. (Intel inizialmente non intendeva che le CPU x86 stessero mangiando nella loro linea di server a 64 bit costosa e di fascia alta). – ninjalj

+0

@ninjalj Hai ragione. Fissaggio. – RaGe

Problemi correlati