Global Descriptor Table
La Tabella dei descrittori globale o Global Descriptor Table o semplicemente GDT è una struttura dati usata dai processori della famiglia x86 di Intel, usata per definire varie aree di memoria nell'esecuzione di un programma, come per esempio l'indirizzo base, la dimensione e i privilegi di accesso come l'eseguibilità e la scrittura. Queste aree di memoria sono chiamate segmenti nella terminologia Intel.
La GDT contiene altro oltre ai descrittori di segmento. Ogni 8 byte nella GDT rappresentano un descrittore, ma questi possono essere descrittori Task State Segment (o TSS), descrittori LDT , o descrittori Call Gate. Gli ultimi, i Call Gate, sono particolarmente importanti per trasferire il controllo tra i vari livelli di privilegi degli x86, anche se questo metodo non è itilizzato dai moderni sistemi operativi.
Per caricare la GDT il sistema operativo deve eseguire l'istruzione GDTR addr, dove addr è l'indirizzo della struttura che rappresenta il registro della GDT.
Questo registro ha questa struttura:
word Limit: dimensione totale della GDT - 1 dword Base: indirizzo fisico della GDT
La dimensione massima della GDT è di 8192 elementi. I processori Intel richiedono che il primo elemento della GDT, e quindi i primi 8 byte, sia settato a 0. Ogni elemento della GDT ha questa struttura:
word LimitLow: i primi 16 bit del Limit word BaseLow: i primi 16 bit della Base byte BaseMiddle: i bit 17 - 24 della Base byte Access: vedi sotto byte Granularity: vedi sotto byte BaseHigh: i bit 25 - 32 della Base
Access
Il campo access contiene diverse informazioni. Ogni bit specifica come viene utilizzato quel segmento:
bit 7: Present: indica se il segmento è presente o no in memoria, viene impostato sempre ad 1 bit 6, 5: Descriptor Privilege Level: indica a che livello di privilegio si trova quel segmento bit 4: System: indica se il segmento contiene dati o codice (0) oppure è un segmento di sistema (1) bit 3 - 0: indica i diritti del processore su quel segmento (read/write, expand up/down...)
Granularity
Il campo granularity, così come il campo access fornisce diverse informazioni:
bit 7: se impostato ad 1, il campo limit viene moltiplicato per 4096. In questo modo si può ottenere come dimensione massima del segmento 4 GB, altrimenti, a 0, la dimensione massima è di 1 MB. bit 6: se impostato ad 1 indica che il segmento viene utilizzato per operazioni a 32 bit, altrimenti a 16 bit 5: deve essere impostato a 0 bit 4: questo campo veniva utilizzato con i processori precedenti alla serie Pentium. Ora è disponibile per il sistema operativo bit 3 - 0: rappresentano i 4 bit più alti del campo limit.
Base
Il campo base (32 bit) è formato dai campi BaseLow (16 bit), BaseMiddle (8 bit) e BaseHigh (8 bit). Questo campo indica l'indirizzo fisico da cui comincia il segmento. Diversi segmenti possono "sovrapporsi"
Limit
Il campo limit (20 bit) è formato dal campo LimitLow (16 bit), e i 4 bit più bassi del campo Granularity. Questo campo indica la lunghezza del segmento, non l'indirizzo finale!
Quindi un segmento copre le aree di memoria comprese tra 'Base' e 'Base + Limit'