La maggior parte dei sistemi moderni divide la memoria in pagine che hanno una dimensione di 4-64 KB, spesso con la possibilità di usare le cosiddette pagine enormi di 2 MB o 1 GB (spesso sono possibili entrambe le varianti). Le traduzioni delle pagine sono memorizzate nella cache in un translation lookaside buffer (TLB). Alcuni sistemi, principalmente i vecchi design RISC, inseriscono un trap nel sistema operativo quando una traduzione di pagina non viene trovata nel TLB. La maggior parte dei sistemi usa un tree walker basato sull’hardware. La maggior parte dei sistemi permette alla MMU di essere disabilitata, ma alcuni disabilitano la MMU quando si fa il trapping nel codice OS.

VAXEdit

Le pagine VAX sono 512 byte, che è molto piccolo. Un sistema operativo può trattare più pagine come se fossero una singola pagina più grande. Per esempio, Linux su VAX raggruppa otto pagine. Così, il sistema è visto come se avesse 4 KB di pagine. Il VAX divide la memoria in quattro regioni a scopo fisso, ciascuna delle quali ha una dimensione di 1 GB. Esse sono:

Spazio P0 Usato per la memoria generale per processo come gli heap. Spazio P1 (o spazio di controllo) che è anche per processo ed è tipicamente usato per supervisore, esecutivo, kernel, stack utente e altre strutture di controllo per processo gestite dal sistema operativo. Spazio S0 (o spazio di sistema) che è globale per tutti i processi e memorizza il codice e i dati del sistema operativo, paginati o meno, comprese le pagetables. Spazio S1 che è inutilizzato e “Riservato al digitale”.

Le tabelle di pagina sono grandi array lineari. Normalmente, questo sarebbe molto dispendioso quando gli indirizzi sono usati alle due estremità dell’intervallo possibile, ma la tabella delle pagine per le applicazioni è essa stessa memorizzata nella memoria paginata del kernel. Così, c’è effettivamente un albero a due livelli, permettendo alle applicazioni di avere un layout di memoria rado senza sprecare molto spazio in voci inutilizzate della tabella delle pagine. La MMU del VAX è notevole per la mancanza di un bit di accesso. I sistemi operativi che implementano la paginazione devono trovare un modo per emulare il bit di accesso se vogliono operare in modo efficiente. Tipicamente, il sistema operativo dismappa periodicamente le pagine in modo che gli errori di pagina non presente possano essere usati per permettere al sistema operativo di impostare un bit di accesso.

ARMEdit

I processori applicativi basati sull’architettura ARM implementano una MMU definita dall’architettura del sistema di memoria virtuale ARM. L’architettura attuale definisce PTE per descrivere pagine da 4 KB e 64 KB, sezioni da 1 MB e super-sezioni da 16 MB; le versioni precedenti definivano anche una pagina minuscola da 1 KB. ARM usa una tabella di pagina a due livelli se usa pagine da 4 KB e 64 KB, o solo una tabella di pagina a un livello per sezioni da 1 MB e sezioni da 16 MB.

Gli aggiornamenti TLB sono eseguiti automaticamente dall’hardware di camminata della tabella di pagina. I PTE includono il permesso di accesso in lettura/scrittura basato sul privilegio, informazioni sulla cacheability, un bit NX e un bit non sicuro.

IBM System/360 Model 67, IBM System/370, e successoriModifica

L’IBM System/360 Model 67, che fu introdotto nell’agosto 1965, includeva una MMU chiamata dynamic address translation (DAT) box. Ha l’insolita caratteristica di memorizzare i bit accessibili e sporchi al di fuori della tabella delle pagine (insieme alla chiave di protezione a quattro bit per tutti i processori S/360). Si riferiscono alla memoria fisica piuttosto che alla memoria virtuale, e vi si accede con istruzioni speciali. Questo riduce l’overhead per il sistema operativo, che altrimenti avrebbe bisogno di propagare i bit accessi e sporchi dalle tabelle di pagina a una struttura dati più orientata fisicamente. Questo rende più facile la virtualizzazione a livello di OS, più tardi chiamata paravirtualizzazione.

A partire dall’agosto 1972, l’IBM System/370 ha una MMU simile, anche se inizialmente supportava solo uno spazio di indirizzi virtuali a 24 bit piuttosto che quello a 32 bit del System/360 Model 67. Inoltre memorizza i bit accessi e sporchi al di fuori della tabella delle pagine. All’inizio del 1983, l’architettura System/370-XA espanse lo spazio di indirizzo virtuale a 31 bit, e nel 2000, fu introdotta la z/Architecture a 64 bit, con lo spazio di indirizzo espanso a 64 bit; questi continuano a memorizzare i bit accessi e sporchi al di fuori della tabella delle pagine.

