Fordítási "segédpuffer" (TLBs)

A processzor a leggyakrabban használt lapcímtár és lap táblázat bejegyzéseket a processzoron lévő cache-ben az úgynevezett "fordítási segédpufferben" (TLBs - Translation Lookaside Buffers; ezután csak TLB-k) tárolja. A P6 processzor család tagjai és Pentium processzoroknak külön TLB-i vannak adat és utasítás cache-re. Továbbá a P6 processzor család tagjai elkülönített TLB-ket tartanak fent a 4 KBájtos és 4 MBájtos méretű lapokra. A CPUID utasítást lehet arra használni, hogy lekérdezzük a TLB-k méretét a P6 illetve Pentium processzorokban. (Pontosan le lehet kérdezni, hogy milyen adat és milyen utasítás TLB van, hány bejegyzést tud tárolni a 4 KBájt illetve 4 MBájtos lapokra, sőt P6-tól a L2 cache méretét is lekérdezhetjük.)

A legtöbb lap címfordítás a TLB-ken keresztül történik. Csak akkor nyúl a fizikai memóriában található lapcímtár illetve lap táblázatokhoz a processzor, ha nem találja a TLB-kben a lapra (vagy lap táblázatra) mutató bejegyzést (azt a bejegyzést, ami a címfordításhoz szükséges).

A TLB-k nem hozzáférhető felhasználó programok illetve taszkok számára (0-tól eltérő privilégium szintű kód nem érheti el), így nem tudják érvényteleníteni a TLB-ket. Csak az operációs rendszer, a 0 privilégium szinten tudja érvényteleníteni a TLB-ket, illetve a kiválasztott TLB bejegyzéseket. Valahányszor megváltozik (még akkor is ha betöltött (P) flag = 0) a lapcímtár vagy a lap táblázat adott bejegyzése, akkor az operációs rendszernek érvénytelenítenie kell a megváltozott bejegyzéshez tartozó TLB bejegyzést, és az a következő hozzáféréskor (mármint a megváltozott bejegyzéshez való hozzáféréskor) lesz frissítve.

Az összes (nem globális) TLB-k automatikusan érvénytelenítődnek valahányszor a CR3 regiszterbe értéket töltünk. A CR3 regiszterbe az alábbi két módon tölthetünk új értéket:

  • Explicit módon, a MOV utasítást használva, pl:
    MOV CR3, EAX

    Ahol az EAX regiszter tartalmazza a megfelelő lapcímtár kezdőcímet.

  • Vagy implicit módon taszk váltás során, amikor automatikusan megváltozik a CR3 regiszter tartalma. (Az új taszk TSS-éből veszi a CR3 regiszter új értékét.)
Az INVLPG utasítás szolgál arra, hogy adott lap táblázat bejegyzést érvénytelenítsünk a TLB-ben. Általában ez az utasítás csak egy TLB bejegyzés érvénytelenítésére szolgál, de bizonyos esetekben, érvénytelenítheti nem csak a kiválasztott bejegyzést, sőt érvénytelenítheti akár az összes TLB-t. Ez az utasítás nem veszi figyelembe a lapcímtár illetve lap táblazat bejegyzéseiben a G (globális) flag állapotát, így azok is érvényteleníthetőek. (Lásd alább.)

A Pentium Pro processzortól kezdődően a PGE flag a CR4 regiszterben (PGE - globális lapok használatának engedélyezése) és a G (globális) flag a lapcímtár és lap táblázat bejegyzéseiben (8. bit) használható arra, hogy a legtöbbet használt lapok bejegyzései ne legyenek automatikusan érvénytelenítve a TLB-kben taszk váltás vagy a CR3 explicit megváltoztatása során. Amikor egy globális lap lapcímtár vagy lap táblázat bejegyzését a TLB-be tölti a processzor, akkor az meg nem határozható ideig marad ott. (Ezáltal esetlegesen foglalva a bejegyzés helyet a TLB-ben, amikor már nincs is rá szükség, vagy a bejegyzés jellemzőinek megváltozása miatt még fölöslegesen, hibásan érvényes.) Az egyetlen lehetőség, hogy érvénytelenítsük a globális lap bejegyzéseket a TLB-kben, hogy a PGE flaget vagy kikapcsoljuk és érvénytelenítjük a TLB-ket (akár explicit akár implicit módon), vagy használjuk az INVLPG utasítást a kívánt lapcímtár illetve lap táblázat bejegyzésekre (persze egyesével) a TLB-kben.

