IL MODELLO PAGINATO




Nel modello paginato  la memoria viene vista come una successione di blocchi di 4K (o 8K), chiamati pagine.

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.