Majoritatea sistemelor moderne împart memoria în pagini care au o dimensiune de 4-64 KB, adesea cu capacitatea de a utiliza așa-numitele pagini uriașe de 2 MB sau 1 GB (adesea sunt posibile ambele variante). Traducerile paginilor sunt stocate în memoria cache într-un buffer de căutare a traducerilor (TLB – translation lookaside buffer). Unele sisteme, în special modelele RISC mai vechi, introduc o capcană în sistemul de operare atunci când o traducere de pagină nu este găsită în TLB. Majoritatea sistemelor utilizează un tree walker bazat pe hardware. Cele mai multe sisteme permit dezactivarea MMU, dar unele dezactivează MMU atunci când intră în codul sistemului de operare.
VAXEdit
Paginile VAX sunt de 512 octeți, ceea ce este foarte mic. Un sistem de operare poate trata mai multe pagini ca și cum ar fi o singură pagină mai mare. De exemplu, Linux pe VAX grupează opt pagini împreună. Astfel, sistemul este văzut ca având pagini de 4 KB. VAX împarte memoria în patru regiuni cu destinație fixă, fiecare cu o dimensiune de 1 GB. Acestea sunt:
Spațiul P0 Utilizat pentru memoria de uz general pentru fiecare proces, cum ar fi heaps. Spațiul P1 (sau spațiul de control) care este, de asemenea, per-proces și este utilizat de obicei pentru stive de supervizor, executiv, kernel, utilizator și alte structuri de control per-proces gestionate de sistemul de operare. Spațiul S0 (sau spațiul de sistem), care este global pentru toate procesele și stochează codul și datele sistemului de operare, indiferent dacă sunt paginate sau nu, inclusiv tabelele de pagini. Spațiul S1 care este neutilizat și „rezervat pentru Digital”.
Tabelele de pagini sunt matrici liniare mari. În mod normal, acest lucru ar fi foarte risipitor atunci când adresele sunt utilizate la ambele capete ale intervalului posibil, dar tabelul de pagini pentru aplicații este la rândul său stocat în memoria paginată a nucleului. Astfel, există efectiv un arbore cu două niveluri, permițând aplicațiilor să aibă o dispunere de memorie rarefiată fără a irosi mult spațiu pentru intrările neutilizate ale tabelei de pagini. MMU VAX se remarcă prin lipsa unui bit accesat. Sistemele de operare care implementează paginarea trebuie să găsească o modalitate de a emula bitul accesat dacă vor să funcționeze eficient. De obicei, sistemul de operare va desface periodic paginile, astfel încât defectele de tip „page-not-present” pot fi folosite pentru a permite sistemului de operare să seteze un bit accesat.
ARMEdit
Procesoarele de aplicații bazate pe arhitectura ARM implementează o MMU definită de arhitectura sistemului de memorie virtuală ARM. Arhitectura actuală definește PTE-uri pentru descrierea paginilor de 4 KB și 64 KB, a secțiunilor de 1 MB și a super-secțiunilor de 16 MB; versiunile anterioare au definit, de asemenea, o pagină minusculă de 1 KB. ARM utilizează o tabelă de pagini cu două niveluri dacă utilizează pagini de 4 KB și 64 KB, sau doar o tabelă de pagini cu un singur nivel pentru secțiuni de 1 MB și secțiuni de 16 MB.
Actualizările TLB sunt efectuate automat de către hardware-ul de plimbare a tabelei de pagini. PTE-urile includ permisiunea de acces la citire/scriere în funcție de privilegii, informații despre cacheabilitate, un bit NX și un bit nesecurizat.
IBM System/360 Model 67, IBM System/370 și succesoareleEdit
Institutul IBM System/360 Model 67, care a fost introdus în august 1965, a inclus o MMU numită cutie de traducere dinamică a adreselor (DAT). Aceasta are caracteristica neobișnuită de a stoca biții accesați și murdari în afara tabelului de pagini (împreună cu cheia de protecție pe patru biți pentru toate procesoarele S/360). Acestea se referă mai degrabă la memoria fizică decât la memoria virtuală și sunt accesate prin instrucțiuni cu scop special. Acest lucru reduce cheltuielile pentru sistemul de operare, care altfel ar trebui să propage biții accesați și murdari din tabelele de pagini către o structură de date mai orientată fizic. Acest lucru facilitează virtualizarea la nivel de sistem de operare, numită mai târziu paravirtualizare.
Începând din august 1972, IBM System/370 are o MMU similară, deși inițial a suportat doar un spațiu de adrese virtuale pe 24 de biți, în loc de spațiul de adrese virtuale pe 32 de biți al System/360 Model 67. De asemenea, stochează biții accesați și cei murdari în afara tabelului de pagini. La începutul anului 1983, arhitectura System/370-XA a extins spațiul virtual de adresare la 31 de biți, iar în 2000, a fost introdusă arhitectura z/Arhitectura pe 64 de biți, cu spațiul de adresare extins la 64 de biți; acestea continuă să stocheze biții accesați și murdari în afara tabelului de pagini.
DEC AlphaEdit
Procesorul DEC Alpha împarte memoria în pagini de 8 KB. După o ratare a TLB, codul mașină de nivel scăzut al firmware-ului (numit aici PALcode) parcurge o tabelă de pagini cu structură arborescentă pe trei niveluri. Adresele sunt împărțite după cum urmează: 21 de biți nefolosiți, 10 biți pentru indexarea nivelului rădăcină al arborelui, 10 biți pentru indexarea nivelului mijlociu al arborelui, 10 biți pentru indexarea nivelului frunză al arborelui și 13 biți care trec la adresa fizică fără modificări. Sunt suportați biți de permisiune completă de citire/scriere/executare.
MIPSEdit
Arhitectura MIPS suportă între una și 64 de intrări în TLB. Numărul de intrări TLB este configurabil la configurarea CPU înainte de sinteză. Intrările TLB sunt duble. Fiecare intrare TLB mapează un număr de pagină virtuală (VPN2) la unul dintre cele două numere de cadru de pagină (PFN0 sau PFN1), în funcție de cel mai puțin semnificativ bit al adresei virtuale care nu face parte din masca de pagină. Acest bit și biții de mască de pagină nu sunt stocați în VPN2. Fiecare intrare TLB are propria dimensiune a paginii, care poate fi orice valoare de la 1 KB la 256 MB în multipli de patru. Fiecare PFN dintr-o intrare TLB are un atribut de memorie cache, un bit de stare murdară și un bit de stare validă. Un VPN2 are un bit de stare globală și un ID atribuit de sistemul de operare care participă la potrivirea intrării TLB a adresei virtuale, dacă bitul de stare globală este setat la zero. Un PFN stochează adresa fizică fără biții de mască de pagină.
O excepție de reumplere a TLB este generată atunci când nu există intrări în TLB care să corespundă adresei virtuale mapate. O excepție TLB invalidă este generată atunci când există o potrivire, dar intrarea este marcată ca fiind invalidă. O excepție TLB modificată este generată atunci când o instrucțiune de memorare face referire la o adresă mapată și starea de murdărie a intrării corespunzătoare nu este setată. În cazul în care o excepție TLB apare în timpul procesării unei excepții TLB, o excepție TLB cu dublă eroare, aceasta este trimisă către propriul său gestionar de excepții.
MIPS32 și MIPS32r2 suportă 32 de biți de spațiu de adrese virtuale și până la 36 de biți de spațiu de adrese fizice. MIPS64 suportă până la 64 de biți de spațiu de adrese virtuale și până la 59 de biți de spațiu de adrese fizice.
Sun 1Edit
Originalul Sun 1 este un calculator cu o singură placă construit în jurul microprocesorului Motorola 68000 și introdus în 1982. Acesta include unitatea originală de gestionare a memoriei Sun 1 care asigură traducerea adreselor, protecția memoriei, partajarea memoriei și alocarea memoriei pentru mai multe procese care rulează pe CPU. Toate accesele procesorului la memoria RAM privată de la bord, la memoria externă Multibus, la intrările/ieșirile de la bord și la intrările/ieșirile Multibus trec prin MMU, unde traducerea și protecția adreselor se realizează în mod uniform. MMU este implementată în hardware pe placa CPU.
MMU constă dintr-un registru de context, o hartă de segment și o hartă de pagină. Adresele virtuale de la CPU sunt traduse în adrese intermediare de către harta de segment, care, la rândul lor, sunt traduse în adrese fizice de către harta de pagină. Dimensiunea paginii este de 2 KB, iar dimensiunea segmentului este de 32 KB, ceea ce dă 16 pagini pe segment. Până la 16 contexte pot fi cartografiate concomitent. Spațiul maxim de adrese logice pentru un context este de 1024 de pagini sau 2 MB. Adresa fizică maximă care poate fi cartografiată simultan este, de asemenea, de 2 MB.
Registrul de context este important într-un sistem de operare multitasking deoarece permite procesorului să treacă de la un proces la altul fără a reîncărca toate informațiile privind starea de traducere. Registrul de context pe 4 biți poate comuta între 16 secțiuni ale hărții segmentului sub controlul supervizorului, ceea ce permite maparea simultană a 16 contexte. Fiecare context are propriul său spațiu de adrese virtuale. Partajarea spațiului de adrese virtuale și comunicațiile între contexte pot fi asigurate prin scrierea acelorași valori în hărțile de segmente sau de pagini ale diferitelor contexte. Contexte suplimentare pot fi gestionate prin tratarea hărții de segmente ca o memorie cache de context și înlocuirea contextelor neactualizate pe baza celor mai puțin utilizate.
Registrul de context nu face distincție între stările de utilizator și de supraveghetor. Întreruperile și capcanele nu schimbă contextele, ceea ce necesită ca toți vectorii de întrerupere valabili să fie întotdeauna cartografiați în pagina 0 a contextului, precum și stiva supervizorului valabilă.
PowerPCEdit
În PowerPC G1, G2, G3 și G4 paginile sunt în mod normal de 4 KB. După o ratare a TLB, MMU PowerPC standard începe două căutări simultane. Una dintre căutări încearcă să potrivească adresa cu unul dintre cele patru sau opt registre de translatare a adreselor blocurilor de date (DBAT) sau patru sau opt registre de translatare a adreselor blocurilor de instrucțiuni (IBAT), după caz. Registrele BAT pot cartografia bucăți liniare de memorie de până la 256 MB și, în mod normal, sunt utilizate de un sistem de operare pentru a cartografia porțiuni mari din spațiul de adrese pentru uzul propriu al nucleului sistemului de operare. Dacă căutarea BAT reușește, cealaltă căutare este oprită și ignorată.
Celealaltă căutare, care nu este direct suportată de toate procesoarele din această familie, se face prin intermediul unui așa-numit „tabel de pagini inversate”, care acționează ca o extensie a TLB-ului în afara cipului, cu hașurare. În primul rând, primii patru biți ai adresei sunt utilizați pentru a selecta unul dintre cele 16 registre de segment. Apoi, 24 de biți din registrul de segment înlocuiesc acești patru biți, producând o adresă de 52 de biți. Utilizarea registrelor de segment permite ca mai multe procese să împartă aceeași tabelă hash.
Adresa de 52 de biți este hașurată, apoi utilizată ca index în tabela off-chip. Acolo, un grup de intrări din tabelul de opt pagini este scanat pentru una care se potrivește. Dacă niciuna nu se potrivește din cauza coliziunilor hash excesive, procesorul încearcă din nou cu o funcție hash ușor diferită. Dacă nici aceasta nu reușește, procesorul intră în sistemul de operare (cu MMU dezactivată) pentru ca problema să poată fi rezolvată. Sistemul de operare trebuie să renunțe la o intrare din tabelul hash pentru a face loc unei noi intrări. Sistemul de operare poate genera noua intrare dintr-un tabel de pagini de tip arbore mai normal sau din structurile de date pentru fiecare mapare, care sunt probabil mai lente și mai eficiente din punct de vedere al spațiului. Suportul pentru controlul fără execuție se află în registrele de segment, ceea ce duce la o granularitate de 256 MB.
O problemă majoră a acestui design este localitatea slabă a cache-ului cauzată de funcția hash. Proiectele bazate pe arbore evită acest lucru prin plasarea intrărilor în tabela de pagini pentru pagini adiacente în locații adiacente. Un sistem de operare care rulează pe PowerPC poate minimiza dimensiunea tabelei hash pentru a reduce această problemă.
De asemenea, este oarecum lentă eliminarea intrărilor din tabela de pagini a unui proces. Sistemul de operare poate evita reutilizarea valorilor de segment pentru a întârzia confruntarea cu acest lucru, sau poate alege să sufere risipa de memorie asociată cu tabelele hash per proces. Cipurile G1 nu caută intrările din tabela de pagini, dar generează hash-ul, în așteptarea faptului că un sistem de operare va căuta tabela de hash standard prin intermediul software-ului. Sistemul de operare poate scrie în TLB. Cipurile G2, G3 și primele cipuri G4 utilizează hardware pentru a căuta în tabelul hash. Cele mai recente cipuri permit sistemului de operare să aleagă oricare dintre aceste metode. Pe cipurile care fac această metodă opțională sau nu o suportă deloc, sistemul de operare poate alege să folosească exclusiv o tabelă de pagini bazată pe arbore.
IA-32 / x86Edit
Arhitectura x86 a evoluat de-a lungul unui timp foarte îndelungat, menținând în același timp o compatibilitate software completă, chiar și pentru codul sistemului de operare. Astfel, MMU este extrem de complexă, cu multe moduri de funcționare posibile. Funcționarea normală a procesorului tradițional 80386 și a succesorilor săi (IA-32) este descrisă aici.
Procesorul împarte în primul rând memoria în pagini de 4 KB. Registrele de segment, fundamentale pentru vechile concepte MMU 8088 și 80286, nu sunt utilizate în sistemele de operare moderne, cu o singură excepție majoră: accesul la datele specifice firului de execuție pentru aplicații sau la datele specifice CPU pentru nucleele sistemului de operare, care se face cu utilizarea explicită a registrelor de segment FS și GS. Toate accesările de memorie implică un registru de segment, ales în funcție de codul care se execută. Registrul de segment acționează ca un index într-un tabel, care furnizează un offset care trebuie adăugat la adresa virtuală. Cu excepția cazului în care se utilizează FS sau GS, sistemul de operare se asigură că decalajul va fi zero.
După ce decalajul este adăugat, adresa este mascată pentru a nu fi mai mare de 32 de biți. Rezultatul poate fi căutat prin intermediul unui tabel de pagini cu structură arborescentă, biții adresei fiind împărțiți după cum urmează: 10 biți pentru ramura arborelui, 10 biți pentru frunzele ramurii, iar cei mai mici 12 biți sunt copiați direct în rezultat. Unele sisteme de operare, cum ar fi OpenBSD cu caracteristica W^X și Linux cu patch-urile Exec Shield sau PaX, pot, de asemenea, să limiteze lungimea segmentului de cod, așa cum este specificat de registrul CS, pentru a nu permite executarea de cod în regiuni modificabile ale spațiului de adrese.
Revizuiri minore ale MMU introduse odată cu Pentium au permis pagini foarte mari de 4 MB prin omiterea nivelului inferior al arborelui (acest lucru lasă 10 biți pentru indexarea primului nivel al ierarhiei paginilor, restul de 10+12 biți fiind copiați direct în rezultat). Revizuirile minore ale MMU introduse odată cu Pentium Pro au introdus funcția de extensie a adresei fizice (PAE), permițând adrese fizice pe 36 de biți cu 2+9+9 biți pentru tabele de pagini pe trei niveluri, iar cei mai mici 12 biți fiind copiați direct în rezultat. Paginile mari (2 MB) sunt, de asemenea, disponibile prin omiterea nivelului inferior al arborelui (rezultând 2+9 biți pentru ierarhia tabelelor pe două niveluri și restul de 9+12 biți cei mai de jos copiați direct). În plus, tabelul de atribute al paginii a permis specificarea capacității de memorare în memoria cache prin căutarea câtorva biți de nivel înalt într-un mic tabel on-CPU.
Suportul no-execute a fost inițial furnizat doar pe segment, ceea ce îl făcea foarte incomod de utilizat. Cipurile x86 mai recente oferă un bit no-execute per pagină în modul PAE. Mecanismele W^X, Exec Shield și PaX descrise mai sus emulează suportul de neexecutare per pagină pe mașinile cu procesoare x86 lipsite de bitul NX prin setarea lungimii segmentului de cod, cu o pierdere de performanță și o reducere a spațiului de adrese disponibil.
x86-64Edit
x86-64 este o extensie pe 64 de biți a x86 care elimină aproape în întregime segmentarea în favoarea modelului de memorie plată utilizat de aproape toate sistemele de operare pentru procesoarele 386 sau mai noi. În modul lung, toate decalajele de segment sunt ignorate, cu excepția segmentelor FS și GS. Atunci când se utilizează cu pagini de 4 KB, arborele tabelului de pagini are patru niveluri în loc de trei.
Adresele virtuale sunt împărțite după cum urmează: 16 biți neutilizați, câte nouă biți pentru fiecare dintre cele patru niveluri ale arborelui (pentru un total de 36 de biți), iar cei mai mici 12 biți sunt copiați direct în rezultat. Cu pagini de 2 MB, există doar trei niveluri de tabel de pagini, pentru un total de 27 de biți utilizați în paginare și 21 de biți de offset. Unele unități centrale de procesare mai noi acceptă, de asemenea, o pagină de 1 GB cu două niveluri de paginare și 30 de biți de decalaj.
CPUID poate fi utilizat pentru a determina dacă sunt acceptate paginile de 1 GB. În toate cele trei cazuri, se cere ca cei 16 biți cei mai înalți să fie egali cu al 48-lea bit sau, cu alte cuvinte, cei 48 de biți inferiori sunt cu semnul extins la biții superiori. Acest lucru se face pentru a permite o extindere viitoare a domeniului de adresabilitate, fără a compromite compatibilitatea retroactivă. În toate nivelurile tabelului de pagini, intrarea din tabelul de pagini include un bit de neexecutare.
Unisys MCP Systems (Burroughs B5000)Edit
Burroughs B5000 din 1961 a fost primul sistem comercial care a suportat memoria virtuală (după Atlas), chiar dacă nu are MMU Acesta asigură cele două funcții ale unei MMU – adrese de memorie virtuală și protecția memoriei – cu o abordare arhitecturală diferită.
În primul rând, în ceea ce privește cartografierea adreselor de memorie virtuală, în loc să aibă nevoie de o MMU, sistemele MCP sunt bazate pe descriptori. Fiecărui bloc de memorie alocat i se atribuie un descriptor principal cu proprietățile blocului (de exemplu, dimensiunea, adresa și dacă este prezent în memorie). Atunci când se face o cerere de accesare a blocului pentru citire sau scriere, hardware-ul verifică prezența acestuia prin intermediul bitului de prezență (pbit) din descriptor.
Un pbit de 1 indică prezența blocului. În acest caz, blocul poate fi accesat prin intermediul adresei fizice din descriptor. Dacă pbitul este zero, se generează o întrerupere pentru ca MCP (sistemul de operare) să facă prezența blocului. În cazul în care câmpul de adresă este zero, acesta este primul acces la acest bloc, iar acesta este alocat (un pbit init). În cazul în care câmpul de adresă este diferit de zero, este vorba de o adresă de disc a blocului, care a fost anterior extrasă, astfel încât blocul este preluat de pe disc și pbitul este setat la unu, iar adresa de memorie fizică este actualizată pentru a indica blocul din memorie (un alt pbit). Astfel, descriptorii sunt echivalenți cu o intrare în tabela de pagini într-un sistem MMU. Performanța sistemului poate fi monitorizată prin intermediul numărului de pbits. Init pbits indică alocări inițiale, dar un nivel ridicat de alți pbits indică faptul că sistemul poate fi thrashing.
Toată alocarea de memorie este, prin urmare, complet automată (una dintre caracteristicile sistemelor moderne) și nu există nicio altă modalitate de alocare a blocurilor în afară de acest mecanism. Nu există apeluri de genul malloc sau dealloc, deoarece blocurile de memorie sunt, de asemenea, eliminate automat. Schema este, de asemenea, leneșă, deoarece un bloc nu va fi alocat până când nu va fi efectiv referit. Atunci când memoria este aproape plină, MCP examinează setul de lucru, încercând compactarea (deoarece sistemul este segmentat, nu paginat), dezalocând segmente de numai citire (cum ar fi segmentele de cod care pot fi restaurate din copia lor originală) și, ca ultimă soluție, rulând segmentele de date murdare pe disc.
Un alt mod în care B5000 asigură o funcție de MMU este în protecție. Deoarece toate accesele se fac prin intermediul descriptorului, hardware-ul poate verifica dacă toate accesele se încadrează în limite și, în cazul unei scrieri, dacă procesul are permisiunea de scriere. Sistemul MCP este în mod inerent sigur și, prin urmare, nu are nevoie de o MMU pentru a asigura acest nivel de protecție a memoriei. Descriptorii sunt numai de citire pentru procesele utilizator și pot fi actualizați numai de către sistem (hardware sau MCP). (Cuvintele a căror etichetă este un număr impar sunt de numai citire; descriptorii au o etichetă de 5, iar cuvintele de cod au o etichetă de 3.)
Blocurile pot fi partajate între procese prin intermediul descriptorilor de copiere din stiva de procese. Astfel, unele procese pot avea permisiunea de scriere, în timp ce altele nu o au. Un segment de cod este numai pentru citire, deci reentrant și partajat între procese. Descriptorii de copiere conțin un câmp de adresă pe 20 de biți care indică indexul descriptorului principal în matricea descriptorilor principali. Acest lucru implementează, de asemenea, un mecanism IPC foarte eficient și sigur. Blocurile pot fi relocate cu ușurință, deoarece doar descriptorul master trebuie actualizat atunci când se schimbă starea unui bloc.
Unicul alt aspect este performanța – sistemele bazate pe MMU sau cele care nu se bazează pe MMU oferă performanțe mai bune? Sistemele MCP pot fi implementate pe partea superioară a hardware-ului standard care are o MMU (de exemplu, un PC standard). Chiar dacă implementarea sistemului utilizează MMU într-un fel sau altul, acest lucru nu va fi deloc vizibil la nivelul MCP.
.