Je sais donc ce que les registres suivants et leurs utilisations sont supposés être:
CS = segment de code (utilisé pour IP)
DS = segment de données (utilisé pour MOV)
ES = Segment de destination (utilisé pour MOVS, etc.)
SS = segment de pile (utilisé pour SP)
Mais à quoi servent les registres suivants?
FS = "segment de fichier"?
GS = ???
Remarque: Je pas demande à propos d’un système d’exploitation en particulier - je demande également à quoi sert le processeur.
Il y a ce à quoi ils étaient destinés et ce à quoi ils sont utilisés par Windows et Linux.
L'intention initiale derrière les registres de segments était de permettre à un programme d'accéder à de nombreux segments de mémoire (volumineux) différents, censés être indépendants et faire partie d'un magasin virtuel persistant. L'idée est tirée du système d'exploitation Multics de 1966 , qui traitait les fichiers comme de simples segments de mémoire adressables. Pas de BS "Ouvrir le fichier, écrire l'enregistrement, fermer le fichier", juste "Stocker cette valeur dans ce segment de données virtuel" avec vidage de la page sale.
Nos systèmes d’exploitation actuels de 2010 représentent un énorme pas en arrière, c’est pourquoi on les appelle "eunuques". Vous pouvez uniquement adresser le segment unique de votre espace de processus , ce qui donne ce que l'on appelle un "espace d'adressage plat (à mon humble avis"). Les registres de segments sur la machine x86-32 peuvent toujours être utilisés pour de vrais registres de segments, mais personne ne l’a dérangé (Andy Grove, ancien président d’Intel, avait connu une crise publique assez célèbre au siècle dernier quand il avait découvert après tous ces ingénieurs son argent pour mettre en œuvre cette fonctionnalité, que personne ne va l'utiliser. Allez, Andy!)
AMD en 64 bits a décidé de ne pas se soucier d’éliminer Multics comme choix (c’est l’interprétation caritative; celle qui est peu charitable, c’est qu’ils n’avaient aucune idée de Multics) et donc de désactiver la capacité générale des registres de segments en mode 64 bits. Les threads avaient toujours besoin d'accéder au magasin local de threads, et chaque thread avait besoin d'un pointeur ... quelque part dans l'état du thread immédiatement accessible (par exemple, dans les registres) ... pour threader le magasin local. Étant donné que Windows et Linux utilisaient tous deux FS et GS (merci Nick pour cette précision) dans cette version 32 bits, AMD a décidé de laisser les registres de segments 64 bits (GS et FS) être utilisés essentiellement à cette fin (je pense que vous pouvez faites-les pointer n'importe où dans votre processus; ignore si le code de l'application peut les charger ou non). Intel dans sa panique pour ne pas perdre de parts de marché au profit d'AMD sur 64 bits, et Andy étant à la retraite, a décidé de copier le schéma d'AMD.
Il aurait été plus joli, à mon humble avis, d’imposer à la carte mémoire de chaque thread une adresse virtuelle absolue (par exemple, 0-FFF) qui était son stockage local de thread (aucun pointeur de registre [segment] requis!); Je l’ai fait dans un système d’exploitation 8 bits dans les années 1970 et c’était extrêmement pratique, comme si j’avais une autre pile de registres importante à utiliser.
Ainsi, les registres de segments ressemblent maintenant un peu à votre annexe. Ils servent un objectif résiduel. À notre perte collective.
Ceux qui ne connaissent pas l’histoire ne sont pas voués à la répéter; ils sont condamnés à faire quelque chose de plus bête.
Les registres FS
et GS
sont des registres de segments. Ils n'ont pas d'objet défini par le processeur, mais le système d'exploitation les utilise. Dans Windows 64 bits, le registre GS
est utilisé pour pointer vers les structures définies par le système d'exploitation. FS
et GS
sont couramment utilisés par les noyaux d'OS pour accéder à la mémoire spécifique à un thread. Dans Windows, le registre GS
permet de gérer la mémoire spécifique aux threads. Le noyau Linux utilise GS
pour accéder à la mémoire spécifique à un processeur.
[~ # ~] fs [~ # ~] est utilisé pour pointer vers le bloc d'informations de thread (TIB) sur les processus Windows.
un exemple typique est ( SEH ) qui stocke un pointeur sur une fonction de rappel dans FS:[0x00]
.
[~ # ~] gs [~ # ~] est couramment utilisé comme pointeur sur un stockage local de thread (TLS). et un exemple que vous avez peut-être vu auparavant est la protection contre le canari de pile (stackguard). Dans gcc, vous verrez peut-être quelque chose comme ceci:
mov eax,gs:0x14
mov DWORD PTR [ebp-0xc],eax
Selon le Manuel Intel, en mode 64 bits, ces registres sont destinés à être utilisés comme registres de base supplémentaires dans certains calculs d'adresses linéaires. Je l'ai tiré de la section 3.7.4.1 (p. 86 du jeu de 4 volumes). Habituellement, lorsque la CPU est dans ce mode, l'adresse linéaire est identique à l'adresse effective, car la segmentation n'est souvent pas utilisée dans ce mode.
Ainsi, dans cet espace d'adresses non hiérarchique, FS & GS jouent un rôle non seulement dans les données locales, mais également dans certaines structures de données du système d'exploitation (p. 2793, section 3.2.4); ces registres étaient donc destinés à être utilisés par le système d'exploitation, quels que soient ces concepteurs particuliers.
L'utilisation de substitutions dans les modes 32 et 64 bits constitue une astuce intéressante, mais il s'agit d'un logiciel privilégié.
Du point de vue des "intentions originales", il est difficile de dire que ce ne sont que des registres supplémentaires. Lorsque la CPU est en mode adresse réelle, cela revient à dire que le processeur est exécuté en tant que 8086 haute vitesse et que ces registres doivent être explicitement accessibles par un programme. Dans le but d'une véritable émulation 8086, vous exécuteriez le processeur avec mode virtuel-8086 et ces registres ne seraient pas utilisés.