DEC AlphaEdit

Il processore DEC Alpha divide la memoria in pagine da 8 KB. Dopo un TLB miss, il codice macchina del firmware di basso livello (qui chiamato PALcode) percorre una tabella delle pagine strutturata ad albero su tre livelli. Gli indirizzi sono suddivisi come segue: 21 bit inutilizzati, 10 bit per indicizzare il livello radice dell’albero, 10 bit per indicizzare il livello medio dell’albero, 10 bit per indicizzare il livello foglia dell’albero, e 13 bit che passano all’indirizzo fisico senza modifiche. Sono supportati tutti i bit di autorizzazione di lettura/scrittura/esecuzione.

MIPSEdit

L’architettura MIPS supporta da una a 64 voci nel TLB. Il numero di voci TLB è configurabile alla configurazione della CPU prima della sintesi. Le voci TLB sono doppie. Ogni voce TLB mappa un numero di pagina virtuale (VPN2) a uno dei due numeri di frame di pagina (PFN0 o PFN1), a seconda del bit meno significativo dell’indirizzo virtuale che non fa parte della maschera di pagina. Questo bit e i bit della maschera di pagina non sono memorizzati nella VPN2. Ogni voce TLB ha la sua dimensione di pagina, che può essere qualsiasi valore da 1 KB a 256 MB in multipli di quattro. Ogni PFN in una voce TLB ha un attributo di caching, un bit di stato sporco e uno valido. Una VPN2 ha un bit di stato globale e un ID assegnato dal sistema operativo che partecipa alla corrispondenza della voce TLB dell’indirizzo virtuale, se il bit di stato globale è impostato a zero. Un PFN memorizza l’indirizzo fisico senza i bit di maschera di pagina.

Un’eccezione di riempimento TLB viene generata quando non ci sono voci nel TLB che corrispondono all’indirizzo virtuale mappato. Un’eccezione TLB non valida viene generata quando c’è una corrispondenza ma la voce è contrassegnata come non valida. Un’eccezione TLB modificata viene generata quando un’istruzione store fa riferimento a un indirizzo mappato e lo stato dirty della voce corrispondente non è impostato. Se un’eccezione TLB si verifica durante l’elaborazione di un’eccezione TLB, un’eccezione TLB a doppio errore, viene inviata al proprio gestore di eccezioni.

MIPS32 e MIPS32r2 supportano 32 bit di spazio di indirizzo virtuale e fino a 36 bit di spazio di indirizzo fisico. MIPS64 supporta fino a 64 bit di spazio di indirizzo virtuale e fino a 59 bit di spazio di indirizzo fisico.

Sun 1Edit

L’originale Sun 1 è un computer a scheda singola costruito intorno al microprocessore Motorola 68000 e introdotto nel 1982. Include l’originale unità di gestione della memoria Sun 1 che fornisce la traduzione degli indirizzi, la protezione della memoria, la condivisione della memoria e l’allocazione della memoria per processi multipli in esecuzione sulla CPU. Tutti gli accessi della CPU alla RAM privata on-board, alla memoria Multibus esterna, all’I/O on-board e all’I/O Multibus passano attraverso la MMU, dove la traduzione degli indirizzi e la protezione sono fatte in modo uniforme. La MMU è implementata in hardware sulla scheda della CPU.

La MMU consiste in un registro di contesto, una mappa di segmento e una mappa di pagina. Gli indirizzi virtuali dalla CPU sono tradotti in indirizzi intermedi dalla mappa di segmento, che a loro volta sono tradotti in indirizzi fisici dalla mappa di pagina. La dimensione della pagina è di 2 KB e la dimensione del segmento è di 32 KB che dà 16 pagine per segmento. Fino a 16 contesti possono essere mappati simultaneamente. Il massimo spazio di indirizzo logico per un contesto è di 1024 pagine o 2 MB. Il massimo indirizzo fisico che può essere mappato simultaneamente è anche 2 MB.

