Vai al contenuto

Global Descriptor Table

Da Wikipedia, l'enciclopedia libera.

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'