Résumé rapide: en mode x86-64, les sauts lointains sont-ils aussi lents qu'en mode x86-32?x86-64 et appels/sauts lointains
Sur le processeur x86, sauts se divisent en trois types:
- court, avec un décalage PC de 127 octets (+/- 2 d'instruction octet)
- près, avec une variation de +/- 32k décalage qui « roule » le segment courant (3 instruction d'octets)
- loin, qui peuvent sauter partout (5 instruction d'octets)
sauts court et près de prendre 1-2 cycles d'horloge, alors que les sauts loin prennent 50 -80 cycles d'horloge, en fonction de processeur. D'après ma lecture de la documentation, c'est parce qu'ils "sortent de CS, le segment de code actuel".
En mode x86-64, les segments de code ne sont pas utilisés - Le segment est toujours 0..infini. Ergo, il ne devrait pas y avoir de pénalité pour sortir d'un segment.
Ainsi, la question: Le nombre de cycles d'horloge change-t-il pour un saut lointain si le processeur est en mode x86-64?
Question bonus connexe: La plupart des systèmes d'exploitation de type nix fonctionnant en mode protégé 32 bits définissent explicitement les tailles de segment à 0..infinité et gèrent la translation linéaire -> entièrement via les tables de pages. Est-ce qu'ils en retirent un avantage en termes de temps pour les appels lointains (moins de cycles d'horloge), ou est-ce que la pénalité est vraiment un héritage de CPU interne des registres de segment de taille depuis le 8086?
Votre commentaire sur les systèmes \ * nix s'applique également à Windows, AFAIK. Je ne pense pas qu'il existe * un système d'exploitation moderne qui utilise des segments de code. –