Il registro del contesto è importante in un sistema operativo multitasking perché permette alla CPU di passare da un processo all’altro senza ricaricare tutte le informazioni dello stato di traduzione. Il registro di contesto a 4 bit può passare tra 16 sezioni della mappa di segmento sotto il controllo del supervisore, il che permette a 16 contesti di essere mappati simultaneamente. Ogni contesto ha il proprio spazio di indirizzo virtuale. La condivisione dello spazio di indirizzo virtuale e le comunicazioni tra contesti possono essere fornite scrivendo gli stessi valori nelle mappe di segmento o di pagina di contesti diversi. Contesti addizionali possono essere gestiti trattando la mappa di segmento come una cache di contesto e sostituendo i contesti obsoleti sulla base dell’uso più recente.

Il registro di contesto non fa distinzione tra stati utente e supervisore. Gli interrupt e i trap non cambiano contesto, il che richiede che tutti i vettori di interrupt validi siano sempre mappati nella pagina 0 del contesto, così come lo stack del supervisore valido.

PowerPCEdit

In PowerPC G1, G2, G3, e G4 le pagine sono normalmente 4 KB. Dopo un TLB mancato, la MMU PowerPC standard inizia due ricerche simultanee. Una ricerca cerca di far corrispondere l’indirizzo con uno dei quattro o otto registri di traduzione degli indirizzi dei blocchi di dati (DBAT), o quattro o otto registri di traduzione degli indirizzi dei blocchi di istruzioni (IBAT), a seconda dei casi. I registri BAT possono mappare blocchi lineari di memoria grandi fino a 256 MB, e sono normalmente usati da un sistema operativo per mappare grandi porzioni dello spazio degli indirizzi per l’uso del kernel del sistema operativo. Se la ricerca sul BAT ha successo, l’altra ricerca viene fermata e ignorata.

L’altra ricerca, non direttamente supportata da tutti i processori di questa famiglia, è tramite una cosiddetta “tabella di pagina invertita”, che agisce come un’estensione off-chip del TLB. Prima, i primi quattro bit dell’indirizzo sono usati per selezionare uno dei 16 registri di segmento. Poi 24 bit dal registro di segmento sostituiscono quei quattro bit, producendo un indirizzo a 52 bit. L’uso dei registri di segmento permette a processi multipli di condividere la stessa tabella hash.

L’indirizzo a 52 bit è cancellato, poi usato come indice nella tabella off-chip. Lì, un gruppo di voci della tabella a otto pagine viene scansionato per trovarne una che corrisponde. Se nessuna corrisponde a causa di eccessive collisioni hash, il processore riprova con una funzione hash leggermente diversa. Se anche questo fallisce, la CPU mette in trappola il sistema operativo (con la MMU disabilitata) in modo che il problema possa essere risolto. Il sistema operativo deve scartare una voce dalla tabella hash per fare spazio ad una nuova voce. Il sistema operativo può generare la nuova voce da una tabella delle pagine ad albero più normale o da strutture dati per mappatura, che probabilmente sono più lente e più efficienti in termini di spazio. Il supporto per il controllo no-execute è nei registri di segmento, portando ad una granularità di 256 MB.

Un problema importante con questo design è la scarsa localizzazione della cache causata dalla funzione hash. I design basati su alberi evitano questo problema mettendo le voci della tabella di pagina per le pagine adiacenti in posizioni adiacenti. Un sistema operativo che gira su PowerPC può minimizzare la dimensione della tabella hash per ridurre questo problema.

È anche un po’ lento nel rimuovere le voci della tabella delle pagine di un processo. Il sistema operativo può evitare di riutilizzare i valori dei segmenti per ritardare questo compito, o può scegliere di subire lo spreco di memoria associato alle tabelle hash per processo. I chip G1 non cercano le voci della tabella delle pagine, ma generano l’hash, con l’aspettativa che un SO cerchi la tabella hash standard via software. Il sistema operativo può scrivere sulla TLB. I chip G2, G3 e i primi G4 usano l’hardware per cercare la tabella hash. Gli ultimi chip permettono al sistema operativo di scegliere uno dei due metodi. Sui chip che lo rendono opzionale o che non lo supportano affatto, il sistema operativo può scegliere di utilizzare esclusivamente una tabella di pagina basata su albero.

IA-32 / x86Edit

L’architettura x86 si è evoluta per un tempo molto lungo mantenendo la piena compatibilità software, anche per il codice del sistema operativo. Così, la MMU è estremamente complessa, con molte diverse modalità di funzionamento possibili. Il normale funzionamento della CPU tradizionale 80386 e dei suoi successori (IA-32) è descritto qui.

