De meeste moderne systemen verdelen het geheugen in pagina’s die 4-64 KB groot zijn, vaak met de mogelijkheid om zogenaamde huge pages van 2 MB of 1 GB groot te gebruiken (vaak zijn beide varianten mogelijk). Paginavertalingen worden in de cache opgeslagen in een translation lookaside buffer (TLB). Sommige systemen, vooral oudere RISC-ontwerpen, geven een val in het OS wanneer een paginavertaling niet in de TLB wordt gevonden. De meeste systemen gebruiken een hardware-gebaseerde tree walker. Bij de meeste systemen kan de MMU worden uitgeschakeld, maar bij sommige wordt de MMU uitgeschakeld wanneer naar het besturingssysteem wordt overgegaan.

VAXEdit

VAX-pagina’s zijn 512 bytes, wat erg klein is. Een OS kan meerdere pagina’s behandelen alsof ze een enkele grotere pagina zijn. Linux op VAX groepeert bijvoorbeeld acht pagina’s samen. Het systeem wordt dus gezien alsof het 4 KB-pagina’s heeft. De VAX verdeelt het geheugen in vier “fixed purpose regions”, die elk 1 GB groot zijn. Deze zijn:

P0 space Wordt gebruikt voor algemeen geheugen per proces, zoals heaps. P1-ruimte (Of control space) die ook per proces is en gewoonlijk wordt gebruikt voor supervisor, uitvoerend, kernel, gebruikersstacks en andere per-proces controlestructuren die worden beheerd door het besturingssysteem. S0-ruimte (of systeemruimte) die globaal is voor alle processen en code en gegevens van het besturingssysteem opslaat, al dan niet gepaged, inclusief pagetables. S1-ruimte die ongebruikt is en “Gereserveerd voor Digital”.

Paginatabellen zijn grote lineaire arrays. Normaal gesproken zou dit erg verspillend zijn wanneer adressen aan beide uiteinden van het mogelijke bereik worden gebruikt, maar de pagetabel voor applicaties wordt zelf opgeslagen in het paged geheugen van de kernel. Er is dus in feite een boom van twee niveaus, waardoor toepassingen een spaarzame geheugenlayout kunnen hebben zonder veel ruimte te verspillen aan ongebruikte paginatabel-ingangen. De VAX MMU valt op door het ontbreken van een accessed bit. Besturingssystemen die paging implementeren moeten een manier vinden om de accessed bit te emuleren, willen zij efficiënt werken. Typisch zal het OS periodiek pagina’s unmappen zodat page-not-present faults kunnen worden gebruikt om het OS een accessed bit te laten instellen.

ARMEdit

ARM architectuur-gebaseerde applicatie processoren implementeren een MMU gedefinieerd door ARM’s virtual memory system architectuur. De huidige architectuur definieert PTE’s voor het beschrijven van 4 KB en 64 KB pagina’s, 1 MB secties en 16 MB supersecties; oudere versies definiëren ook een 1 KB tiny page. ARM gebruikt een paginatabel met twee niveaus bij gebruik van 4 KB en 64 KB pagina’s, of slechts een paginatabel met één niveau voor 1 MB secties en 16 MB secties.

TLB updates worden automatisch uitgevoerd door de loop-hardware van de paginatabel. PTE’s bevatten lees/schrijf-toegangspermissies op basis van privilege, cacheability informatie, een NX bit, en een niet-beveiligde bit.

IBM System/360 Model 67, IBM System/370, en opvolgersEdit

Het IBM System/360 Model 67, dat in aug. 1965 werd geïntroduceerd, bevatte een MMU genaamd een dynamic address translation (DAT) box. Het heeft de ongebruikelijke eigenschap om accessed en dirty bits buiten de page table op te slaan (samen met de vier bits beveiligingssleutel voor alle S/360 processoren). Zij verwijzen naar fysiek geheugen in plaats van virtueel geheugen, en worden benaderd door speciale instructies. Dit vermindert de overhead voor het OS, dat anders benaderde en vuile bits uit de paginatabellen zou moeten propageren naar een meer fysisch georiënteerde datastructuur. Dit maakt virtualisatie op OS-niveau, later paravirtualisatie genoemd, eenvoudiger.

Het IBM System/370 heeft vanaf augustus 1972 een soortgelijke MMU, hoewel het aanvankelijk slechts een 24-bits virtuele adresruimte ondersteunde in plaats van de 32-bits virtuele adresruimte van het System/360 Model 67. Ook worden de accessed en dirty bits buiten de paginatabel opgeslagen. Begin 1983 breidde de System/370-XA architectuur de virtuele adresruimte uit tot 31 bits, en in 2000 werd de 64-bit z/Architectuur geïntroduceerd, met de adresruimte uitgebreid tot 64 bits; deze blijven de accessed en dirty bits buiten de paginatabel opslaan.

