Käänteisellä sivutaululla on se hyvä puoli että pienellä fyysisellä osoitteen leveydellä saadaan suuri (lineaarinen?)muistiavaruus toki saantiajan kustannuksella, koska tasoja voi ainakin teoriassa kejuttaa miten pitkälle hyvänsä. Muistelen joskus TTKK:lla pitäneeni aiheeseen liittyneitä harkkoja, joiden oleellinen sisältö vastasi tätä verkosta löytynyttä:
Operating Systems Homework 4
.. paitsi että tosimaailmassa ne "normaalinpäiset" sivutaulut on hierarkisia, eikä niitä matalamman tason sivutauluja tarvitse olla ollenkaan läheskään kaikille osoitteille, vaan vain niille, mitä oikeasti käytetään (sekä melko pienelle määrälle ylimääräisiä, mutta tämä ylimääräisyys ei tunnu yhtään missään) ja käänteisen sivutaulun tilantarve-etu katoaa.
.. Eikä se vain katoa, vaan se tilaetu käytännössä kääntyy toisenpäiseksi, hierarkinen "normaalinpäinen" sivutaulu viekin yleensä VÄHEMMÄN tilaa, koska käänteisessä on overheadia siitä hajautustaulusta (mutta niiden lisäksi tarvii olla se "lopullinen kirjanpito" törmäyksien varalta), ja sen overhead on yleensä selvästi suurempi kuin monitasoisen sivutaulun overhead niistä monesta tasosta sekä niiden välisestä granulariteetista.
Tuo ykköstehtävä on tuossa todella typerä, koska olettaa ei-hierarkiset sivutaulut, joita ei käytetä käytännössä missään.
Surullista, että yliopistoissa tulee vastaan tällaisia olkiukkoon perustuvia opetuksia.
Tuolla Linusin kommentit kokonaisuudessaan:
PowerPC page tables (Greg Pfister; Linus Torvalds)
Miten nuo hierarkiat käytännössä menee x86lla:
386ssa (normaali 32-bittinen moodi nykyprossuillakin) sekä virtuaalimuistisivun että sivutaulun koko on 4 kiB, eli 12 alinta bittiä määrittelee osoitteen sivun sisällä. Kokonaisuudessaan sivutauluhierarkia on 2-tasoinen, ja kukin yksittäinen sivutaulu on kooltaan 1024 entryä, eli bitit 31-22 määrittelee ylemmän tason sivutaulun, ja bitit 21-12 määrittelee alemman tason sivutaulun.
Yksi entry ylemmän tason sivutaulussa siis vastaa 4 megaa virtuaalimuistiavaruutta.
Jos ohjelma esimerkiksi käyttää vain 16 megaa (peräkkäisissä virtuaaliosoitteissa olevaa) virtuaalimuistia, riittää että sen ylemmän tason sivutaulussa 4 entryä johtaa oikeaan olemassaolevaan alemman tason sivutauluun, eli sivutauluja tarvitaan yhteensä 5 kpl (ylemmän tason sivutaulu + 4 alemman tason sivutaulua), ei 1024 tai 1025 kappaletta. Loput 1020 entryä ylemmän tason sivutaulussa voi olla vaikka null-pointereita, kun niiden kohdalla on päällä bitti että sitä ei ole mapattu mihinkään. Tai ne voivat kaikki osoittaa samaan yhteen alemman tason sivutauluun jossa kaikki sivut on merkattu ettei ole mapattu mihinkään (tällöin sivutauluja tarvitaan yhteensä 6 kpl, ei 5 kpl).
Pentium Pro:ssa tuotiin PAE-moodi, jossa entryn koko tuplattiin neljästä kahdeksaan tavuun, jolloin sivutauluun mahtuu entryjä vain 512 kappaletta eli yhdeksän bitin edestä. Samalla saatiin kirjanpitoon lisää "no execute-bitti" sekä tuki 36-bittisille fyysisille osoitteille.
Tällöin sivutaulu muuttui kolmitasoiseksi, kun kukin sivutaulutaso vastasi yhdeksää bittiä virtuaaliosoitteessa, ja osoitteenmuunnos kuitenkin tarvitsi tehdä 20 virtuaaliosoitteen bitille.
x86-64ssa sivutaulun rakenne on kuten PAE-moodissa, mutta tasoja on tuotu yläpäähän lisää, jotta voidaan tukea 48-bittisiä osoitteita (36 bittiä muunnettavaa osoitetta).
X86-64lla bitit 20-12 on siis alin sivutaulutaso, 29-21 toiseksi alin, 38-30 kolmanneksi alin, 47-39 neljänneksi alin (tällä hetkellä ylin, tällä hetkellä vain 48-bittiset osoitteet ovat tuettuja millään x86-64-prosessorilla).
Tulevaisuudessa voidaan lisätä hierarkiaan jopa kaksi tasoa lisää, ja saada tuki täysille 64-bittisille osoitteille.
Lisäksi Pentiumista lähtien on ollut olemassa myös "big page"-moodi, jossa sivut ovat kooltaan 2 tai 4 megaa(riippuen siitä, ollaanko PAE-/x86-moodissa vai vanhassa 386-sivutaulumuodossa), ja alin sivutaulutaso puuttuu. Big page-moodissa 32-bittisessä tilassa ilman PAEta tosin sivutauluissa on sitten vain 1 taso eikä hierarkiaa. Big Page-moodia kuitenkin käytetään todella harvoin, esimerkiksi kuluttaja-windosilla ei tietääkseni koskaan mihinkään(tuettu vain pro-/server-/enterprise-versioissa, ja niissäkin vaatii säätöä), ja linuxillakin se pitää erikseen käsin säätää käyttöön ja ohjelman pitää niitä erikseen pyytää.
X86-64 toi myös 1 GiB-hugepage-moodin, jossa kaksi alinta tasoa on poistettu ja sivut ovat gigan kokoisia. Tällöinkin jäljellä on kahden tason verran sivutauluhierarkiaa nykyprossuilla. En tiedä, onko tätä moodia tuettu missään käyttiksessä.
big/huge page-moodit ei varsinaisesti ole koko prosesorin toimintatiloja, vaan ylemmän tason sivutauluentryssä on bitti, onko siinä pointteri seuraavan tason sivutauluun vai onko kyseessä big-/huge page jolloin siinä on pointteri suoraan siihen isoon sivuun.