Memoria virtuale
La memoria virtuale genera, per ogni processo, uno spazio di indirizzamento virtuale con quantità maggiore di quella disponibile attraverso la swap, cioè parte del disco rigido che fa da memoria.
Attraverso l'uso di questa memoria, ogni processo:
- può usare più memoria di quella disponibile
- ha lo spazio di indirizzamento isolato e protetto dagli altri processi
- può essere caricato ovunque in memoria, anche in regioni non continue
La memoria è suddivisa in pagine di dimensione prefissata (come i blocchi della cache) indirizzate dal virtual page number, mentre il byte specifico è indirizzato dal page offset (i.e. primi bit, con page size). Anche la memoria fisica, avendo la stessa page size viene indirizzata con physical page number e page offset uguale a quello della memoria virtuale.
Le corrispondenze tra gli indirizzi virtuali e fisici vengono salvate all'interno della page table associata al processo, che si trova nella RAM all'indirizzo salvato dal page table register (diverso per ogni processo).
Come per la cache, anche le pagine hanno dei bit di stato.
Page fault
La CPU lavora solamente con indirizzi virtuali, mentre altro hardware si occupa della traduzione dello spazio virtuale indirizzato in indirizzo fisico.
Se la locazione richiesta non si trova in memoria, la CPU viene notificata con un page fault e si occuperà del processo di swapping, cioè di copiare i dati dalla swap alla RAM, causando un miss penalty molto elevato.
Translation Lookaside Buffer
Trovandosi in RAM l'accesso alla page table è molto lento, di conseguenza il TLB è una cache completamente dedicata al caching della page table, in particolare delle righe vicine a quelle lette più di recente.
Nel caso avvenga un TLB miss, la pagina verrà caricata se presente nella page table, altrimenti verrà generato un page fault che forzerà lo swapping.
Addressing della cache
Esistono tre modi in cui la cache può lavorare:
- Physically addressed cache: per accedere alla cache l'indirizzo virtuale del dato dovrà prima essere tradotto in fisico con il TLB (e page table nel caso di TLB miss)
- Virtually addressed cache: accede con indirizzi virtuali (non usa il TLB), ma può causare aliasing, e quindi due processi accedono allo stesso blocco se usano lo stesso indirizzo virtuale (capita spesso)
- Virtually indexed but physically tagged: traduce comunque l'indirizzo con il TLB, ma calcola l'index dall'indirizzo virtuale e il tag da quello fisico
Sistema operativo
Nel caso di TLB miss o page fault, la CPU passa il controllo alla routine di gestione del sistema operativo.
Facendo ciò passa anche da user mode a supervisor mode (o kernel mode), che permette al sistema di:
- modificare il page table register
- modificare le entry TLB
Non potendo cambiare l'execution mode da user mode a supervisor mode, un programma dovrà affidarsi a delle system call.
Un esempio su ARM è svc
, che lancia un'eccezione elevando l'esecuzione in supervisor mode e quindi permettendo al sistema operativo di eseguire il servizio richiesto.
Durante un page fault, mentre i dati vengono copiati in RAM, il sistema operativo effettua un context switch cioè salva i registri del processo corrente e riprende l'esecuzione di un altro. Inoltre, per evitare che il nuovo processo acceda a regioni non permesse, la TLB viene svuotata a meno che ad ogni pagina non sia associato l'ASID (Address Space ID, ovvero il PID), causando miss per processi diversi.
Page table multilivello
Generare una page table per ogni processo riempirebbe la RAM, considerata la quantità di indirizzi virtuali. Per questo, ARM utilizza più livelli di page table suddividendo il virtual page number in bit.
Per esempio, con i primi bit si trova dalla prima page table l'indirizzo della seconda, con i successivi si trova nella seconda l'indirizzo della terza page table, e così via fino all'ultima che dà l'indirizzo fisico.
In questo modo, solamente le page table interessate al processo verranno caricate in memoria (e.g. la maggior parte degli indirizzi hanno gli stessi bit più significativi).