DEC AlphaEdit

De DEC Alpha processor verdeelt het geheugen in 8 KB pagina’s. Na een TLB miss, loopt low-level firmware machine code (hier PALcode genoemd) een drie-niveau boom-gestructureerde page tabel. Adressen worden als volgt onderverdeeld: 21 bits ongebruikt, 10 bits om het root-niveau van de boom te indexeren, 10 bits om het middelste niveau van de boom te indexeren, 10 bits om het bladniveau van de boom te indexeren, en 13 bits die zonder wijziging worden doorgegeven aan het fysieke adres. Volledige read/write/execute permission bits worden ondersteund.

MIPSEdit

De MIPS architectuur ondersteunt één tot 64 entries in de TLB. Het aantal TLB-regels kan worden geconfigureerd bij de CPU-configuratie vóór de synthese. TLB-regels zijn dubbel. Elke TLB-regel wijst een virtueel paginanummer (VPN2) toe aan een van de twee paginaframmanummers (PFN0 of PFN1), afhankelijk van het minst significante bit van het virtuele adres dat geen deel uitmaakt van het paginamasker. Dit bit en de paginamasker-bits worden niet in de VPN2 opgeslagen. Elke TLB-entry heeft zijn eigen paginagrootte, die elke waarde kan hebben van 1 KB tot 256 MB in veelvouden van vier. Elke PFN in een TLB-entry heeft een caching-attribuut, een “dirty” en een “valid” statusbit. Een VPN2 heeft een globaal statusbit en een door het OS toegewezen ID die deelneemt aan de overeenkomst van de TLB-entry voor het virtuele adres, indien het globale statusbit op nul is gezet. Een PFN slaat het fysieke adres op zonder de paginamask bits.

Een TLB refill exception wordt gegenereerd wanneer er geen regels in de TLB zijn die overeenkomen met het gemapte virtuele adres. Een TLB invalid exception wordt gegenereerd wanneer er een overeenkomst is, maar de entry ongeldig is gemarkeerd. Een TLB modified exceptie wordt gegenereerd wanneer een store instructie verwijst naar een gemapt adres en de vuile status van de overeenkomende entry niet is ingesteld. Als een TLB exceptie optreedt tijdens het verwerken van een TLB exceptie, een dubbele fout TLB exceptie, wordt deze doorgestuurd naar zijn eigen exception handler.

MIPS32 en MIPS32r2 ondersteunen 32 bits virtuele adresruimte en tot 36 bits fysieke adresruimte. MIPS64 ondersteunt tot 64 bits virtuele adresruimte en tot 59 bits fysieke adresruimte.

Sun 1Edit

De oorspronkelijke Sun 1 is een single-board computer gebouwd rond de Motorola 68000 microprocessor en geïntroduceerd in 1982. Het bevat de originele Sun 1 geheugenbeheerseenheid die adresvertaling, geheugenbescherming, geheugendeling en geheugentoewijzing biedt voor meerdere processen die op de CPU draaien. Alle toegang van de CPU tot privé RAM op de kaart, extern Multibus-geheugen, I/O op de kaart en de Multibus I/O loopt via de MMU, waar adresvertaling en bescherming op uniforme wijze worden uitgevoerd. De MMU is hardwarematig geïmplementeerd op het CPU-board.

De MMU bestaat uit een contextregister, een segment map en een page map. Virtuele adressen van de CPU worden vertaald in intermediaire adressen door de segment map, die op hun beurt worden vertaald in fysieke adressen door de page map. De paginagrootte is 2 KB en de segmentgrootte is 32 KB, hetgeen 16 pagina’s per segment oplevert. Tot 16 contexten kunnen gelijktijdig gemapt worden. De maximale logische adresruimte voor een context is 1024 pagina’s of 2 MB. Het maximale fysieke adres dat gelijktijdig kan worden toegewezen is ook 2 MB.

Het contextregister is belangrijk in een multitasking besturingssysteem omdat het de CPU in staat stelt tussen processen te schakelen zonder alle informatie over de toestand van de vertalingen opnieuw te hoeven laden. Het 4-bit context register kan schakelen tussen 16 secties van de segment map onder supervisor controle, waardoor 16 contexten gelijktijdig in kaart kunnen worden gebracht. Elke context heeft zijn eigen virtuele adresruimte. Het delen van de virtuele adresruimte en de communicatie tussen contexten kan worden verzorgd door dezelfde waarden in de segment- of paginamappen van verschillende contexten te schrijven. Extra contexten kunnen afgehandeld worden door de segment map als een context cache te behandelen en verouderde contexten te vervangen op basis van het minst recent gebruikte.

Het context register maakt geen onderscheid tussen gebruiker en supervisor toestanden. Interrupts en traps wisselen niet van context, wat vereist dat alle geldige interrupt vectoren altijd in pagina 0 van context worden gemapt, evenals de geldige supervisor stack.

PowerPCEdit

In PowerPC G1, G2, G3, en G4 pagina’s zijn normaal 4 KB. Na een TLB miss, begint de standaard PowerPC MMU twee gelijktijdige lookups. Eén lookup probeert het adres te matchen met één van de vier of acht data block address translation (DBAT) registers, of vier of acht instruction block address translation registers (IBAT), al naar gelang het geval. De BAT registers kunnen lineaire stukken geheugen zo groot als 256 MB toewijzen, en worden gewoonlijk door een OS gebruikt om grote delen van de adresruimte voor eigen gebruik van de OS kernel in kaart te brengen. Als de BAT lookup slaagt, wordt de andere lookup gestopt en genegeerd.

De andere lookup, niet direct ondersteund door alle processoren in deze familie, is via een zogenaamde “inverted page table,” die werkt als een gehashte off-chip uitbreiding van de TLB. Eerst worden de bovenste vier bits van het adres gebruikt om een van de 16 segmentregisters te selecteren. Vervolgens worden deze vier bits vervangen door 24 bits uit het segmentregister, waardoor een adres van 52 bits ontstaat. Door het gebruik van segmentregisters kunnen meerdere processen dezelfde hashtabel delen.

Het 52-bits adres wordt gehasht en vervolgens gebruikt als index in de off-chip tabel. Daar wordt een groep van acht-pagina tabel entries gescand voor een die overeenkomt. Als er geen overeenkomt vanwege te veel hash-botsingen, probeert de processor het opnieuw met een iets andere hash-functie. Als ook dit mislukt, schakelt de CPU het besturingssysteem in (met MMU uitgeschakeld) zodat het probleem kan worden opgelost. Het OS moet een entry uit de hashtabel weggooien om plaats te maken voor een nieuwe entry. Het OS kan de nieuwe invoer genereren uit een meer normale boom-achtige paginatabel of uit per-mapping gegevensstructuren die waarschijnlijk langzamer en ruimte-efficiënter zijn. Ondersteuning voor no-execute control zit in de segmentregisters, wat leidt tot 256 MB granulariteit.

Een groot probleem met dit ontwerp is de slechte lokaliteit van de cache, veroorzaakt door de hash-functie. Boom-gebaseerde ontwerpen vermijden dit door de ingangen van de paginatabel voor aangrenzende pagina’s op aangrenzende plaatsen te plaatsen. Een besturingssysteem dat op de PowerPC draait, kan de grootte van de hash-tabel minimaliseren om dit probleem te verminderen.

Het is ook wat traag om de paginatabel-ingangen van een proces te verwijderen. Het OS kan het hergebruik van segmentwaarden vermijden om dit uit te stellen, of het kan kiezen voor de verspilling van geheugen die gepaard gaat met hashtabellen per proces. G1 chips zoeken niet naar paginatabel entries, maar genereren wel de hash, met de verwachting dat een OS de standaard hash tabel softwarematig zal doorzoeken. Het OS kan naar de TLB schrijven. G2, G3, en vroege G4 chips gebruiken hardware om de hashtabel te doorzoeken. De nieuwste chips staan het OS toe een van beide methoden te kiezen. Op chips die dit optioneel maken of helemaal niet ondersteunen, kan het OS ervoor kiezen om uitsluitend een boom-gebaseerde paginatabel te gebruiken.

IA-32 / x86Edit

De x86 architectuur is gedurende een zeer lange tijd geëvolueerd met behoud van volledige software compatibiliteit, zelfs voor OS code. De MMU is dus uiterst complex, met veel verschillende mogelijke werkingsmodi. De normale werking van de traditionele 80386 CPU en zijn opvolgers (IA-32) wordt hier beschreven.

De CPU verdeelt het geheugen primair in 4 KB pagina’s. Segmentregisters, fundamenteel voor de oudere 8088 en 80286 MMU ontwerpen, worden niet gebruikt in moderne OS’en, met een belangrijke uitzondering: toegang tot thread-specifieke gegevens voor applicaties of CPU-specifieke gegevens voor OS kernels, die wordt gedaan met expliciet gebruik van de FS en GS segment registers. Voor alle geheugentoegang is een segmentregister nodig, dat wordt gekozen op basis van de code die wordt uitgevoerd. Het segmentregister fungeert als een index in een tabel, die een offset oplevert die aan het virtuele adres moet worden toegevoegd. Behalve bij gebruik van FS of GS, zorgt het OS ervoor dat de offset nul zal zijn.

Nadat de offset is toegevoegd, wordt het adres gemaskeerd zodat het niet groter is dan 32 bits. Het resultaat kan worden opgezocht via een boomgestructureerde paginatabel, waarbij de bits van het adres als volgt worden opgesplitst: 10 bits voor de tak van de boom, 10 bits voor de bladeren van de tak, en de 12 laagste bits die rechtstreeks naar het resultaat worden gekopieerd. Sommige besturingssystemen, zoals OpenBSD met zijn W^X-functie, en Linux met de Exec Shield- of PaX-patches, kunnen ook de lengte van het codesegment beperken, zoals aangegeven door het CS-register, om uitvoering van code in wijzigbare delen van de adresruimte te verhinderen.

Minor revisies van de MMU die met de Pentium zijn geïntroduceerd, hebben zeer grote 4 MB pagina’s mogelijk gemaakt door het onderste niveau van de boom over te slaan (hierdoor blijven 10 bits over voor het indexeren van het eerste niveau van de pagina-hiërarchie, waarbij de resterende 10+12 bits direct naar het resultaat worden gekopieerd). Kleine herzieningen van de MMU die met de Pentium Pro werden geïntroduceerd, introduceerden de PAE-functie (Physical Address Extension), die 36-bits fysieke adressen mogelijk maakte met 2+9+9 bits voor paginatabellen op drie niveaus en waarbij de laagste 12 bits direct naar het resultaat worden gekopieerd. Grote pagina’s (2 MB) zijn ook beschikbaar door het onderste niveau van de boom over te slaan (wat resulteert in 2+9 bits voor tabelhiërarchie op twee niveaus en de resterende 9+12 laagste bits die rechtstreeks worden gekopieerd). Bovendien maakte de pagina-attribuut tabel het mogelijk de cacheerbaarheid te specificeren door een paar hoge bits op te zoeken in een kleine on-CPU tabel.

No-execute ondersteuning werd oorspronkelijk alleen geleverd op een per-segment basis, waardoor het erg onhandig was in gebruik. Recentere x86-chips bieden een per-pagina no-execute bit in de PAE-modus. De hierboven beschreven W^X, Exec Shield, en PaX mechanismen emuleren per-pagina niet-uitvoeren ondersteuning op machines x86 processoren die de NX bit missen door de lengte van het code segment in te stellen, met een prestatie verlies en een reductie in de beschikbare adres ruimte.

x86-64Edit

Heterogeneous System Architecture (HSA) creëert een verenigde virtuele adresruimte voor CPU’s, GPU’s en DSP’s, waardoor de mapping-trucs en het kopiëren van gegevens overbodig worden.

x86-64 is een 64-bits uitbreiding van x86 die segmentatie bijna volledig verwijdert ten gunste van het vlakke geheugenmodel dat door bijna alle besturingssystemen voor de 386 of nieuwere processoren wordt gebruikt. In long mode worden alle segment offsets genegeerd, behalve de FS en GS segmenten. Bij gebruik van 4 KB pages heeft de page table tree vier niveaus in plaats van drie.

De virtuele adressen zijn als volgt verdeeld: 16 bits ongebruikt, negen bits elk voor vier boomniveaus (voor een totaal van 36 bits), en de 12 laagste bits direct gekopieerd naar het resultaat. Met pagina’s van 2 MB zijn er slechts drie niveaus van de paginatabel, voor een totaal van 27 bits gebruikt in paging en 21 bits offset. Sommige nieuwere CPU’s ondersteunen ook een 1 GB pagina met twee niveaus van paging en 30 bits offset.

CPUID kan worden gebruikt om te bepalen of 1 GB pagina’s worden ondersteund. In alle drie de gevallen moeten de 16 hoogste bits gelijk zijn aan de 48ste bit, of anders gezegd, de laagste 48 bits worden met voortekens uitgebreid tot de hogere bits. Dit is gedaan om een toekomstige uitbreiding van het adresseerbare bereik mogelijk te maken, zonder de achterwaartse compatibiliteit in gevaar te brengen. In alle niveaus van de paginatabel bevat de page table entry een no-execute bit.

Unisys MCP Systems (Burroughs B5000)Edit