La CPU divide principalmente la memoria in pagine da 4 KB. I registri di segmento, fondamentali per i vecchi progetti 8088 e 80286 MMU, non sono usati nei moderni sistemi operativi, con una grande eccezione: l’accesso ai dati specifici del thread per le applicazioni o ai dati specifici della CPU per i kernel del sistema operativo, che è fatto con l’uso esplicito dei registri di segmento FS e GS. Tutti gli accessi alla memoria coinvolgono un registro di segmento, scelto in base al codice in esecuzione. Il registro di segmento agisce come un indice in una tabella, che fornisce un offset da aggiungere all’indirizzo virtuale. Tranne quando si usa FS o GS, il sistema operativo assicura che l’offset sarà zero.

Dopo l’aggiunta dell’offset, l’indirizzo è mascherato per non essere più grande di 32 bit. Il risultato può essere cercato tramite una tabella di pagina strutturata ad albero, con i bit dell’indirizzo divisi come segue: 10 bit per il ramo dell’albero, 10 bit per le foglie del ramo, e i 12 bit più bassi vengono direttamente copiati nel risultato. Alcuni sistemi operativi, come OpenBSD con la sua caratteristica W^X, e Linux con le patch Exec Shield o PaX, possono anche limitare la lunghezza del segmento di codice, come specificato dal registro CS, per impedire l’esecuzione di codice in regioni modificabili dello spazio degli indirizzi.

Revisioni minori della MMU introdotte con il Pentium hanno permesso pagine molto grandi da 4 MB saltando il livello inferiore dell’albero (questo lascia 10 bit per indicizzare il primo livello della gerarchia di pagina con i restanti 10+12 bit che vengono direttamente copiati nel risultato). Revisioni minori della MMU introdotte con il Pentium Pro hanno introdotto la caratteristica di estensione dell’indirizzo fisico (PAE), permettendo indirizzi fisici a 36 bit con 2+9+9 bit per tabelle di pagina a tre livelli e 12 bit più bassi che vengono direttamente copiati nel risultato. Pagine grandi (2 MB) sono anche disponibili saltando il livello inferiore dell’albero (con il risultato di 2+9 bit per la gerarchia della tabella a due livelli e i restanti 9+12 bit più bassi copiati direttamente). Inoltre, la tabella degli attributi di pagina permetteva di specificare la cacheability cercando alcuni bit alti in una piccola tabella on-CPU.

Il supporto no-execute era originariamente fornito solo su una base per segmento, rendendolo molto scomodo da usare. I chip x86 più recenti forniscono un bit di non esecuzione per pagina nella modalità PAE. I meccanismi W^X, Exec Shield, e PaX descritti sopra emulano il supporto per-page non-execute sulle macchine x86 che mancano del bit NX impostando la lunghezza del segmento di codice, con una perdita di prestazioni e una riduzione dello spazio di indirizzo disponibile.

x86-64Edit

Heterogeneous System Architecture (HSA) crea uno spazio di indirizzi virtuale unificato per CPU, GPU e DSP, obsoletizzando i trucchi di mappatura e la copia dei dati.

x86-64 è un’estensione a 64 bit di x86 che rimuove quasi interamente la segmentazione in favore del modello di memoria piatta usato da quasi tutti i sistemi operativi per i processori 386 o più recenti. In modalità lunga, tutti gli offset di segmento sono ignorati, eccetto i segmenti FS e GS. Quando viene usato con pagine da 4 KB, l’albero della tabella delle pagine ha quattro livelli invece di tre.

Gli indirizzi virtuali sono divisi come segue: 16 bit inutilizzati, nove bit ciascuno per i quattro livelli dell’albero (per un totale di 36 bit), e i 12 bit più bassi direttamente copiati nel risultato. Con pagine da 2 MB, ci sono solo tre livelli di tabella di pagina, per un totale di 27 bit usati nella paginazione e 21 bit di offset. Alcune CPU più recenti supportano anche una pagina da 1 GB con due livelli di paginazione e 30 bit di offset.

CPUID può essere usato per determinare se sono supportate pagine da 1 GB. In tutti e tre i casi, i 16 bit più alti devono essere uguali al 48° bit, o in altre parole, i 48 bit bassi sono estesi di segno ai bit più alti. Questo è fatto per permettere una futura espansione della gamma indirizzabile, senza compromettere la compatibilità all’indietro. In tutti i livelli della tabella delle pagine, la voce della tabella delle pagine include un bit di non esecuzione.

Unisys MCP Systems (Burroughs B5000)Edit

Questa sezione può essere confusa o poco chiara ai lettori. Per favore aiuta a chiarire la sezione. Potrebbe esserci una discussione in merito nella pagina di discussione. (Settembre 2020) (Impara come e quando rimuovere questo messaggio template)

Il Burroughs B5000 del 1961 è stato il primo sistema commerciale a supportare la memoria virtuale (dopo l’Atlas), anche se non ha una MMU Fornisce le due funzioni di una MMU – indirizzi di memoria virtuale e protezione della memoria – con un approccio architettonico diverso.

In primo luogo, nella mappatura degli indirizzi di memoria virtuale, invece di aver bisogno di una MMU, i sistemi MCP sono basati su descrittori. Ad ogni blocco di memoria allocato viene dato un descrittore principale con le proprietà del blocco (cioè, la dimensione, l’indirizzo e se è presente in memoria). Quando viene fatta una richiesta per accedere al blocco per leggere o scrivere, l’hardware controlla la sua presenza tramite il bit di presenza (pbit) nel descrittore.

Un pbit di 1 indica la presenza del blocco. In questo caso, si può accedere al blocco tramite l’indirizzo fisico nel descrittore. Se il pbit è zero, viene generato un interrupt per MCP (sistema operativo) per rendere presente il blocco. Se il campo dell’indirizzo è zero, questo è il primo accesso a questo blocco, e viene allocato (un init pbit). Se il campo dell’indirizzo è diverso da zero, si tratta di un indirizzo su disco del blocco, che è stato precedentemente srotolato, quindi il blocco viene recuperato dal disco e il pbit viene impostato a uno e l’indirizzo della memoria fisica aggiornato per puntare al blocco in memoria (un altro pbit). Questo rende i descrittori equivalenti a una voce della tabella delle pagine in un sistema MMU. Le prestazioni del sistema possono essere monitorate attraverso il numero di pbit. I pbit init indicano le allocazioni iniziali, ma un alto livello di altri pbit indica che il sistema potrebbe essere in thrashing.

Tutta l’allocazione della memoria è quindi completamente automatica (una delle caratteristiche dei sistemi moderni) e non c’è altro modo di allocare blocchi che questo meccanismo. Non ci sono chiamate come malloc o dealloc, poiché i blocchi di memoria vengono anche scartati automaticamente. Lo schema è anche pigro, poiché un blocco non viene allocato fino a quando non viene effettivamente referenziato. Quando la memoria è quasi piena, MCP esamina l’insieme di lavoro, provando la compattazione (dato che il sistema è segmentato, non impaginato), deallocando i segmenti di sola lettura (come i segmenti di codice che possono essere ripristinati dalla loro copia originale) e, come ultima risorsa, rotolando i segmenti di dati sporchi sul disco.

Un altro modo in cui il B5000 fornisce una funzione di una MMU è nella protezione. Poiché tutti gli accessi avvengono attraverso il descrittore, l’hardware può controllare che tutti gli accessi siano entro i limiti e, nel caso di una scrittura, che il processo abbia il permesso di scrittura. Il sistema MCP è intrinsecamente sicuro e quindi non ha bisogno di una MMU per fornire questo livello di protezione della memoria. I descrittori sono di sola lettura per i processi utente e possono essere aggiornati solo dal sistema (hardware o MCP). (Le parole il cui tag è un numero dispari sono di sola lettura; i descrittori hanno un tag di 5 e le parole di codice hanno un tag di 3.)

I blocchi possono essere condivisi tra processi tramite descrittori di copia nello stack di processo. Così, alcuni processi possono avere il permesso di scrittura, mentre altri no. Un segmento di codice è di sola lettura, quindi rientrante e condiviso tra processi. I descrittori di copia contengono un campo di indirizzo di 20 bit che dà l’indice del descrittore principale nell’array dei descrittori principali. Questo implementa anche un meccanismo IPC molto efficiente e sicuro. I blocchi possono essere facilmente riposizionati, poiché solo il descrittore master deve essere aggiornato quando lo stato di un blocco cambia.

L’unico altro aspetto è la performance – i sistemi basati su MMU o non basati su MMU forniscono una performance migliore? I sistemi MCP possono essere implementati sopra l’hardware standard che ha una MMU (per esempio, un PC standard). Anche se l’implementazione del sistema usa la MMU in qualche modo, questo non sarà affatto visibile a livello di MCP.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.