Fizikai címkiterjesztés

A fizikai címkiterjesztés (PAE - Phisical Address Extension) flag a CR4 regiszterben engedélyezi a 32 és 36 közötti címsínek használatát. (Ez csak a Pentium Pro-tól használható.) Így a processzor plusz 4 címsínnel rendelkezik, hogy hozzáilleszthetőek legyenek a plusz cím bitek. Ez a lehetőség csak akkor használható, ha a lapozás engedélyezett (ha mind a CR0-beli PG és a CR4-beli PAE flag bekapcsolt).

Amikor a fizikai címkiterjesztés (PAE) engedélyezett, akkor a processzor két lapméretet engedélyez: a 4 KBájtosat, illetve a 2 MBájtosat. Ugyanúgy ahogy a normál 32 bites címzésnél is használhatóak ugyanazok a lap táblázatok a különböző méretű lapok esetén (úgymint: a lapcímtár mutathat 2 MBájtos lapra, vagy a 4 KBájtos lapokat tartalmazó lap táblázatra). Ahhoz, hogy használható legyen a 36 bites fizikai címzés az alábbi módosításokat kellett elvégezni a lapozó adatstruktúrákban:

  • A lapozó táblázatok (lapcímtár és lap táblázat) bejegyzései 64 bit hosszúságúra lettek növelve, hogy elférjenek a hosszabb 36 bites címek. Így minden 4 KBájtos lapcímtár és lap táblázat csak feleannyi, az-az 512 bejegyzést tartalmazhat. (32 bites bejegyzésekből 1024, és most a 64 bites bejegyzésekből pedig 512 darabot.)
  • Egy új táblát, az úgynevezett lapcímtár mutató táblát (PDPT - Page-Directory-Pointer Table) adtak a lineáris címfordítási hierarchiához. Ennek a táblának 4, 64 bites bejegyzése van. Ez a tábla a lapcímtár alatt helyezkedik el a hierarchiában, így ez - mint nevéből is adódik - 4 különböző lapcímtárra mutat (ha PAE flag bekapcsolt).
  • A 20 bites lapcímtár kezdőcím a CR3-ban (PDBR-ben) egy nagyobb, 27 bites lapcímtár mutató tábla kezdőcímre lett lecserélve. (Így a CR3 regisztert, pontosabban annak ezen részét már PDPTR regiszternek nevezzük.) Így a PDPTR regiszter (az a 27 bit) a lapcímtár mutató tábla fizikai kezdőcímének felső 27 bitét adja, emiatt a kezdőcímet 32 bájtos határra kell igazítani.
  • A lineáris címfordítás protokollja úgy változott meg, hogy engedi a 32 bites lineáris címet a nagyobb, - P6 család processzorainál 36 bit - méretű fizikai címre leképezni.
A CR3 regiszter felépítése, ha a PAE flag, az-az a fizikai címkiterjesztés engedélyezett a CR4 regiszterben:

A CR3 regiszter felépítése, amikor a fizikai címkiterjesztés engedélyezett

Lineáris címfordítás fizikai címkiterjesztés és 4 KBájtos lapok esetén

Az alábbi ábra bemutatja a lapcímtár mutató táblázat (PDPT - Page-Directory-Pointer Table), a lapcímtár (PD - Page-Directory) és a lap táblázat (PT - Page-Table) hierarchiát, amikor 4 KBájtos lapokkal fedjük le a lineáris címtartományt, a fizikai címkiterjesztés esetén (PAE bekapcsolt). Ez a lapozási struktúra is 220-on lapot használ, és lefedi mind a 232-en bájt az-az 4 GBájt lineáris címtartományt.

Lineáris címfordítás, amikor a fizikai címkiterjesztés engedélyezett (4 KBájtos lapok)

Ahhoz, hogy kiválaszthassuk a megfelelő bejegyzéseket, a lineáris cím az alábbi három részre oszlik:

  • Lapcímtár mutató táblázat bejegyzés (PDPTE) - A lineáris 32 bites cím: 30-tól 31-ig vett bitei (a felső két bit). Ez a két bit egy ofszetet szolgáltat, kiválasztja a 4 bejegyzés közül az egyiket a PDP táblában. A kiválasztott bejegyzésben található kezdőcím szolgáltatja a lapcímtár fizikai kezdőcímét.
  • Lapcímtár bejegyzés (PDE) - A lineáris 32 bites cím: 21-től 29-ig vett bitei (9 bit). Ez egy ofszet (index) a lapcímtár egyik bejegyzésére, a kiválasztott bejegyzés adja meg a fizikai kezdőcímét a lap táblázatnak (a lapcímtár ezen bejegyzés által kiválasztott lap táblázatát adja meg). (Ne legyen megtévesztő, csak 9 bites az ofszet, hisz a 64 bites bejegyzések miatt csak 512 bejegyzés közül kell választani. És 29-en pont 512.)
  • Lap táblázat bejegyzés (PTE) - A lineáris 32 bites cím: 12-től 20-ig vett bitei (9 bit). Ez egy ofszet (index) a kiválasztott lap táblázat egyik bejegyzésére, a kiválasztott bejegyzés adja meg a fizikai kezdőcímét az elérni kívánt lapnak. (Itt is csak 9 bites az ofszet, hisz 512 bejegyzés van.)
  • Lap ofszet - A lineáris 32 bites cím: alsó 12 bite (0-tól 11-ig vett bitek). Ez adja meg egy lapon belül az elérni kívánt bájt ofszetjét.

Lineáris címfordítás fizikai címkiterjesztés és 2 MBájtos lapok esetén

Az alábbi ábra bemutatja, hogy hogyan lehet a lapcímtár mutató táblázattal, illetve a lapcímtárral lefedni a - 32 bites - lineáris címtartományt 2 MBájtos lapokkal. Ez a lapozási struktúra 2048 lapot használ (4 * 512), és lefedi az egész 4 GBájt lineáris címtartományt.

2 MBájtos lapokat úgy használhatunk, ha a CR4 regiszterben a PSE (Page Size Extension - lap méret kiterjesztés) flag és a lapcímtár bejegyzés PS flagje is bekapcsolt. (Feltéve, hogy a PAE eleve bekapcsolt.) Amikor így használjuk a vezérlő flageket (CR4) és a bejegyzés PS flagjét (tehát egyaránt bekapcsoltak), akkor a lineáris cím az alábbi három részre oszlik (lásd alább az ábrát):

  • Lapcímtár mutató táblázat bejegyzés (PDPTE) - A lineáris 32 bites cím: 30-tól 31-ig vett bitei (a felső két bit). Ez a két bit egy ofszetet szolgáltat, kiválasztja a 4 bejegyzés közül az egyiket a PDP táblában. A kiválasztott bejegyzésben található kezdőcím szolgáltatja a lapcímtár fizikai kezdőcímét.
  • Lapcímtár bejegyzés (PDE) - A lineáris 32 bites cím: 21-től 29-ig vett bitei (9 bit). Ez egy ofszet (index) a lapcímtár egyik bejegyzésére, a kiválasztott bejegyzés adja meg a fizikai kezdőcímét az elérni kívánt 2 MBájtos lapnak.
  • Lap ofszet - A lineáris 32 bites cím: alsó 21 bite (0-tól 20-ig vett bitek). Ez adja meg egy lapon belül az elérni kívánt bájt ofszetjét.
A címfordítást 2 MBájtos lapok esetén:

Lineáris címfordítás, amikor a fizikai címkiterjesztés engedélyezett (2 MBájtos lapok)

A 36 bites fizikai címtartomány elérése a kiterjesztett lap táblázat struktúrával

Az előző két részben leírt lap táblázat struktúrák megengedik egy időben egészen 4 GBájtnyi fizikai címterület használatát a 64 GBájtból. (Tehát, egyszerre csak 4 GBájt használható a 64 Gbájtból. (P6+)) A fizikai memória további 4 GBájtos részleteit az alábbi két trükkel érhetjük el.

  • A CR3, pontosabban a PDPTR regisztert kell átírnunk, hogy más lapcímtár mutató táblázatra mutasson, mely más lapcímtárakkal illetve lap táblázatokkal rendelkezik, így más fizikai memória területet fedhet le.
  • Vagy a lapcímtár mutató táblázat bejegyzéseit is megváltoztathatjuk, hogy más lapcímtárakra illetve az más lap táblázatokra mutasson így fedve le más fizikai memória területet.
