Vai al contenuto

Global Descriptor Table

Da Wikipedia, l'enciclopedia libera.
Versione del 15 ago 2011 alle 06:10 di FrescoBot (discussione | contributi) (Bot: sintassi e spaziatura dei link)

La Tabella dei descrittori globale o Global Descriptor Table o semplicemente GDT è una struttura dati usata dai processori della famiglia x86 di Intel, usata, a partire dall'80286, 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 è utilizzato dai moderni sistemi operativi.

Come lavora il sistema operativo

Per caricare la GDT il sistema operativo deve eseguire l'istruzione LGDT addr, dove addr è l'indirizzo della struttura che rappresenta il registro della GDT.

Questo registro, composto da 48 bit, ha questa struttura:

Dimensione Nome Descrizione
word Limit Dimensione in byte totale della GDT - 1
dword Base Indirizzo fisico della GDT

La tabella dei descrittori globali

La dimensione massima della GDT è di 8192 elementi (questo perché, il limit del GDTR è una word (16 bit) e 216 fa 65536 che diviso la dimensione di un elemento (8 byte) fa 8192). 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:

Dimensione Nome Descrizione
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

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'

Access

Il campo access contiene diverse informazioni. Ogni bit specifica come viene utilizzato quel segmento:

Bit Nome Descrizione
7 Present Indica se il segmento è presente o no in memoria, viene impostato sempre ad 1
6 - 5 DPL Indica il livello di privilegio rispetto alla CPU di quel segmento
4 System Se impostato a 0, la CPU utilizza questo segmento per dati e codice, se impostato ad 1, si tratta di un TSS (Task State Segment) o un Call Gate
3 - 0 Type Indica al processore i diritti che ha sul segmento (read-only/write ad esempio)

Granularity

Il campo granularity, così come il campo access fornisce diverse informazioni:

Bit Nome Descrizione
7 Granularity 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.

6 Operation Size Indica se il segmento viene utilizzato a 16 o a 32 bit
5 Reserved Deve esserer impostato a 0
4 AVL Questo campo veniva utilizzato nei processori precedenti alla serie Pentium. Ora è utilizzabile liberamente dal sistema operativo
3 - 0 LimitHigh I 4 bit più alti del campo Limit

Voci correlate

Collegamenti esterni

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica