A legtöbb modern rendszer a memóriát 4-64 KB méretű oldalakra osztja, gyakran lehetőség van 2 MB vagy 1 GB méretű úgynevezett hatalmas oldalak használatára (gyakran mindkét változat lehetséges). A lapfordításokat a TLB-ben (translation lookaside buffer) gyorsítótárazzák. Egyes rendszerek, főként a régebbi RISC-konstrukciók, csapdát állítanak az operációs rendszerbe, ha egy lapfordítás nem található a TLB-ben. A legtöbb rendszer hardver-alapú tree walker-t használ. A legtöbb rendszer lehetővé teszi az MMU kikapcsolását, de néhány rendszer letiltja az MMU-t, amikor az operációs rendszer kódjába csapdázik.
VAXEdit
A VAX oldalak 512 bájtosak, ami nagyon kicsi. Az operációs rendszer több oldalt is kezelhet úgy, mintha egyetlen nagyobb oldal lenne. Például a Linux a VAX-en nyolc oldalt csoportosít egybe. Így a rendszer úgy tekint a rendszerre, mintha 4 KB-os lapjai lennének. A VAX a memóriát négy fix célú, egyenként 1 GB méretű régióra osztja. Ezek a következők:
P0 terület Általános célú, folyamatonkénti memória, például halmazok számára. P1 tér (vagy vezérlési tér), amely szintén folyamatonkénti, és jellemzően az operációs rendszer által kezelt supervisor, végrehajtó, kernel, felhasználói stackek és egyéb folyamatonkénti vezérlési struktúrák számára használatos. S0 tér (vagy rendszerszintű tér), amely minden folyamat számára globális, és az operációs rendszer kódját és adatait tárolja, függetlenül attól, hogy ki van-e lapozva vagy sem, beleértve a laptáblákat is. S1 tér, amely nem használt és “a digitális számára fenntartott”.
A laptáblák nagy lineáris tömbök. Normális esetben ez nagyon pazarló lenne, amikor a címeket a lehetséges tartomány mindkét végén használják, de az alkalmazások laptáblája maga is a kernel lapozott memóriájában tárolódik. Így gyakorlatilag egy kétszintű fa van, ami lehetővé teszi az alkalmazások számára a ritkás memóriaelrendezést anélkül, hogy sok helyet pazarolnának a nem használt laptábla-bejegyzésekre. A VAX MMU nevezetessége, hogy hiányzik belőle a hozzáférési bit. A lapozást megvalósító operációs rendszereknek valamilyen módon emulálniuk kell a hozzáférési bitet, ha hatékonyan akarnak működni. Jellemzően az operációs rendszer periodikusan feloldja az oldalak leképezését, hogy a page-not-present hibák segítségével az operációs rendszer beállíthassa a accessed bitet.
ARMEdit
Az ARM architektúrán alapuló alkalmazásprocesszorok az ARM virtuális memóriarendszer architektúrája által meghatározott MMU-t valósítják meg. A jelenlegi architektúra PTE-ket definiál 4 KB-os és 64 KB-os oldalak, 1 MB-os szakaszok és 16 MB-os szuperszekciók leírására; a régebbi verziók egy 1 KB-os apró oldalt is definiáltak. Az ARM kétszintű laptáblát használ, ha 4 KB-os és 64 KB-os lapokat használ, vagy csak egyszintű laptáblát az 1 MB-os szakaszokhoz és a 16 MB-os szakaszokhoz.
A TLB frissítéseket a laptábla-sétáltató hardver automatikusan végzi. A PTE-k tartalmazzák a jogosultságon alapuló olvasási/írási hozzáférési engedélyt, a gyorsítótárazhatósági információkat, egy NX bitet és egy nem biztonságos bitet.
IBM System/360 Model 67, IBM System/370 és utódaiSzerkesztés
A 1965 augusztusában bemutatott IBM System/360 Model 67 tartalmazott egy MMU-t, az úgynevezett dinamikus címfordító (DAT) dobozt. Ennek az a szokatlan tulajdonsága, hogy a laptáblán kívül tárolja az elért és a piszkos biteket (az összes S/360 processzorhoz tartozó négy bites védelmi kulccsal együtt). Ezek inkább a fizikai memóriára, mint a virtuális memóriára utalnak, és speciális célú utasításokkal érhetők el. Ez csökkenti az operációs rendszer terheit, amelynek egyébként a hozzáférési és piszkos biteket a laptáblákból egy fizikailag orientáltabb adatstruktúrába kellene továbbítania. Ez megkönnyíti az OS-szintű virtualizálást, amelyet később paravirtualizálásnak neveztek el.
1972 augusztusától az IBM System/370 hasonló MMU-val rendelkezik, bár kezdetben csak 24 bites virtuális címtartományt támogatott a System/360 Model 67 32 bites virtuális címtartománya helyett. Emellett a laptáblán kívül tárolja az elért és a piszkos biteket. A System/370-XA architektúra 1983 elején 31 bitre bővítette a virtuális címtartományt, 2000-ben pedig bevezetésre került a 64 bites z/Architektúra, amelynek címtartománya 64 bitre bővült; ezek továbbra is a laptáblán kívül tárolják a hozzáférési és a piszkos biteket.
DEC AlphaEdit
A DEC Alpha processzor a memóriát 8 KB-os lapokra osztja. Egy TLB kihagyás után az alacsony szintű firmware gépi kód (itt PALcode-nak nevezzük) egy háromszintű, fa szerkezetű laptáblázatot jár be. A címek a következőképpen vannak lebontva: 21 bit nem használt, 10 bit a fa gyökérszintjének indexelésére, 10 bit a fa középső szintjének indexelésére, 10 bit a fa levélszintjének indexelésére, és 13 bit, amely módosítás nélkül átmegy a fizikai címre. A teljes olvasási/írási/kivitelezési jogosultsági bitek támogatottak.
MIPSEdit
A MIPS architektúra egytől 64 bejegyzésig támogatja a TLB-t. A TLB egytől 64 bejegyzésig terjed. A TLB-bejegyzések száma a CPU konfigurálásakor, a szintézis előtt konfigurálható. A TLB-bejegyzések kettősek. Minden TLB-bejegyzés egy virtuális lapszámot (VPN2) két lapkeretszám (PFN0 vagy PFN1) egyikéhez képez le, attól függően, hogy a virtuális cím legkisebb értékű bitje nem része a lapmaszknak. Ez a bit és a lapmaszk bitjei nem tárolódnak a VPN2-ben. Minden TLB-bejegyzésnek saját lapmérete van, amely 1 KB és 256 MB között tetszőleges érték lehet, négyszeres szorzatban. A TLB-bejegyzésben lévő minden PFN-nek van egy gyorsítótárazási attribútuma, egy piszkos és egy érvényes állapotbitje. Egy VPN2 rendelkezik egy globális státuszbittel és egy operációs rendszer által kijelölt azonosítóval, amely részt vesz a virtuális cím TLB-bejegyzés egyezésében, ha a globális státuszbit nullára van állítva. A PFN a fizikai címet a lapmaszk bitek nélkül tárolja.
A TLB feltöltési kivétel akkor keletkezik, ha a TLB-ben nincs olyan bejegyzés, amely megfelel a leképezett virtuális címnek. A TLB érvénytelen kivétel akkor keletkezik, ha van egyezés, de a bejegyzés érvénytelennek van jelölve. A TLB módosított kivétel akkor keletkezik, ha egy tárolási utasítás hivatkozik egy leképezett címre, és a megfelelő bejegyzés piszkos státusza nincs beállítva. Ha a TLB kivétel egy TLB kivétel, egy kettős hibás TLB kivétel feldolgozása során keletkezik, akkor az a saját kivételkezelőjéhez kerül továbbításra.
A MIPS32 és a MIPS32r2 32 bites virtuális címtartományt és legfeljebb 36 bites fizikai címtartományt támogat. A MIPS64 legfeljebb 64 bit virtuális címtartományt és legfeljebb 59 bit fizikai címtartományt támogat.
Sun 1Szerkesztés
Az eredeti Sun 1 egy egylapos számítógép, amely a Motorola 68000 mikroprocesszor köré épült és 1982-ben mutatták be. Tartalmazza az eredeti Sun 1 memóriakezelő egységet, amely címfordítást, memóriavédelmet, memóriamegosztást és memóriaelosztást biztosít a CPU-n futó több folyamat számára. A CPU minden hozzáférése a saját fedélzeti RAM-hoz, a külső Multibus memóriához, a fedélzeti I/O-hoz és a Multibus I/O-hoz az MMU-n keresztül történik, ahol a címfordítás és a védelem egységes módon történik. Az MMU hardveresen van implementálva a CPU lapkán.
Az MMU egy kontextusregiszterből, egy szegmenstérképből és egy laptérképből áll. A CPU virtuális címeit a szegmenstérkép fordítja le közbenső címekre, amelyeket viszont a laptérkép fordít le fizikai címekre. A lapméret 2 KB, a szegmensméret pedig 32 KB, ami szegmensenként 16 oldalt jelent. Egyidejűleg legfeljebb 16 kontextust lehet leképezni. Egy kontextus maximális logikai címtartománya 1024 oldal vagy 2 MB. Az egyidejűleg leképezhető maximális fizikai cím szintén 2 MB.
A kontextusregiszter azért fontos egy többfeladatos operációs rendszerben, mert lehetővé teszi a CPU számára, hogy az összes fordítási állapotinformáció újratöltése nélkül váltson a folyamatok között. A 4 bites kontextusregiszter a szegmenstérkép 16 szakasza között tud váltani a felügyelő vezérlése alatt, ami lehetővé teszi 16 kontextus egyidejű leképezését. Minden kontextusnak saját virtuális címtartománya van. A virtuális címtartomány megosztása és a kontextusok közötti kommunikáció úgy biztosítható, hogy ugyanazokat az értékeket írjuk be a különböző kontextusok szegmens- vagy laptérképébe. További kontextusokat úgy lehet kezelni, hogy a szegmenstérképet kontextus cache-ként kezeljük, és az elavult kontextusokat a legritkábban használtak alapján cseréljük le.
A kontextusregiszter nem tesz különbséget felhasználói és felügyelői állapotok között. A megszakítások és a csapdák nem váltanak kontextust, ami megköveteli, hogy minden érvényes megszakítási vektor mindig a kontextus 0. lapjára legyen leképezve, valamint az érvényes supervisor stack.
PowerPCEdit
A PowerPC G1, G2, G3 és G4 esetében az oldalak általában 4 KB-osak. Egy TLB kihagyás után a szabványos PowerPC MMU két egyidejű keresést kezd. Az egyik keresés a címet a négy vagy nyolc adatblokk-címfordító (DBAT) regiszter vagy a négy vagy nyolc utasításblokk-címfordító (IBAT) regiszter valamelyikével próbálja összevetni. A BAT regiszterek akár 256 MB méretű lineáris memóriakockákat is leképezhetnek, és általában az operációs rendszer használja őket a címtartomány nagy részeinek leképezésére az operációs rendszer magjának saját használatára. Ha a BAT keresés sikeres, a másik keresés leáll és figyelmen kívül hagyásra kerül.
A másik keresés, amelyet nem támogat közvetlenül minden processzor ebben a családban, egy úgynevezett “invertált laptáblán” keresztül történik, amely a TLB chipen kívüli kiterjesztéseként működik. Először a cím felső négy bitjét a 16 szegmensregiszter egyikének kiválasztására használják. Ezután a szegmensregiszterből 24 bit helyettesíti ezt a négy bitet, ami 52 bites címet eredményez. A szegmensregiszterek használata lehetővé teszi, hogy több folyamat használhassa ugyanazt a hash-táblát.
Az 52 bites cím hashelésre kerül, majd indexként szolgál a chipen kívüli táblázatban. Ott a nyolcoldalas tábla bejegyzéseiből álló csoportot átvizsgálják az egyezőt. Ha a túlzott hash-ütközések miatt egyik sem egyezik, a processzor egy kicsit más hash-függvénnyel próbálkozik újra. Ha ez is sikertelen, a CPU az operációs rendszerbe lép (letiltott MMU-val), hogy a probléma megoldódjon. Az operációs rendszernek el kell dobnia egy bejegyzést a hash-táblából, hogy helyet csináljon egy új bejegyzésnek. Az operációs rendszer létrehozhatja az új bejegyzést egy normálisabb, fa-szerű laptáblából vagy a leképezésenkénti adatstruktúrákból, amelyek valószínűleg lassabbak és helytakarékosabbak. A végrehajtás nélküli vezérlés támogatása a szegmensregiszterekben van, ami 256 MB-os granularitást eredményez.
Ezzel a kialakítással kapcsolatos fő probléma a hash-funkció által okozott rossz gyorsítótárhelyzet. A fa alapú kialakítások ezt úgy kerülik el, hogy a szomszédos oldalak laptábla-bejegyzéseit szomszédos helyekre helyezik. A PowerPC-n futó operációs rendszer minimalizálhatja a hash-tábla méretét, hogy csökkentse ezt a problémát.
Egy folyamat laptábla bejegyzéseinek eltávolítása is kissé lassú. Az operációs rendszer elkerülheti a szegmensértékek újrafelhasználását, hogy késleltesse az ezzel való szembenézést, vagy választhatja a folyamatonkénti hash-táblákkal járó memóriapazarlás elszenvedését. A G1 lapkák nem keresik a laptábla bejegyzéseit, de létrehozzák a hash-t, azzal az elvárással, hogy az operációs rendszer szoftveresen keresse meg a szabványos hash-táblát. Az operációs rendszer írhat a TLB-be. A G2, G3 és a korai G4 lapkák hardveresen keresik a hash-táblát. A legújabb chipek lehetővé teszik, hogy az operációs rendszer bármelyik módszert választhassa. Azokon a chipeken, amelyek ezt opcionálissá teszik, vagy egyáltalán nem támogatják, az operációs rendszer választhatja, hogy kizárólag a fa alapú laptáblát használja.
IA-32 / x86Edit
Az x86 architektúra nagyon hosszú idő alatt fejlődött, miközben a teljes szoftverkompatibilitás megmaradt, még az operációs rendszer kódja számára is. Így az MMU rendkívül összetett, sokféle lehetséges működési móddal. Itt a hagyományos 80386-os CPU és utódainak (IA-32) normál működését ismertetjük.
A CPU a memóriát elsősorban 4 KB-os oldalakra osztja. A régebbi 8088-as és 80286-os MMU-k kialakításánál alapvető fontosságú szegmensregisztereket a modern operációs rendszerek nem használják, egyetlen fontos kivételtől eltekintve: az alkalmazások szálspecifikus adatainak vagy az operációs rendszermagok CPU-specifikus adatainak elérésétől, ami az FS és GS szegmensregiszterek explicit használatával történik. Minden memóriaelérés egy szegmensregisztert foglal magában, amelyet a végrehajtott kódnak megfelelően választanak ki. A szegmensregiszter egy táblázat indexeként működik, amely a virtuális címhez hozzáadandó eltolással szolgál. Az FS vagy GS használatának kivételével az operációs rendszer biztosítja, hogy az eltolás nulla legyen.
Az eltolás hozzáadása után a cím maszkolásra kerül, hogy ne legyen nagyobb 32 bitnél. Az eredményt egy fa szerkezetű laptáblán keresztül lehet megkeresni, a cím bitjeinek felosztása a következőképpen történik: 10 bit a fa ágához, 10 bit az ág leveleihez, és a 12 legalsó bitet közvetlenül az eredménybe másoljuk. Egyes operációs rendszerek, mint például az OpenBSD a W^X funkcióval és a Linux az Exec Shield vagy PaX foltokkal, a CS regiszter által meghatározott kódszegmens hosszát is korlátozhatják, hogy megtiltják a kód végrehajtását a címtartomány módosítható területein.
A Pentiummal bevezetett MMU kisebb módosításai lehetővé tették a nagyon nagy, 4 MB-os oldalakat a fa alsó szintjének kihagyásával (így 10 bit marad a laphierarchia első szintjének indexelésére, a maradék 10+12 bit pedig közvetlenül az eredménybe másolódik). A Pentium Pro-val bevezetett MMU kisebb módosításai bevezették a fizikai címbővítés (PAE) funkciót, amely lehetővé tette a 36 bites fizikai címek használatát, 2+9+9 bitet a háromszintű laptáblákhoz, és a legalsó 12 bitet közvetlenül az eredménybe másolták. Nagyméretű oldalak (2 MB) is elérhetők a fa alsó szintjének kihagyásával (ami 2+9 bitet eredményez a kétszintű táblahierarchia esetében, és a fennmaradó 9+12 legalsó bitet közvetlenül másolja az eredménybe). Ezen kívül a lap attribútumtáblája lehetővé tette a gyorsítótárazhatóság meghatározását néhány magas bit megkeresésével egy kis CPU-n belüli táblázatban.
A nem-kiadás támogatása eredetileg csak szegmensenként volt biztosítva, ami nagyon körülményessé tette a használatát. Az újabb x86-os chipek oldalankénti no-execute bitet biztosítanak a PAE módban. A fent leírt W^X, Exec Shield és PaX mechanizmusok a kódszegmens hosszának beállításával emulálják az NX bitet nem tartalmazó x86-os processzorok oldalankénti nem-kiadási támogatását, ami teljesítményveszteséggel és a rendelkezésre álló címtartomány csökkenésével jár.
x86-64Edit
Az x86-64 az x86 64 bites kiterjesztése, amely szinte teljesen megszünteti a szegmentálást a lapos memóriamodell javára, amelyet szinte minden operációs rendszer használ a 386-os vagy újabb processzorokhoz. Hosszú módban az FS és GS szegmensek kivételével minden szegmenseltolás figyelmen kívül marad. A 4 KB-os oldalak használata esetén a laptábla fája három helyett négyszintű.
A virtuális címek a következőképpen oszlanak meg: 16 bit kihasználatlanul, a fa négy szintjének egyenként kilenc bitje (összesen 36 bit), és a 12 legalsó bit közvetlenül az eredménybe másolva. A 2 MB-os oldalak esetén a laptáblának csak három szintje van, így összesen 27 bitet használunk a lapozásra és 21 bitet az eltolásra. Egyes újabb CPU-k támogatják az 1 GB-os lapozást is, két szintű lapozással és 30 bit eltolással.
A
CPUID segítségével meghatározható, hogy támogatott-e az 1 GB-os lapozás. Mindhárom esetben a 16 legmagasabb bitnek meg kell egyeznie a 48. bittel, vagy más szóval az alsó 48 bit előjeles kiterjesztése a magasabb bitekre. Ez azért történt, hogy lehetővé tegye a címezhető tartomány jövőbeli bővítését anélkül, hogy a visszafelé kompatibilitás sérülne. A laptábla minden szintjén a laptábla bejegyzése tartalmaz egy no-execute bitet.
Unisys MCP Systems (Burroughs B5000)Szerkesztés
A Burroughs B5000 1961-ből az első kereskedelmi rendszer, amely támogatta a virtuális memóriát (az Atlas után), bár nem rendelkezik MMU-val Az MMU két funkcióját – virtuális memóriacímek és memóriavédelem – más architektúrájú megközelítéssel biztosítja.
Először is, a virtuális memóriacímek leképezésében az MCP rendszerek MMU helyett leíró alapúak. Minden kiosztott memóriablokkhoz egy master deszkriptor tartozik, amely tartalmazza a blokk tulajdonságait (azaz méretét, címét és azt, hogy jelen van-e a memóriában). Amikor a blokkhoz olvasás vagy írás céljából hozzáférési kérelem érkezik, a hardver ellenőrzi a blokk jelenlétét a leíróban lévő jelenléti bit (pbit) segítségével.
Egy 1-es pbit a blokk jelenlétét jelzi. Ebben az esetben a blokk a leíróban szereplő fizikai címen keresztül érhető el. Ha a pbit nulla, akkor megszakítás generálódik az MCP (operációs rendszer) számára, hogy a blokk jelen legyen. Ha a cím mező nulla, akkor ez az első hozzáférés ehhez a blokkhoz, és a blokk kiosztásra kerül (init pbit). Ha a cím mező nem nulla, akkor ez a blokk lemezcíme, amely korábban már kigurult, így a blokkot a lemezről hozzuk le, a pbit-et pedig egyesre állítjuk, és a fizikai memóriacímet frissítjük, hogy a memóriában lévő blokkra mutasson (egy másik pbit). Ezáltal a leírók egy MMU rendszerben a laptábla bejegyzésével egyenértékűek. A rendszer teljesítménye a pbitek számán keresztül ellenőrizhető. Az init pbitek a kezdeti kiosztásokat jelzik, de az egyéb pbitek magas száma azt jelzi, hogy a rendszer esetleg thrashingben van.
A memória kiosztása tehát teljesen automatikus (ez a modern rendszerek egyik jellemzője), és a blokkok kiosztására nincs más mód, mint ez a mechanizmus. Nincs olyan hívás, mint malloc vagy dealloc, mivel a memóriablokkok is automatikusan eldobásra kerülnek. A rendszer ráadásul lusta, mivel egy blokk csak akkor kerül kiosztásra, ha ténylegesen hivatkoznak rá. Amikor a memória majdnem megtelt, az MCP megvizsgálja a munkakészletet, megpróbálja a tömörítést (mivel a rendszer szegmentált, nem pedig lapozott), a csak olvasható szegmensek (például az eredeti másolatból visszaállítható kódszegmensek) kiosztását, és végső megoldásként a piszkos adatsegmensek lemezre gördítését.
A B5000 egy másik módja az MMU funkciójának ellátásának a védelemben rejlik. Mivel minden hozzáférés a leírón keresztül történik, a hardver ellenőrizni tudja, hogy minden hozzáférés a határokon belül van-e, és írás esetén, hogy a folyamat rendelkezik-e írási jogosultsággal. Az MCP-rendszer eredendően biztonságos, ezért nincs szükség MMU-ra a memóriavédelem ezen szintjének biztosításához. A leírók a felhasználói folyamatok számára csak olvashatóak, és csak a rendszer (hardver vagy MCP) frissítheti őket. (Azok a szavak, amelyek címkéje páratlan számú, csak olvashatóak; a leírók címkéje 5, a kódszavaké pedig 3.)
A blokkok a processz veremben lévő másolási leírókon keresztül megoszthatók a folyamatok között. Így egyes folyamatok írási jogosultsággal rendelkezhetnek, míg mások nem. Egy kódszegmens csak olvasható, tehát reentráns és megosztott a folyamatok között. A másolási leírók tartalmaznak egy 20 bites címmezőt, amely megadja a mester leíró indexét a mester leíró tömbben. Ez egy nagyon hatékony és biztonságos IPC mechanizmust is megvalósít. A blokkok könnyen áthelyezhetők, mivel csak a master deszkriptort kell frissíteni, amikor egy blokk állapota megváltozik.
Az egyetlen másik szempont a teljesítmény – az MMU-alapú vagy a nem MMU-alapú rendszerek nyújtanak jobb teljesítményt? Az MCP-rendszerek megvalósíthatók olyan szabványos hardveren, amely rendelkezik MMU-val (például egy szabványos PC). Még ha a rendszer megvalósítása valamilyen módon használja is az MMU-t, ez egyáltalán nem lesz látható az MCP szintjén.