De flesta moderna system delar in minnet i sidor som är 4-64 KB stora, ofta med möjlighet att använda så kallade enorma sidor på 2 MB eller 1 GB (ofta är båda varianterna möjliga). Sidöversättningar lagras i en translation lookaside buffer (TLB). Vissa system, främst äldre RISC-designs, har en fälla i operativsystemet när en sidöversättning inte hittas i TLB. De flesta system använder en hårdvarubaserad tree walker. De flesta system tillåter att MMU:n inaktiveras, men vissa inaktiverar MMU:n när man går in i OS-kod.
VAXEdit
VAX-sidor är 512 byte, vilket är mycket litet. Ett operativsystem kan behandla flera sidor som om de vore en enda större sida. Linux på VAX grupperar till exempel åtta sidor tillsammans. På så sätt betraktas systemet som att det har sidor på 4 KB. VAX delar upp minnet i fyra regioner för fasta ändamål, var och en 1 GB stor. De är:
P0-utrymme Används för allmänt processminne per process, till exempel för heaps. P1-utrymme (eller kontrollutrymme) som också är processpecifikt och vanligtvis används för supervisor, executive, kernel, user stacks och andra processpecifika kontrollstrukturer som hanteras av operativsystemet. S0-utrymme (eller systemutrymme) som är globalt för alla processer och som lagrar operativsystemets kod och data, oavsett om de är sidoordnade eller inte, inklusive pagetabeller. S1-utrymme som är oanvänt och ”reserverat för digitalt utrymme”.
Sidtabeller är stora linjära matriser. Normalt sett skulle detta vara mycket slösaktigt när adresser används i båda ändarna av det möjliga intervallet, men sidtabellen för program lagras i sig själv i kärnans paged-minne. Det finns alltså i praktiken ett träd i två nivåer, vilket gör det möjligt för program att ha en gles minneslayout utan att slösa mycket utrymme på oanvända poster i sidtabellen. VAX MMU är anmärkningsvärd för att den saknar en bit för åtkomst. Operativsystem som implementerar paging måste hitta något sätt att emulera accessbiten om de skall fungera effektivt. Typiskt sett kommer operativsystemet periodiskt att avmappa sidor så att page-not-present-fel kan användas för att låta operativsystemet ställa in en accessed bit.
ARMEdit
ARM-arkitekturbaserade applikationsprocessorer implementerar en MMU som definieras av ARM:s virtuella minnessystemarkitektur. Den nuvarande arkitekturen definierar PTE:er för att beskriva sidor på 4 KB och 64 KB, sektioner på 1 MB och supersektioner på 16 MB; äldre versioner definierade också en liten sida på 1 KB. ARM använder en sidtabell i två nivåer om man använder sidor på 4 KB och 64 KB, eller bara en sidtabell i en nivå för sektioner på 1 MB och sektioner på 16 MB.
TLB-uppdateringar utförs automatiskt av maskinvara för sidtabellsvandring. PTE:erna innehåller läs-/skrivbehörighet baserat på privilegium, information om cachemöjlighet, en NX-bit och en icke-säker bit.
IBM System/360 Model 67, IBM System/370 och efterföljareRedigera
I IBM System/360 Model 67, som lanserades i augusti 1965, ingick en MMU som kallades för en dynamisk adressöversättningsbox (DAT). Den har den ovanliga egenskapen att lagra åtkomliga och smutsiga bitar utanför sidtabellen (tillsammans med den fyra bitar långa skyddsnyckeln för alla S/360-processorer). De hänvisar till fysiskt minne snarare än till virtuellt minne och nås med hjälp av specialinstruktioner. Detta minskar överbelastningen för operativsystemet, som annars skulle behöva överföra åtkomna och smutsiga bitar från sidtabellerna till en mer fysiskt orienterad datastruktur. Detta underlättar virtualisering på OS-nivå, senare kallad paravirtualisering.
Den IBM System/370 som startade i augusti 1972 har en liknande MMU, även om den till en början endast stödde ett 24-bitars virtuellt adressutrymme i stället för det 32-bitars virtuella adressutrymmet i System/360 modell 67. Den lagrar också de åtkomliga och smutsiga bitarna utanför sidtabellen. I början av 1983 utökade System/370-XA-arkitekturen det virtuella adressutrymmet till 31 bitar, och år 2000 introducerades 64-bitars z/A-arkitekturen med ett adressutrymme som utökades till 64 bitar; dessa fortsätter att lagra de åtkomliga och smutsiga bitarna utanför sidtabellen.
DEC AlphaEdit
Dec Alpha-processorn delar upp minnet i sidor på 8 KB. Efter en TLB-miss går maskinkoden för den fasta programvaran på låg nivå (här kallad PALcode) igenom en trädstrukturerad sidtabell med tre nivåer. Adresserna är uppdelade på följande sätt: 21 bitar oanvända, 10 bitar för att indexera trädets rotnivå, 10 bitar för att indexera trädets mellersta nivå, 10 bitar för att indexera trädets bladnivå och 13 bitar som går igenom till den fysiska adressen utan modifiering. Fullständigt stöd för läs-, skriv- och utförandetillstånd finns.
MIPSEdit
MIPS-arkitekturen har stöd för en till 64 poster i TLB:en. Antalet TLB-poster kan konfigureras vid CPU-konfigurationen före syntesen. TLB-posterna är dubbla. Varje TLB-post mappar ett virtuellt sidnummer (VPN2) till antingen ett av två sidramsnummer (PFN0 eller PFN1), beroende på den minst signifikanta biten i den virtuella adressen som inte ingår i sidmasken. Denna bit och sidmaskbitsen lagras inte i VPN2. Varje TLB-post har sin egen sidstorlek, som kan vara ett valfritt värde från 1 KB till 256 MB i multiplar av fyra. Varje PFN i en TLB-post har ett caching-attribut, en dirty- och en valid statusbit. En VPN2 har en global statusbit och ett av operativsystemet tilldelat ID som deltar i matchningen av den virtuella adressens TLB-post, om den globala statusbiten är satt till noll. En PFN lagrar den fysiska adressen utan sidmaskbitar.
Ett TLB-uppfyllnadsundantag genereras när det inte finns några poster i TLB som matchar den mappade virtuella adressen. Ett undantag för ogiltig TLB genereras när det finns en matchning men posten är markerad som ogiltig. Ett TLB-modifierat undantag genereras när en lagringsinstruktion refererar till en mappad adress och den matchande postens smutsiga status inte är inställd. Om ett TLB-undantag uppstår vid behandling av ett TLB-undantag, ett TLB-undantag med dubbelt fel, skickas det till sin egen undantagshanterare.
MIPS32 och MIPS32r2 har stöd för 32 bitar virtuellt adressutrymme och upp till 36 bitar fysiskt adressutrymme. MIPS64 stöder upp till 64 bitar virtuellt adressutrymme och upp till 59 bitar fysiskt adressutrymme.
Sun 1Redigera
Den ursprungliga Sun 1 är en enkelbordsdator byggd kring Motorola 68000-mikroprocessorn och introducerades 1982. Den innehåller den ursprungliga Sun 1 minneshanteringsenheten som tillhandahåller adressöversättning, minnesskydd, minnesdelning och minnesallokering för flera processer som körs på processorn. All åtkomst från CPU:n till privat inbyggt RAM-minne, externt Multibus-minne, inbyggd I/O och Multibus I/O går genom MMU:n, där adressöversättning och skydd sker på ett enhetligt sätt. MMU:n implementeras i hårdvara på CPU-kortet.
MMMU:n består av ett kontextregister, en segmentkarta och en sidkarta. Virtuella adresser från CPU:n översätts till mellanliggande adresser av segmentkartan, som i sin tur översätts till fysiska adresser av sidkartan. Sidstorleken är 2 KB och segmentstorleken 32 KB, vilket ger 16 sidor per segment. Upp till 16 kontexter kan kartläggas samtidigt. Det maximala logiska adressutrymmet för ett sammanhang är 1024 sidor eller 2 MB. Den maximala fysiska adressen som kan mappas samtidigt är också 2 MB.
Kontextregistret är viktigt i ett multitaskingoperativsystem eftersom det gör det möjligt för CPU:n att växla mellan processer utan att ladda om all information om översättningstillstånd. Det 4-bitars kontextregistret kan växla mellan 16 sektioner av segmentkartan under supervisorstyrning, vilket gör att 16 kontexter kan mappas samtidigt. Varje kontext har sitt eget virtuella adressutrymme. Delning av det virtuella adressutrymmet och kommunikation mellan kontexter kan ske genom att samma värden skrivs in i segment- eller sidokartorna för olika kontexter. Ytterligare kontexter kan hanteras genom att behandla segmentkartan som en kontextcache och ersätta föråldrade kontexter enligt principen om minsta möjliga användning.
Kontextregistret gör ingen åtskillnad mellan användar- och supervisortillstånd. Avbrott och traps byter inte kontext, vilket kräver att alla giltiga avbrottsvektorer alltid mappas i sida 0 i kontexten, liksom den giltiga supervisorstacken.
PowerPCEdit
I PowerPC G1, G2, G3 och G4 är sidorna normalt 4 KB. Efter en TLB-miss börjar standard PowerPC MMU:n två samtidiga sökningar. Den ena sökningen försöker matcha adressen med ett av fyra eller åtta DBAT-register (data block address translation) eller fyra eller åtta IBAT-register (instruction block address translation), beroende på vad som är lämpligt. BAT-registren kan mappa linjära delar av minnet som är så stora som 256 MB och används normalt av ett operativsystem för att mappa stora delar av adressutrymmet för OS-kärnans eget bruk. Om BAT-sökningen lyckas stoppas och ignoreras den andra sökningen.
Den andra sökningen, som inte stöds direkt av alla processorer i den här familjen, sker via en så kallad ”inverterad sidtabell”, som fungerar som en hasad off-chip-förlängning av TLB. Först används de fyra översta bitarna i adressen för att välja ett av 16 segmentregister. Därefter ersätter 24 bitar från segmentregistret dessa fyra bitar, vilket ger en adress på 52 bitar. Användningen av segmentregister gör det möjligt för flera processer att dela samma hashtabell.
Den 52-bitariga adressen hashasas och används sedan som ett index i off-chip-tabellen. Där genomsöks en grupp av åtta sidors tabellposter för att hitta en som matchar. Om ingen matchar på grund av alltför stora hashkollisioner försöker processorn igen med en något annorlunda hashfunktion. Om även detta misslyckas går processorn in i operativsystemet (med MMU inaktiverad) så att problemet kan lösas. Operativsystemet måste ta bort en post från hashtabellen för att skapa utrymme för en ny post. Operativsystemet kan generera den nya posten från en mer normal trädliknande sidtabell eller från datastrukturer per mappning, som sannolikt är långsammare och mer utrymmeseffektiva. Stöd för no-execute-kontroll finns i segmentregistren, vilket leder till 256 MB granularitet.
Ett stort problem med denna konstruktion är den dåliga cachelokaliteten som orsakas av hashfunktionen. Trädbaserade konstruktioner undviker detta genom att placera sidtabellsposterna för intilliggande sidor på intilliggande platser. Ett operativsystem som körs på PowerPC kan minimera hashtabellens storlek för att minska detta problem.
Det är också något långsamt att ta bort sidtabellsposterna för en process. Operativsystemet kan undvika att återanvända segmentvärden för att fördröja detta, eller så kan det välja att drabbas av det slöseri med minne som är förknippat med hashtabeller per process. G1-chipen söker inte efter poster i sidtabellen, men de genererar hash-tabellen, och förväntar sig att operativsystemet kommer att söka i standardhashtabellen med hjälp av programvara. Operativsystemet kan skriva till TLB. G2-, G3- och tidiga G4-chip använder hårdvara för att söka i hashtabellen. De senaste chipen gör det möjligt för operativsystemet att välja endera metoden. På chip som gör detta valfritt eller inte stöder det alls kan operativsystemet välja att enbart använda en trädbaserad sidtabell.
IA-32 / x86Edit
X86-arkitekturen har utvecklats under en mycket lång tid samtidigt som den har bibehållit full programvarukompatibilitet, även för OS-kod. MMU:n är därför extremt komplex, med många olika möjliga driftlägen. Normal drift av den traditionella 80386 CPU:n och dess efterföljare (IA-32) beskrivs här.
CPU:n delar i första hand upp minnet i sidor på 4 KB. Segmentregister, som är grundläggande för de äldre 8088 och 80286 MMU-konstruktionerna, används inte i moderna operativsystem, med ett stort undantag: åtkomst till trådspecifika data för program eller CPU-specifika data för operativsystemets kärnor, vilket sker med uttrycklig användning av segmentregistren FS och GS. All minnesåtkomst involverar ett segmentregister, som väljs i enlighet med den kod som körs. Segmentregistret fungerar som ett index i en tabell som ger en offset som skall läggas till den virtuella adressen. Förutom vid användning av FS eller GS ser operativsystemet till att förskjutningen blir noll.
När förskjutningen har lagts till maskeras adressen så att den inte är större än 32 bitar. Resultatet kan sökas upp via en trädstrukturerad sidtabell, där adressens bitar delas upp på följande sätt: 10 bitar för trädets gren, 10 bitar för grenens blad och de 12 lägsta bitarna kopieras direkt till resultatet. Vissa operativsystem, t.ex. OpenBSD med W^X-funktionen och Linux med patcherna Exec Shield eller PaX, kan också begränsa längden på kodsegmentet, vilket specificeras av CS-registret, för att inte tillåta exekvering av kod i modifierbara områden av adressutrymmet.
Mindre revideringar av MMU:n som infördes med Pentium har möjliggjort mycket stora sidor på 4 MB genom att hoppa över den nedersta nivån i trädet (detta lämnar 10 bitar för indexering av den första nivån i sidhierarkin och de återstående 10+12 bitar kopieras direkt till resultatet). Mindre revideringar av MMU:n som infördes med Pentium Pro införde funktionen för fysisk adressutvidgning (PAE), som möjliggör 36-bitars fysiska adresser med 2+9+9+9 bitar för sidtabeller i tre nivåer och där de 12 nedersta bitarna kopieras direkt till resultatet. Stora sidor (2 MB) är också tillgängliga genom att man hoppar över den nedersta nivån i trädet (vilket resulterar i 2+9 bitar för en tabellhierarki i två nivåer och de återstående 9+12 lägsta bitarna kopieras direkt). Dessutom gjorde sidattributtabellen det möjligt att specificera cachemöjligheten genom att slå upp några få höga bitar i en liten tabell på CPU:n.
Stödet för icke-utförande tillhandahölls ursprungligen endast per segment, vilket gjorde det mycket besvärligt att använda. Nyare x86-chips tillhandahåller en bit för icke-utförande per sida i PAE-läget. Mekanismerna W^X, Exec Shield och PaX som beskrivs ovan emulerar stöd för icke-utförande per sida på x86-processorer som saknar NX-biten genom att ställa in längden på kodsegmentet, med en prestandaförlust och en minskning av det tillgängliga adressutrymmet.
x86-64Edit
x86-64 är en 64-bitars utvidgning av x86 som nästan helt tar bort segmentering till förmån för den platta minnesmodell som används av nästan alla operativsystem för 386 eller nyare processorer. I långt läge ignoreras alla segmentoffsets, med undantag för FS- och GS-segmenten. När det används med 4 KB-sidor har sidtabellträdet fyra nivåer i stället för tre.
De virtuella adresserna är uppdelade på följande sätt: 16 bitar oanvända, nio bitar vardera för fyra trädnivåer (för totalt 36 bitar) och de 12 lägsta bitarna kopieras direkt till resultatet. Med sidor på 2 MB finns det bara tre nivåer av sidtabellen, vilket ger totalt 27 bitar som används för sidbyte och 21 bitar för förskjutning. Vissa nyare CPU:er har också stöd för en 1 GB-sida med två nivåer av paging och 30 bitar offset.
CPUID kan användas för att avgöra om 1 GB-sidor stöds. I alla tre fallen måste de 16 högsta bitarna vara lika med den 48:e biten, eller med andra ord, de lägsta 48 bitarna är teckenförlängda till de högre bitarna. Detta görs för att möjliggöra en framtida utvidgning av det adresserbara området utan att äventyra bakåtkompatibiliteten. I alla nivåer av sidtabellen innehåller sidtabellsposten en bit för icke-utförande.
Unisys MCP Systems (Burroughs B5000)Edit
Burroughs B5000 från 1961 var det första kommersiella systemet med stöd för virtuellt minne (efter Atlas), även om det inte har någon MMU Det tillhandahåller de två funktionerna hos en MMU – virtuella minnesadresser och minnesskydd – med ett annat arkitektoniskt tillvägagångssätt
För det första, när det gäller mappning av virtuella minnesadresser, i stället för att behöva en MMU, är MCP-system deskriptorbaserade. Varje tilldelat minnesblock får en huvuddeskriptor med blockets egenskaper (dvs. storlek, adress och om det finns i minnet). När en begäran görs om att få tillgång till blocket för läsning eller skrivning kontrollerar maskinvaran dess närvaro via närvarobiten (pbit) i deskriptorn.
En pbit på 1 indikerar att blocket är närvarande. I detta fall kan blocket nås via den fysiska adressen i deskriptorn. Om pbit är noll genereras ett avbrott för att MCP (operativsystemet) ska göra blocket närvarande. Om adressfältet är noll är detta den första åtkomsten till blocket och det allokeras (en init pbit). Om adressfältet inte är noll är det en diskadress för blocket, som tidigare har rullats ut, så blocket hämtas från disken och pbiten sätts till ett och den fysiska minnesadressen uppdateras så att den pekar på blocket i minnet (en annan pbit). Detta gör att deskriptorer motsvarar en post i en sidtabell i ett MMU-system. Systemets prestanda kan övervakas genom antalet pbits. Init pbits indikerar inledande allokeringar, men en hög nivå av andra pbits indikerar att systemet kanske håller på att thrasha.
Alla minnesallokeringar är därför helt automatiska (en av funktionerna i moderna system) och det finns inget annat sätt att allokera block än denna mekanism. Det finns inga sådana anrop som malloc eller dealloc, eftersom minnesblock också automatiskt kasseras. Systemet är också lamt, eftersom ett block inte allokeras förrän det faktiskt refereras. När minnet är nästan fullt undersöker MCP arbetsmängden och försöker komprimera (eftersom systemet är segmenterat, inte pagerat), avallokera skrivskyddade segment (t.ex. kodsegment som kan återställas från sin ursprungliga kopia) och, som en sista utväg, rulla ut smutsiga datasegment till disken.
Ett annat sätt för B5000 att tillhandahålla en funktion av en MMU är genom skydd. Eftersom alla åtkomster sker via deskriptorn kan maskinvaran kontrollera att alla åtkomster håller sig inom gränserna och, i fallet med en skrivning, att processen har skrivbehörighet. MCP-systemet är naturligt säkert och har därför inget behov av en MMU för att tillhandahålla denna nivå av minnesskydd. Deskriptorer är skrivskyddade för användarprocesser och kan endast uppdateras av systemet (maskinvara eller MCP). (Ord vars tagg är ett udda tal är skrivskyddade; deskriptorer har tagg 5 och kodord har tagg 3.)
Block kan delas mellan processer via kopieringsdeskriptorer i processstapeln. Vissa processer kan alltså ha skrivbehörighet medan andra inte har det. Ett kodsegment är skrivskyddat, alltså reentrant och delas mellan processer. Kopieringsdeskriptorer innehåller ett 20-bitars adressfält som ger index för huvuddeskriptorn i huvuddeskriptormatrisen. På detta sätt genomförs också en mycket effektiv och säker IPC-mekanism. Block kan lätt flyttas, eftersom endast masterdeskriptorn behöver uppdateras när ett blocks status ändras.
Den enda andra aspekten är prestanda – ger MMU-baserade eller icke-MMU-baserade system bättre prestanda? MCP-system kan implementeras ovanpå standardhårdvara som har en MMU (t.ex. en standarddator). Även om systemimplementationen använder MMU:n på något sätt kommer detta inte alls att vara synligt på MCP-nivå.