A kettő lehetőség között jelentős különbség van, s véleményem szerint az első a könnyebben kezelhető megoldás a multitaszkos operációsrendszerek számára.

A lapcímtár és lap táblázat bejegyzései kiterjesztett fizikai címzés esetén

Az alábbi ábra mutatja a lapcímtár mutató táblázat, a lapcímtár és lap táblázat bejegyzéseinek felépítését, amikor a (36 bites) fizikai címkiterjesztés engedélyezett és 4 KBájtos lapokat használunk. Az összes bejegyzésben használt flag tulajdonsága és funkciója megegyezik a "Lapcímtár és lap táblázat bejegyzéseinek felépítése" részben elmondottakkal, az alábbi jelentős kivételekkel:

  • Egy új táblázat, a lapcímtár mutató táblázat található a lapozási hierarchiában.
  • A tábla bejegyzések mérete 64 bitre növekedtek a 32-ről.
  • Az előző pont által, a maximális bejegyzések száma egy lapcímtárban illetve egy lap táblázatban a felére, 512-re csökkent.
  • Továbbá a bejegyzésekben a fizikai kezdőcím 24 bitre növekedett (a 20-ról).
Az ábra, az új felépítésű bejegyzésekről:

A lapcímtár mutató táblázat, a lapcímtár és a lap táblázat bejegyzéseinek felépítése 4 KBájtos lapok és fizikai címkiterjesztés engedélyezése esetén

A fizikai kezdőcím egy bejegyzésben meghatározza az alábbiakat, a bejegyzés típusától függően:

  • Lapcímtár mutató táblázat bejegyzés (PDPTE) - a 4 KBájtos lapcímtár első bájtjának fizikai címe.
  • Lapcímtár bejegyzés (PDE) - a 4 KBájtos lap táblázat, vagy a 2 MBájtos lap első bájtjának fizikai címe.
  • Lap táblázat bejegyzés -a 4 KBájtos lap első bájtjának fizikai címe.
Minden táblázat bejegyzéseiben (kivéve azon lapcímtár bejegyzést, mely 2 MBájtos lapra mutat) a lap kezdőcíme a 36 bites fizikai cím felső 24 bitét adja, így a lapokat 4 KBájtos határra kell igazítani. Amikor a lapcímtár 2 MBájtos lapra mutat, a lap kezdőcíme a 36 bites fizikai cím felső 15 bitét adja, így a 2 MBájtos lapokat 2 MBájtos határra kell igazítani. Így más a lapcímtár bejegyzés felépítése 2 MBájtos lapokra, lássuk az ábrát:

A lapcímtár mutató táblázat és a lapcímtár bejegyzéseinek felépítése 2 MBájtos lapok és fizikai címkiterjesztés engedélyezése esetén

