title: Global Descriptor Table
text: # Global Descriptor Table
  
  La tabella dei descrittori globale o Global Descriptor Table (GDT) è una struttura dati usata dai processori della famiglia x86 di Intel, 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 poiché in una memoria segmentata si hanno in genere $2^{14}$ (16384) segmenti, la metà dei quali (8192) assegnati a informazioni di sistema, l'altra alle informazioni dei processi utente. La metà dei descrittori è dunque memorizzata nella GDT, l'altra metà nella LDT. 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 della Base |
  
  ### 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!
  
  I 20 bit del campo limit sono da interpretare come numero di unità da 8 byte o come numero di pagina indirizzabili all'interno del segmento. Se dunque si utilizzano pagina da 4 KB (12 bit) e il campo limit ha il valore 0xFFFFF la dimensione del segmento è pari a 4 GB (dimensione massima di un segmento in una macchina a 32 bit).
  
  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 1, la CPU utilizza questo segmento per dati e codice, se impostato a 0, 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 essere 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 |
  