De fleste moderne systemer opdeler hukommelsen i sider, der er 4-64 KB store, ofte med mulighed for at bruge såkaldte store sider på 2 MB eller 1 GB (ofte er begge varianter mulige). Sideoversættelser lagres i cache i en translation lookaside buffer (TLB). Nogle systemer, især ældre RISC-designs, sender en fælde til operativsystemet, når en sideoversættelse ikke findes i TLB’en. De fleste systemer anvender en hardware-baseret tree walker. De fleste systemer tillader, at MMU’en kan deaktiveres, men nogle deaktiverer MMU’en ved trapping til OS-kode.
VAXEdit
VAX-sider er 512 bytes, hvilket er meget lille. Et operativsystem kan behandle flere sider, som om de var en enkelt større side. Linux på VAX grupperer f.eks. otte sider sammen. Systemet betragtes således som om det har 4 KB sider. VAX’en opdeler hukommelsen i fire regioner med faste formål, der hver er på 1 GB. De er:
P0 space Anvendes til generel hukommelse til formål pr. proces, f.eks. heaps. P1 space (Or control space), som også er per-proces og typisk anvendes til supervisor, executive, kernel, user stacks og andre per-proces kontrolstrukturer, som styres af operativsystemet. S0-plads (eller systemplads), som er global for alle processer og gemmer operativsystemets kode og data, uanset om den er pagineret eller ej, herunder pagetabeller. S1-plads, som er ubrugt og “reserveret til digital”.
Pagetabeller er store lineære arrays. Normalt ville dette være meget spildt, når adresser bruges i begge ender af det mulige område, men sidetabellen for applikationer er selv gemt i kernen i den pagede hukommelse. Der er således effektivt et træ i to niveauer, hvilket gør det muligt for programmer at have et sparsomt hukommelseslayout uden at spilde en masse plads på ubrugte sidetabelposter. VAX MMU’en er bemærkelsesværdig ved at mangle en accessed bit. OS’er, der implementerer paging, må finde en måde at emulere accessed bit’en på, hvis de skal fungere effektivt. Typisk vil operativsystemet med jævne mellemrum afmappe sider, så page-not-present-fejl kan bruges til at lade operativsystemet indstille en accessed bit.
ARMEdit
ARM-arkitekturbaserede applikationsprocessorer implementerer en MMU, der er defineret af ARM’s virtuelle hukommelsessystemarkitektur. Den nuværende arkitektur definerer PTE’er til at beskrive sider på 4 KB og 64 KB, sektioner på 1 MB og supersektioner på 16 MB; ældre versioner definerede også en lille side på 1 KB. ARM anvender en sidetabel på to niveauer, hvis der anvendes 4 KB- og 64 KB-sider, eller blot en sidetabel på ét niveau for 1 MB-sektioner og 16 MB-sektioner.
TLB-opdateringer udføres automatisk af side table walking hardware. PTE’er omfatter læse-/skriveadgangstilladelse baseret på privilegier, cacheability-informationer, en NX-bit og en ikke-sikker bit.
IBM System/360 Model 67, IBM System/370 og efterfølgereRediger
I IBM System/360 Model 67, som blev introduceret i august 1965, indeholdt en MMU kaldet en dynamisk adresseoversættelsesboks (DAT). Den har den usædvanlige egenskab, at den gemmer bits med adgang og beskidte bits uden for sidetabellen (sammen med den fire bit store beskyttelsesnøgle for alle S/360-processorer). De henviser til fysisk hukommelse snarere end til virtuel hukommelse og tilgås af instruktioner til særlige formål. Dette reducerer overhead for operativsystemet, som ellers ville være nødt til at overføre accessed og dirty bits fra sidetabellerne til en mere fysisk orienteret datastruktur. Dette gør virtualisering på OS-niveau, senere kaldet paravirtualisering, lettere.
Den IBM System/370, der startede i august 1972, har en lignende MMU, selv om den i begyndelsen kun understøttede et 24-bit virtuelt adresseområde i stedet for det 32-bit virtuelle adresseområde i System/360 Model 67. Den gemmer også de tilgåede og beskidte bits uden for sidetabellen. I begyndelsen af 1983 udvidede System/370-XA-arkitekturen det virtuelle adresseområde til 31 bit, og i 2000 blev 64-bit z/A-arkitekturen introduceret, hvor adresseområdet blev udvidet til 64 bit; disse gemmer fortsat de accessed og dirty bits uden for sidetabellen.
DEC AlphaEdit
DEC Alpha-processoren opdeler hukommelsen i 8 KB-sider. Efter en TLB-misset fejl i TLB’en gennemløber firmware-maskinkode på lavt niveau (her kaldet PALcode) en trestruktureret sidetabel i tre niveauer. Adresserne er opdelt på følgende måde: 21 bit ubrugte, 10 bit til indeksering af træets rodniveau, 10 bit til indeksering af træets mellemste niveau, 10 bit til indeksering af træets bladniveau og 13 bit, der passerer igennem til den fysiske adresse uden ændring. Der er understøttet fuld læse-/skrive-/udførelsestilladelsesbits.
MIPSEdit
MIPS-arkitekturen understøtter en til 64 poster i TLB’en. Antallet af TLB-poster kan konfigureres ved CPU-konfigurationen før syntesen. TLB-poster er dobbelte. Hver TLB-post tilknytter et virtuelt sidetal (VPN2) til enten et af to side rammenumre (PFN0 eller PFN1), afhængigt af den mindst betydende bit i den virtuelle adresse, der ikke er en del af sidemasken. Denne bit og sidemaskebitsne er ikke gemt i VPN2. Hver TLB-post har sin egen sidestørrelse, som kan være en hvilken som helst værdi fra 1 KB til 256 MB i multipla af fire. Hver PFN i en TLB-post har en caching-attribut, en dirty- og en valid statusbit. En VPN2 har en global statusbit og et af operativsystemet tildelt ID, som deltager i matchet mellem TLB-poster med virtuelle adresser, hvis den globale statusbit er sat til nul. En PFN gemmer den fysiske adresse uden sidemaskebits.
En TLB-refill exception genereres, når der ikke er nogen poster i TLB’en, der matcher den tilknyttede virtuelle adresse. En ugyldig TLB-undtagelse genereres, når der er et match, men posten er markeret som ugyldig. En TLB-modificeret undtagelse genereres, når en lagringsinstruktion refererer til en tilknyttet adresse, og den matchende posts status “dirty” ikke er sat. Hvis der opstår en TLB-undtagelse ved behandling af en TLB-undtagelse, en dobbeltfejl-TLB-undtagelse, sendes den til sin egen undtagelseshåndtering.
MIPS32 og MIPS32r2 understøtter 32 bit virtuelt adresseområde og op til 36 bit fysisk adresseområde. MIPS64 understøtter op til 64 bit virtuelt adresseområde og op til 59 bit fysisk adresseområde.
Sun 1Rediger
Den oprindelige Sun 1 er en singleboard-computer, der er bygget omkring Motorola 68000-mikroprocessoren og blev introduceret i 1982. Den indeholder den originale Sun 1-hukommelseshåndteringsenhed, der sørger for adresseoversættelse, hukommelsesbeskyttelse, hukommelsesdeling og hukommelsesallokering til flere processer, der kører på CPU’en. Al adgang fra CPU’en til privat on-board RAM, ekstern Multibus-hukommelse, on-board I/O og Multibus I/O foregår gennem MMU’en, hvor adresseoversættelse og beskyttelse sker på en ensartet måde. MMU’en er implementeret i hardware på CPU-kortet.
MMMU’en består af et kontekstregister, et segmentkort og et sidekort. Virtuelle adresser fra CPU’en oversættes til mellemliggende adresser af segmentkortet, som igen oversættes til fysiske adresser af sidekortet. Sidestørrelsen er 2 KB, og segmentstørrelsen er 32 KB, hvilket giver 16 sider pr. segment. Der kan kortlægges op til 16 kontekster samtidig. Det maksimale logiske adresseområde for en kontekst er 1024 sider eller 2 MB. Den maksimale fysiske adresse, der kan kortlægges samtidigt, er også 2 MB.
Kontekstregisteret er vigtigt i et multitasking-operativsystem, fordi det gør det muligt for CPU’en at skifte mellem processer uden at genindlæse alle oversættelsestilstandsoplysningerne. Kontekstregisteret på 4 bit kan skifte mellem 16 sektioner af segmentkortet under supervisorkontrol, hvilket gør det muligt at kortlægge 16 kontekster samtidig. Hver kontekst har sit eget virtuelle adresseområde. Deling af det virtuelle adresseområde og kommunikation mellem kontekster kan ske ved at skrive de samme værdier i segment- eller sidekortet for forskellige kontekster. Yderligere kontekster kan håndteres ved at behandle segmentkortet som en kontekstcache og erstatte forældede kontekster på grundlag af de mindst anvendte kontekster.
Kontekstregisteret skelner ikke mellem bruger- og supervisortilstande. Interrupts og traps skifter ikke kontekst, hvilket kræver, at alle gyldige interruptvektorer altid er kortlagt i side 0 af kontekst, samt den gyldige supervisorstack.
PowerPCEdit
I PowerPC G1, G2, G3 og G4 er siderne normalt 4 KB. Efter en TLB-miss begynder standard PowerPC MMU’en to samtidige opslag. Det ene opslag forsøger at matche adressen med et af fire eller otte DBAT-registre (data block address translation) eller fire eller otte IBAT-registre (instruction block address translation), alt efter hvad der er relevant. BAT-registrene kan kortlægge lineære hukommelsesblokke på op til 256 MB og bruges normalt af et operativsystem til at kortlægge store dele af adresseområdet til operativsystemets kerne til eget brug. Hvis BAT-opslaget lykkes, standses og ignoreres det andet opslag.
Det andet opslag, der ikke understøttes direkte af alle processorer i denne familie, sker via en såkaldt “inverteret sidetabel”, der fungerer som en hashed off-chip-udvidelse af TLB’en. Først bruges de øverste fire bits i adressen til at vælge et af 16 segmentregistre. Derefter erstatter 24 bits fra segmentregisteret disse fire bits, hvilket giver en 52-bit adresse. Brugen af segmentregistre gør det muligt for flere processer at dele den samme hash-tabel.
Den 52-bits adresse hashes og bruges derefter som et indeks i off-chip tabellen. Der scannes en gruppe af otte siders tabelposter for at finde en, der passer. Hvis ingen passer sammen på grund af for mange hashkollisioner, prøver processoren igen med en lidt anden hashfunktion. Hvis dette også mislykkes, går CPU’en ind i OS (med MMU deaktiveret), så problemet kan løses. OS er nødt til at kassere en post fra hashtabellen for at gøre plads til en ny post. OS kan generere den nye post fra en mere normal trælignende sidetabel eller fra datastrukturer pr. kortlægning, som sandsynligvis vil være langsommere og mere pladseffektivt. Understøttelse af no-execute-kontrol er i segmentregistrene, hvilket fører til 256 MB granularitet.
Et stort problem med dette design er dårlig cache-lokalitet forårsaget af hash-funktionen. Træbaserede designs undgår dette ved at placere sidetabelposterne for tilstødende sider på tilstødende steder. Et operativsystem, der kører på PowerPC, kan minimere størrelsen af hashtabellen for at mindske dette problem.
Det er også noget langsomt at fjerne sidetabelposterne for en proces. OS’et kan undgå at genbruge segmentværdier for at forsinke at stå over for dette, eller det kan vælge at lide under det spild af hukommelse, der er forbundet med hashtabeller pr. proces. G1-chips søger ikke efter sidetabelposter, men de genererer hash’en, idet de forventer, at et operativsystem vil søge i standardhashtabellen via software. OS kan skrive til TLB’en. G2-, G3- og tidlige G4-chips bruger hardware til at søge i hashtabellen. De nyeste chips giver OS’et mulighed for at vælge en af metoderne. På chips, der gør dette valgfrit eller slet ikke understøtter det, kan styresystemet vælge udelukkende at bruge en træbaseret sidetabel.
IA-32 / x86Edit
Den x86-arkitektur har udviklet sig over meget lang tid, samtidig med at den har opretholdt fuld softwarekompatibilitet, selv for styresystemets kode. MMU’en er således ekstremt kompleks med mange forskellige mulige driftstilstande. Normal drift af den traditionelle 80386-CPU og dens efterfølgere (IA-32) er beskrevet her.
CPU’en opdeler primært hukommelsen i sider på 4 KB. Segmentregistre, der er grundlæggende for de ældre 8088- og 80286-MMU-designs, anvendes ikke i moderne operativsystemer, med én vigtig undtagelse: adgang til trådspecifikke data for applikationer eller CPU-specifikke data for operativsystemkerner, hvilket sker ved eksplicit brug af FS- og GS-segmentregistrene. Al hukommelsesadgang involverer et segmentregister, der vælges i overensstemmelse med den kode, der afvikles. Segmentregisteret fungerer som et indeks i en tabel, som giver en offset, der skal tilføjes til den virtuelle adresse. Bortset fra ved brug af FS eller GS sikrer OS, at forskydningen vil være nul.
Når forskydningen er tilføjet, maskeres adressen, så den ikke er større end 32 bit. Resultatet kan slås op via en trestruktureret sidetabel, hvor adressens bits er opdelt på følgende måde: 10 bits til træets gren, 10 bits til grenens blade, og de 12 laveste bits kopieres direkte til resultatet. Nogle operativsystemer, f.eks. OpenBSD med W^X-funktionen og Linux med Exec Shield- eller PaX-patches, kan også begrænse længden af kodesegmentet, som specificeret af CS-registret, for at forhindre udførelse af kode i områder af adresseområdet, der kan ændres.
Mindre revisioner af MMU’en, der blev indført med Pentium, har tilladt meget store 4 MB-sider ved at springe det nederste niveau i træet over (dette efterlader 10 bit til indeksering af det første niveau i sidehierarkiet, idet de resterende 10+12 bit kopieres direkte til resultatet). Mindre revisioner af MMU’en, der blev indført med Pentium Pro, introducerede PAE-funktionen (Physical Address Extension), der muliggør 36-bit fysiske adresser med 2+9+9+9 bits til sidetabeller på tre niveauer og 12 nederste bits, der kopieres direkte til resultatet. Store sider (2 MB) er også tilgængelige ved at springe det nederste niveau i træet over (hvilket resulterer i 2+9 bits for to-niveau tabelhierarki og de resterende 9+12 laveste bits, der kopieres direkte). Desuden gjorde sideattributtabellen det muligt at specificere cachemuligheden ved at slå nogle få høje bits op i en lille tabel på CPU’en.
Understøttelse af ikke-udførelse blev oprindeligt kun leveret på et per-segment-basis, hvilket gjorde den meget besværlig at bruge. Nyere x86-chips giver en no-execute-bit pr. side i PAE-tilstanden. W^X-, Exec Shield- og PaX-mekanismerne, der er beskrevet ovenfor, emulerer per-page non-execute-understøttelse på x86-maskiner, der mangler NX-bitten, ved at indstille længden af kodesegmentet, hvilket medfører et ydelsestab og en reduktion af det tilgængelige adresseområde.
x86-64Edit
x86-64 er en 64-bit udvidelse af x86, der næsten helt fjerner segmentering til fordel for den flade hukommelsesmodel, der anvendes af næsten alle styresystemer til 386-processorer eller nyere processorer. I long mode ignoreres alle segmentoffsets, bortset fra FS- og GS-segmenterne. Når den anvendes med 4 KB-sider, har sidetabeltræet fire niveauer i stedet for tre.
De virtuelle adresser er opdelt som følger: 16 bit ubrugte, ni bit hver for fire træniveauer (i alt 36 bit), og de 12 laveste bit kopieres direkte til resultatet. Med 2 MB-sider er der kun tre niveauer af sidetabellen, hvilket giver i alt 27 bit, der bruges til paging, og 21 bit offset. Nogle nyere CPU’er understøtter også en 1 GB-side med to niveauer af paging og 30 bits offset.
CPUID kan bruges til at bestemme, om 1 GB-sider understøttes. I alle tre tilfælde kræves det, at de 16 højeste bits skal være lig med den 48. bit, eller med andre ord, at de nederste 48 bits er tegnforlængede til de højere bits. Dette er gjort for at muliggøre en fremtidig udvidelse af det adresserbare område uden at gå på kompromis med bagudkompatibilitet. På alle niveauer i sidetabellen indeholder sidetabelposten en no-execute bit.
Unisys MCP Systems (Burroughs B5000)Rediger
Burroughs B5000 fra 1961 var det første kommercielle system, der understøttede virtuel hukommelse (efter Atlas), selv om det ikke har nogen MMU Det giver de to funktioner i en MMU – virtuelle hukommelsesadresser og hukommelsesbeskyttelse – med en anden arkitektonisk tilgang.
For det første er MCP-systemerne i forbindelse med kortlægningen af virtuelle hukommelsesadresser, i stedet for at have brug for en MMU, deskriptorbaserede. Hver tildelt hukommelsesblok får en masterdeskriptor med blokens egenskaber (dvs. størrelse, adresse og om den er til stede i hukommelsen). Når der fremsættes en anmodning om adgang til blokken til læsning eller skrivning, kontrollerer hardwaren dens tilstedeværelse via tilstedeværelsesbit (pbit) i deskriptoren.
En pbit på 1 angiver blokens tilstedeværelse. I dette tilfælde kan der gives adgang til blokken via den fysiske adresse i deskriptoren. Hvis pbit er nul, genereres en interrupt for at få MCP’en (operativsystemet) til at gøre blokken til stede. Hvis adressefeltet er nul, er dette den første adgang til denne blok, og den er allokeret (en init pbit). Hvis adressefeltet ikke er nul, er det en diskadresse for blokken, som tidligere er blevet rullet ud, så blokken hentes fra disken, og pbit’en sættes til et, og den fysiske hukommelsesadresse opdateres til at pege på blokken i hukommelsen (en anden pbit). Dette gør deskriptorer ækvivalente med en sidetabelpost i et MMU-system. Systemets ydeevne kan overvåges ved hjælp af antallet af pbits. Init pbits indikerer indledende allokeringer, men et højt niveau af andre pbits indikerer, at systemet måske er ved at thrashe.
Alle hukommelsesallokeringer er derfor helt automatiske (en af funktionerne i moderne systemer), og der er ingen anden måde at allokere blokke på end denne mekanisme. Der findes ingen kald som malloc eller dealloc, da hukommelsesblokke også automatisk kasseres. Ordningen er også doven, da en blok ikke allokeres, før der faktisk henvises til den. Når hukommelsen er næsten fuld, undersøger MCP’en arbejdsmængden og forsøger at komprimere (da systemet er segmenteret, ikke paged), deallokere skrivebeskyttede segmenter (f.eks. kode-segmenter, der kan gendannes fra deres oprindelige kopi) og som en sidste udvej rulle beskidte datasegmenter ud på disken.
En anden måde B5000 tilbyder en funktion som en MMU på er ved beskyttelse. Da alle adganger sker via deskriptoren, kan hardwaren kontrollere, at alle adganger er inden for grænserne og, i tilfælde af en skrivning, at processen har skrivetilladelse. MCP-systemet er i sagens natur sikkert og har derfor ikke brug for en MMU til at levere dette niveau af hukommelsesbeskyttelse. Deskriptorer er kun læsbare for brugerprocesser og kan kun opdateres af systemet (hardware eller MCP). (Ord, hvis tag er et ulige tal, er skrivebeskyttede; deskriptorer har et tag på 5 og kodeord har et tag på 3.)
Blokke kan deles mellem processer via kopi-deskriptorer i processtakken. Nogle processer kan således have skrivetilladelse, mens andre ikke har det. Et kodesegment er skrivebeskyttet, er således reentrant og deles mellem processer. Kopieringsdeskriptorer indeholder et 20-bit adressefelt, der angiver indekset for masterdeskriptoren i masterdeskriptor arrayet. Herved implementeres også en meget effektiv og sikker IPC-mekanisme. Blokke kan let flyttes, da det kun er master-deskriptoren, der skal opdateres, når blokens status ændres.
Det eneste andet aspekt er ydeevne – giver MMU-baserede eller ikke-MMU-baserede systemer bedre ydeevne? MCP-systemer kan implementeres oven på standardhardware, der har en MMU (f.eks. en standard-pc). Selv hvis systemimplementeringen bruger MMU’en på en eller anden måde, vil dette slet ikke være synligt på MCP-niveau.