Global Descriptor Table
# Global Descriptor Table

La Table globale de descripteurs (GDT : Global Descriptor Table en anglais) est une structure de données utilisée par les processeurs de la famille x86 (le premier à l'avoir utilisée est le Intel 80286) pour référencer les descripteurs de segment les plus utilisés par les processus.

C'est une partie spéciale de la mémoire principale utilisée dans le mode protégé. Dans ce mode, au contraire du mode réel, on ne peut pas accéder comme on le désire à n'importe quelle portion de la mémoire. La gestion de la mémoire en mode protégé est plus complexe, mais offre de nombreux avantages dont la protection de l'espace d'adressage de chaque programme.

En mode protégé, les adresses de segments contenues dans les registres de segments CS, DS, ES et SS ont toujours 16 bits mais ne représentent plus des endroits physiques. Les registres de segments contiennent des « sélecteurs », dont une partie sert d'indice dans GDT où se trouvent décrits les segments de la mémoire. En consultant cette table, le processeur prend connaissance de l'adresse de base du segment. Enfin l'adresse finale est déterminée en ajoutant un décalage donné sous la forme d'un pointeur FAR à l'adresse trouvée.

La structure d'un sélecteur est la suivante :

* bit 0 à 1 : RPL → Requested Privilege Level, c'est-à-dire le niveau de privilège du segment référencé.
* bit 2 : TI → Task Indicator, indique si l'index est relatif à la GDT ou à une LDT (Local Descriptor Table)
* bit 3 à 15 : INDEX → indice dans la GDT ou une LDT.

Les 8 premiers indices de la GDT sont réservés à une utilisation particulière. L'indice 0 de la GDT n'est pas utilisé.

## Utilisation de GDT par Windows

### Chargeur d'amorçage NTLDR

Le chargeur d'amorçage NTLDR fait passer le processeur du mode réel au mode protégé (voir Processus de démarrage de Windows NT#Phase de chargement à l'amorçage).

## Utilisation de GDT par linux

Sous Linux, il n'existe qu'une seule GDT par processeur. En effet, Linux n'utilisant que très peu la segmentation, les adresses linéaires correspondent aux adresses logiques et sont donc identiques pour tous les processus (systèmes ou utilisateurs).

Voir les chargeurs d"amorçage de linux :

* GRUB, voir
* LILO

## Sources

* Michael Tischer, Bible PC - Programmation Système. Micro Application, 1996.
* Volume III: Intel System Programming Guide (édition relative au Pentium IV)
