Ogni pagina è individuata da un numero intero, chiamato numero di pagina (page number). Tenuto conto che l’intero spazio d’indirizzamento del processore è 4G,dividendo per 4K, otteniamo che il massimo numero di pagine indirizzabili risulta:
I numeri di pagina quindi sono compresi fra 0 e FFFFF
L’indirizzo base della pagina (BA), cioè l’indirizzo della prima locazione, si ricava moltiplicando il numero di pagina per 4096 (4K):
BA = n x 4096
Quindi il numero di pagina occupa i 2o bit più significativi dell'indirizzo completo di 32 bit. Per es. se la memoria fisica disponibile è 128M il numero di pagine fisiche disponibili è 32K, cioè 32768.
numero di pagina |
indirizzo base |
|
decimale |
esadecimale |
|
0 | 0 | 00000 000 |
1 | 4096 | 00001 000 |
250 | 1.024.000 | 000FA 000 |
4500 | 18432000 | 01194 000 |
32767 | 134213632 | 7FFF0 000 |
Una locazione di memoria è individuata da un indirizzo logico composto dal numero di pagina e dall'offset di 12 bit all'interno della pagina.
Per ottenere l’indirizzo fisico si deve effettuare una operazione di conversione, analoga a quella vista per i segmenti:
indirizzo fisico = numero_di_paginax4096+offset
Quindi l'offset all'interno della pagina occupa i12 bit più significativi dell'indirizzo completo di 32 bit.
Per es la locazione di offset 20 nella pagina 250 avrà come indirizzo fisico, espresso in hex
indirizzo fisico = 250* 4096+20= 000FA000+14 = 000FA 014
Il sistema tiene traccia delle pagine occupate e di quelle libere tramite una tabella chiamata Tabella della memoria (Memory Table), in cui viene riportato il numero di pagina e lo stato di occupazione.
Quando un programma viene caricato in memoria il SO effettua le seguenti operazioni:
Facciamo un esempio limitandoci al caso in cui ci siano sufficienti pagine libere.
Supponiamo che il programma occupi 10K di memoria. Al solito il programma su disco si presenta come un testo su due colonne: nella prima troviamo dei numeri progressivi di 32 bit, che per semplicità facciamo partire da 00000000, nella seconda le istruzioni assembler. I numeri progressivi non rappresentano gli indirizzi delle locazioni in cui il programma verrà caricato in memoria ma una specie di contatore di istruzioni e vengono chiamati indirizzi virtuali.
Dividendo 10K per 4096 otteniamo 2,5. Il programma quindi occupa tre pagine con numeri 0,1,2.
Queste pagine si chiamano, come i corrispondenti indirizzi, pagine virtuali, in quanto non rappresentano le pagine fisiche in cui il programma verrà caricato effettivamente
Per caricare il programma bisogna reperire 3 pagine libere in memoria.
Ipotizziamo che il SO, consultando la Memory Table, trovi disponibili le pagine 300, 500, 950.
Il programma può perciò essere caricato intieramente in memoria, con la pagina 0 nella 300, la 1 nella 500 e la 2 nella 950.
La situazione è riportata nella tabella
pagine virtuali | pagine fisiche |
0 | 300 |
1 | 500 |
2 | 950 |
Notiamo che il programma è stato caricato in memoria non su pagine contigue ma su pagine "a saltare".
Per eseguire il programma, il registro IP deve essere caricato con l'indirizzo virtuale della prima istruzione, per es. IP=00001064h. (4196)
Per eseguire l'istruzione, l'indirizzo virtuale deve essere convertito in indirizzo fisico. L'indirizzo virtuale 00001064 si trova nella pagina virtuale 1 all'offset 100 e la pagina 1 è allocata nella pagina fisica 500.
L'indirizzo fisico sarà allora:
indirizzo fisico = 500x4096+100 = 2048100
in esadecimale: 001F4 000 +064 = 001F4064
le successive istruzioni vengono eseguite con lo stesso procedimento.
La conversione da indirizzi virtuali a indirizzi fisici viene effettuata a tempo di esecuzione (run-time) e non a tempo di compilazione.