A lapcímtár mutató táblázat bejegyzéseiben (mind a 4-ben !) a betöltött (P - Present; 0. bit ) flagnek bekapcsoltnak kell lennie ha PAE (fizikai címkiterjesztés) és PG flagek (paging - lapozás) bekapcsoltak. Amennyiben nem mind a 4 lapcímtár mutató táblázat bejegyzésben bekapcsolt a P flag akkor, általános védelmi hiba kivételt generál (#GP) a processzor.

A lapcímtár bejegyzés 7. bite, a PS (lap méret) flag állapota dönti el, hogy a bejegyzés 2 MBájtos lapra, vagy 4 KBájtos lap táblázatra mutat -e. Ha ez a flag kikapcsolt, akkor lap táblázatra, ellenkező esetben a 2 MBájtos lapra mutat. Ez a flag engedélyezi ugyanazon lap táblázat rendszerben a 4 KBájtos és 2 MBájtos lapok keverését.

Az hozzáfért (A - access) és piszkos (D - dirty) flagek azon táblák bejegyzésit hozzák létre, melyek a lapokra mutatnak.

A 9-től 11-ig vett bitek a tábla bejegyzésekben (fizikai címkiterjesztés esetén) a rendszer szoftverek számára felhasználhatóak. (Ahogy egy előző részben tárgyaltuk, ha a betöltött (P) flag kikacsolt az egész bejegyzés felhasználható az operációs rendszer számára, csak itt a fizikai címkiterjesztés miatt nem 31 hanem már 63 bit használható fel.) A ábrákon fenntartottnak, 0-nak jelölt értékeket az operációs rendszernek 0-ra kell állítania, és nem szabad módosítania. Ugyanis a PSE és/vagy PAE (CR4) flagek engedélyezése esetén a processzor laphiba kivételt (#PF) generál, ha a lapcímtár vagy lap táblázat bejegyzéseiben a fenntartott bitek nem 0-ra állítottak. Továbbá ha a lapcímtár mutató táblázatban a fenntartott bitek nem nullára állítottak, akkor általános védelmi hiba kivételt (#GP) generál a processzor.

A szegmensek lapokba foglalása

A 32 bites, x86-os architektúra szegmentáló és a lapozásos mechanizmusa széles variációját nyújtja a memóriakezelésnek. Amikor a szegmentálás és a lapozás kombinálva van, a szegmensek számos módon foglalhatóak lapokba. Hogy egy sík (nem szegmentált) címzési modellt definiáljunk, pl. az összes kód, adat és verem modul leképezhető egy vagy több nagy szegmensbe (akár 4 GBájtig), melyek azonos lineáris címtartományt osztanak meg (lásd ábra). Itt a szegmensek lényegileg láthatatlanok mind az applikációk, s mind az operációs rendszer számára. Ha a lapozás használt, akkor a lapozó mechanizmus leképezhet egy teljes lineáris címtartományt (az egy szegmensbeli teljes lineáris címtartományt) a virtuális memóriába.

Vagy akár, minden program, taszk rendelkezhet saját, nagy lineáris címtartománnyal (saját szegmensében), amely leképezhető a virtuális memóriába saját lapcímtár illetve lap táblázatai által.

A szegmensek mérete lehet kisebb, mint a lapméret. Ha a lapméretnél kisebb szegmenst helyezünk olyan lapba, mely nincs megosztva más szegmenssel, akkor a fennmaradó memória terület elveszik. Pl. ha csak egy kis adat struktúrát, úgymint egy 1 bájtos rövideke szemafort helyezünk egyedül egy lapba, akkor lefoglalja maga az egész 4 KBájtot. Ha több - sok rövidke adatstruktúrát kell tárolnunk, akkor érdemesebb egy, több szegmenset magába foglaló lapba helyezni, elkerülve ezzel a memóriaveszteséget.

A 32 bites, x86-os architektúrájú processzorok nem követelnek meg összefüggést a lap és szegmens méret között. Egy lap tartalmazhat a benne lévő szegmens vége után egy másik szegmens kezdetét. Hasonlóan a szegmens vége elhelyezkedhet egy másik lap kezdetén.

A memória kezelő szoftverek lehetnek egyszerűbbek, és hatékonyabbak azáltal, hogy valamilyen igazítást végeznek a lap és szegmens méretére vonatkozóan. Pl. azon szegmenst mely elfér kb. egy lapban azt inkább egy lapban helyezi el, mint kettőben amikor több információt kellene tárolni a lapozás során (két lap, több tárolt információ, bonyolultabb jog és hozzáférés vizsgálat illetve regisztráció).

A másik előnye a lapozás és szegmentálás kombinálásának, hogy egyszerűsödik a memória kezelő szoftver feladata azáltal, hogy minden szegmens saját lap táblázatot kap, és így a lap táblázatokhoz tartozó egy lapcímtár bejegyzés által kézben tartható az egész szegmens jog illetve hozzáférés, és egyéb jellemzők viszonya.

(Tehát egy lapcímtár bejegyzéssel akár megállapíthatjuk, hogy írtak -e az egész szegmensbe, vagy ezen egy bejegyzéssel a háttértárolóra kilapozhatjuk az egész szegmenset, stb.) Ezen megvalósítás sematikus ábrája:

Minden szegmenshez külön lap táblázatot biztosít a memória szervező szoftver