Deze sectie kan verwarrend of onduidelijk zijn voor lezers. Help alstublieft de sectie te verduidelijken. Er zou een discussie hierover kunnen zijn op de praatpagina. (September 2020) (Leer hoe en wanneer u dit sjabloonbericht verwijdert)

De Burroughs B5000 uit 1961 was het eerste commerciële systeem dat virtueel geheugen ondersteunde (na de Atlas), ook al heeft het geen MMU Het biedt de twee functies van een MMU – virtuele geheugenadressen en geheugenbeveiliging – met een andere architectonische aanpak.

Ten eerste, bij het in kaart brengen van virtuele geheugenadressen, in plaats van een MMU nodig te hebben, zijn de MCP-systemen op descriptor gebaseerd. Elk toegewezen geheugenblok krijgt een master-descriptor met de eigenschappen van het blok (d.w.z. de grootte, het adres, en of het in het geheugen aanwezig is). Wanneer een verzoek wordt gedaan om toegang te krijgen tot het blok om te lezen of te schrijven, controleert de hardware de aanwezigheid ervan via het aanwezigheidsbit (pbit) in de descriptor.

Een pbit van 1 geeft de aanwezigheid van het blok aan. In dit geval kan het blok worden benaderd via het fysieke adres in de descriptor. Als de pbit nul is, wordt een interrupt gegenereerd voor de MCP (operating system) om het blok aanwezig te maken. Als het adresveld nul is, is dit de eerste toegang tot dit blok, en wordt het toegewezen (een init pbit). Als het adresveld niet nul is, is het een schijfadres van het blok, dat eerder is uitgerold, dus het blok wordt opgehaald van schijf en de pbit wordt op één gezet en het fysieke geheugenadres wordt bijgewerkt om naar het blok in het geheugen te wijzen (een andere pbit). Dit maakt descriptors gelijkwaardig aan een page-table entry in een MMU systeem. De systeemprestaties kunnen worden gecontroleerd aan de hand van het aantal pbits. Init pbits geven initiële allocaties aan, maar een hoog niveau van andere pbits geeft aan dat het systeem misschien aan het thrashen is.

Alle geheugen allocatie is daarom volledig automatisch (een van de kenmerken van moderne systemen) en er is geen andere manier om blokken toe te wijzen dan dit mechanisme. Er zijn geen calls als malloc of dealloc, omdat geheugenblokken ook automatisch worden weggegooid. Het schema is ook lui, omdat een blok pas wordt gealloceerd als er daadwerkelijk naar wordt verwezen. Wanneer het geheugen bijna vol is, onderzoekt de MCP de werkset, probeert te verdichten (omdat het systeem gesegmenteerd is, niet paged), dealloceert alleen-lezen segmenten (zoals code-segmenten die kunnen worden hersteld vanaf hun oorspronkelijke kopie) en, als laatste redmiddel, rolt vuile datasegmenten uit naar schijf.

Een andere manier waarop de B5000 een functie van een MMU biedt, is in de bescherming. Omdat alle toegangen via de descriptor lopen, kan de hardware controleren of alle toegangen binnen de grenzen vallen en, in het geval van een schrijfopdracht, of het proces schrijfrechten heeft. Het MCP-systeem is inherent veilig en heeft dus geen MMU nodig om dit niveau van geheugenbescherming te bieden. Descriptors zijn alleen leesbaar voor gebruikersprocessen en mogen alleen door het systeem (hardware of MCP) worden bijgewerkt. (Woorden met een tag van een oneven getal zijn alleen-lezen; descriptors hebben een tag van 5 en codewoorden hebben een tag van 3.)

Blokken kunnen worden gedeeld tussen processen via kopieer-descriptors in de proces-stack. Sommige processen kunnen dus schrijfrechten hebben, terwijl andere die niet hebben. Een code-segment is alleen-lezen, dus reentrant en gedeeld tussen processen. Kopieer-descriptoren bevatten een 20-bits adresveld dat de index geeft van de master-descriptor in de master-descriptor-array. Dit implementeert ook een zeer efficiënt en veilig IPC mechanisme. Blokken kunnen gemakkelijk worden verplaatst, omdat alleen de master descriptor hoeft te worden bijgewerkt wanneer de status van een blok verandert.

Het enige andere aspect is de prestatie – leveren MMU-gebaseerde of niet-MMU-gebaseerde systemen betere prestaties? MCP-systemen kunnen worden geïmplementeerd bovenop standaard hardware die wel een MMU heeft (bijvoorbeeld een standaard PC). Zelfs als de systeemimplementatie op de een of andere manier gebruik maakt van de MMU, zal dit op MCP-niveau helemaal niet zichtbaar zijn.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.