Il modello segmentato in protected mode
Come sappiamo, nel funzionamento in modo reale il processore vede la memoria come
composta di segmenti la cui dimensione massima è fissata a 64K. Una locazione
di memoria viene individuata tramite una coppia di numeri che costituisce quello che
viene chiamato l'indirizzo logico (Logical Address, LA), composto di un indirizzo base
( Base Address, BA), e di un offset. Per ottenere dal LA
l'indirizzo fisico, il processore moltiplica il BA per 16 (…"aggiunge" uno 0hex)
e lo somma all'offset.
Riassumendo quindi, nel funzionamento real mode:
- i segmenti devono avere una dimensione massima di 64K
- è possibile accedere a tutti i segmenti sia in lettura che in scrittura
- l’accesso ad un segmento avviene tramite un numero
di 16 bit, l’indirizzo base, contenuto in uno dei registri segmento e un
offset
- All’indirizzo base, trasformato in un indirizzo fisico di 20 bit viene
aggiunto l'offset e ciò che si ottiene è l'indirizzo fisico della locazione di
memoria a cui il microprocessore deve accedere
Le caratteristiche generali del modello segmentato protected mode si possono riassumere nei
seguenti punti:
- i segmenti possono avere
una dimensione qualunque, da 0 a 4Gb
- non a tutti i segmenti è
possibile accedere in lettura e/o scrittura, a meno che non si
possiedano adeguati privilegi
- Ogni segmento viene descritto da una speciale struttura dati di 8 byte chiamata Descrittore di
Segmento (Segment Descriptor, SD)
- Tutti i SD vengono
allocati in una o più tabelle in memoria RAM. Una tabella di questo tipo si
chiama Tabella dei Descrittori (Descriptors Table, DT)
- Il registro segmento, che
ora viene denominnato selettore, non contiene più l'indirizzo base del segmento, ma
un indice che dà la posizione del Descrittore di Segmento nella Tabella dei Descrittori
Ogni Descrittore di Segmento contiene i seguenti campi:
-
Base Address, 32 bit
- contiene l’indirizzo fisico (completo) della prima locazione del segmento
- Limit, 20 bit
- dà la dimensione del
segmento.
- può essere espresso in
unità di bytes o in unità di 4Kb (pagine)
- Se è espresso in pagine
determina una dimensione massima di 4Gb, infatti:
BASE ADDRESS (32 BIT) |
LIMIT (20 BIT) |
ATTRIBUTE 12 BIT) |
Descrittore di segmento
Sono previsti due tipi di Tabelle di Descrittori :
Global Descriptor Table
(GDT), contiene generalmente i descrittori per i segmenti codice/dati di
sistema
- Local Descriptor Table
(LDT),contiene i descrittori
dei programmi utente
La GDT è unica nel sistema. Essa non è allocata in un “segmento” nel senso
che per essa non esiste alcun descrittore di segmento. Il suo indirizzo base e
la sua dimensione sono contenuti in un registro speciale del processore, il
GDTR (Global Descriptor Table Register). GDTR è un registro di 48 bit e
contiene l’indirizzo base (32 bit) e la dimensione (16 bit) della GDT
Viceversa è possibile avere più LDT ognuna
delle quali allocata in un segmento. I descrittori di segmento delle LDT sono
contenuti nella GDT.
L'accesso ad un segmento avviene come nel modo reale tramite un registro segmento
Vediamo il meccanismo d'accesso. Il selettore è composto da tre campi
Selettore di segmento (CS,DS,SS etc..)
- INDICE, 13 bit, punta a
un'entry della Tabella dei Descrittori
- TI (Table Indicator), 1
bit, indica il tipo di tabella. TI=1 è una LDT, TI=0 è la GDT
- RPL (Requestor Privilege Level), 2 bit di cui
ci occuperemo dopo
Un indirizzo virtuale è un numero di 48 bit composto
della forma
selettore:offset
con selettore di 16 bit e offset di 32 bit, mentre un indirizzo fisico invece è un unico numero a 32 bit.
In figura è
schematizzato il processo di conversione
La conversione da virtuale e fisico viene effettuata in fase di esecuzione e non quando il programma viene
caricato in memoria.
Esempio:
Selettore di segmento
Il descrittore di segmento potrebbe essere:
BA=0004 0000 |
LIMIT=3FF |
XXXXXXXXXXXX |
Se l'indirizzo virtuale della prima istruzione del programma è 0000 001D,
l'indirizzo fisico risulterebbe 0004 0000 + 0000 001D = 0004 001D
La virtualizzazione della memoria si realizza nel momento in cui un SD fa
riferimento ad un segmento non esistente in memoria.
In altre parole, un segmento, benché il suo descrittore sia allocato in una
DT, può anche non essere presente in memoria. La presenza o meno del
segmento viene segnalata dal bit P degli attributi di segmento.
Gli attributi di segmento
Gli attributi del segmento sono specificati da una serie di campi, i più importanti
dei quali sono
-
G: Bit di granulosità, 1 bit
-
0 : dimensione (LIMIT) del segmento in byte
-
1 : dimensione in unità di 4KB (pagine)
-
S: Descriptor Type, 1 bit.
-
0 : il segmento è di sistema (per es contiene una LDT),
-
1 : il segmento è di un’applicazione
-
TYPE, 4 bit
-
se il descrittore non è di sistema, tre di questi bit specificano se il segmento è dati o
codice e gli attributi di
lettura/scrittura/esecuzione
-
Il quarto, chiamato bit A, specifica se il descrittore è
stato caricato precedentemente nel
selettore
-
DPL (Descriptor Privilege
Level), 4 bit
-
Vedi I meccanismi di protezione
-
P : bit di presenza
-
0: segmento non presente in memoria
-
1: segmento presente in memoria