2010-07-02 18 views
4

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?

+1

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. –

Répondre

1

CS est utilisé non seulement pour la base et la limite, mais aussi pour les autorisations. Le CPL est codé là, ainsi que d'autres domaines tels que:

  • D-bit - 32 bits ou 16 bits taille de segment par défaut
  • L-bit - sélectionne le mode de compatibilité ou 64 bits pour la segment (et dans ce cas la base et la limite sont significatives)

Les sauts lointains peuvent également passer par une porte de tâche, et les appels éloignés peuvent également passer par des portes d'appel. Tous ces éléments doivent être gérés, quel que soit le mode 64 bits. En résumé, un saut lointain en mode 64 bits n'est pas plus rapide qu'en mode 32 bits. En effet, si le mode 64 bits est activé, les descripteurs de segment sont deux fois plus importants que lorsque le mode 64 bits est désactivé, tous les accès aux tables de descripteurs sont doublés, ce qui peut allonger la durée du saut.