VIRTUELNA MEMORIJA
==================

(ovaj fajl sadrzi beleske sa predavanja, za vise detalja pogledati
 Dandamudi 735-760, Tanenbaum 428-450, Hamacher, 305-310).

*) MOTIVACIJA ZA UPOTREBU VIRTUELNE MEMORIJE

 Prve generacije elektronskih racunara su memoriju adresirale
 direktno, tj. adresa koju program koristi kao operand u instrukciji
 se zaista postavlja na adresnu magistralu i koristi se kao fizicka
 adresa u memoriji (slicno je i sa vrednoscu PC registra koja se
 direktno koristi kao fizicka adresa instrukcije). Ovaj pristup je bio
 prihvatljiv kada su racunari izvrsavali samo jedan program koji je
 koristio celu memoriju. Sa pojavom prvih operativnih sistema,
 omoguceno je da se vise programa istovremeno nalaze u memoriji i
 izvrsavaju se na procesoru (pomocu deljenja vremena). Na ovaj nacin
 omoguceno je da se procesor efikasnije koristi (jer dok jedan program
 ceka na ulazno-izlaznu operaciju, drugi program moze da koristi
 procesor). Medjutim, ovo je dovelo do novih problema kada je u
 pitanju kontrola upotrebe memorije:

 -) Veci broj programa zahtevaju vise memorije. Ovo znaci da programi
    ne mogu celi da se ucitaju u memoriju, jer nema dovoljno mesta.
    Zbog toga su programi dobijali malu zonu memorije u koju su morali
    da se uklope. Ukoliko je program prevazilazi velicinu tog
    prostora, tada je programer sam morao da svoj program podeli na
    vise delova koji se mogu nezavisno ucitavati u memoriju
    (tzv. overlay tehnika). Ovo je bilo mukotrpno za programere i
    podlozno greskama. Dakle, javila se potreba da se ovaj postupak
    automatizuje od strane operativnog sistema, a da bude potpuno
    nevidljiv za programera koji ne bi trebalo time da se bavi.

 -) Veci broj programa u memoriji moze dovesti do konflikta, jer jedan
    program moze (slucajno ili namerno) da pristupi adresama u
    memoriji koje su dodeljene drugom programu. S obzirom da se u
    istoj memoriji nalazi i operativni sistem, pristup adresama koje
    pripadaju operativnom sistemu moze potencijalno predstavljati i
    funkcionalni, ali i bezbednosni problem.

 -) S obzirom da programi u svojim instrukcijama koriste fizicke
    adrese podataka i drugih instrukcija, ukoliko su te adrese
    izrazene kao apsolutne, tada se program uvek mora ucitavati pocev
    od iste adrese u memoriji. Ovo znaci da prilikom ucitavanja vise
    programa u memoriju oni moraju biti napisani tako da se adrese
    koje koriste ne preklapaju; u suprotnom, nece moci da
    koegzistiraju u memoriji. Resenje je u relativnom adresiranju
    (tzv. position-independant-code (PIC)) ali ovo nije uvek moguce
    ostvariti.

 -) S obzirom da programi po pravilu zauzimaju blokove susednih adresa
    u memoriji (instrukcije su uvek na susednim adresama, a najcesce i
    podaci), prilikom njihovog ucitavanja moramo ih smestati u
    neprekidne segmente u memoriji. Kako se koji program ucitava, tako
    mu se dodeljuje sledeci blok susednih adresa u memoriji. Kada se
    neki program zavrsi, tada se on brise iz memorije, a odgovarajuci
    blok memorije ostaje upraznjen. Na ovaj nacin vremenom dolazi do
    FRAGMENTACIJE: moze se, na primer, dogoditi da ukupno gledano
    imamo dovoljno slobodnog prostora za ucitavanje nekog programa,
    ali ga nemamo "u komadu".

 Svi ovi problemi se prilicno elegantno i efikasno resavaju
 koriscenjem tehnike virtuelne memorije.

*) PRINCIP RADA VIRTUELNE MEMORIJE

 Implementacija virtuelne memorije zahteva kako hardversku, tako i
 softversku podrsku (od strane operativnog sistema). Virtuelna
 memorija podrazumeva da svaki program ima sopstveni virtuelni adresni
 prostor fiksirane velicine. Velicina virtuelnog adresnog prostora ne
 mora da odgovara velicini fizicke memorije (najcesce ne
 odgovara). Svaki program misli da je sam na tom racunaru i da je sva
 njemu vidljiva virtuelna memorija njegova. U instrukcijama, prilikom
 adresiranja, program koristi virtuelne adrese. Takodje, PC registar
 sadrzi virtuelnu adresu tekuce instrukcije koja se izvrsava. Program
 uopste nije svestan postojanja fizicke memorije i fizickih adresa.

 Neki delovi programa (instrukcija i podataka) ce zaista biti prisutni
 u fizickoj memoriji. Drugi delovi ce biti prisutni na disku, ali ne i
 u operativnoj memoriji. Kada program zahteva pristup nekoj virtuelnoj
 adresi, operativni sistem ce proveriti da li se odgovarajuci podatak
 nalazi na nekoj fizickoj adresi. Ako je odgovor potvrdan, izvrsice se
 prevodjenje iz virtuelne u fizicku adresu (ovo se odvija hardverski,
 u procesoru, ali uz pomoc struktura podataka koje inicijalizuje i
 odrzava operativni sistem). Nakon toga ce se dobijena fizicka adresa
 postaviti na adresnu magistralu i pristupice se trazenom podatku.
 Ukoliko se ispostavi da trazeni podatak nije u fizickoj memoriji,
 tada se on dohvata sa diska, smesta se u operativnu memoriju,
 azuriraju se strukture podataka operativnog sistema koje mapiraju
 fizicke i virtuelne adrese i zatim se odgovarajuca fizicka adresa
 postavlja na adresnu magistralu da bi se dohvatio podatak. Ceo ovaj
 proces je potpuno nevidljiv za program.

 Posledice ovakve organizacije su:

 -) Program moze imati znatno vecu virtuelnu memoriju na raspolaganju
    nego sto ima fizicke memorije. Npr. na 32-bitnim Intel-ovim
    procesorima velicina virtuelnog adresnog prostora svakog programa
    bila je 2^32, tj. 4GB. U vreme kada su ovi procesori bili
    aktuelni, vecina korisnika nije imalo 4GB RAM-a instalirano na
    racunaru. Uz pomoc diska, bilo je moguce da samo neki delovi
    programa budu zaista u memoriji, cime je veliki broj programa
    mogao da koegzistira u memoriji (naravno, veliki broj programa je
    dovodio do prevelikog koriscenja diska, sto je svakako znacajno
    usporavalo rad racunara). Pritom, programeri nisu morali da se
    bave organizacijom memorije -- za programera postoji samo njegov
    privatni virtuelni adresni prostor velicine 4GB.

 -) Koriscenje odvojenih virtuelnih adresnih prostora je omogucilo
    izolaciju programa i sprecavanje da jedan program pristupi
    podacima drugog (ili operativnog sistema). Ovo je doprinelo
    bezbednosti i smanjilo je broj fatalnih gresaka.

 -) Program se uvek moze ucitavati na isto mesto u svom virtuelnom
    adresnom prostoru, s obzirom da je on uvek jedini program u tom
    prostoru. Otuda nije problem koristiti apsolutne (virtuelne)
    adrese. Problemi sa apsolutnim adresama nastaju samo ako vise
    programa koriste iste delove koda (npr. deljene biblioteke), kada
    se isti kod mapira u virtuelne adresne prostore vise programa.
    Zbog toga je za pisanje deljenih biblioteka neophodno voditi
    racuna o tome da kod bude nezavisan od pozicije (PIC kod). U
    moderno vreme, o tome obicno brinu kompajleri.

 -) Funkcija prevodjenja virtuelnih u fizicke adrese ne mora biti (i
    obicno nije) linearna. Ovo znaci da susedne lokacije u virtuelnoj
    memoriju ne moraju biti susedne i u fizickoj. Ovo eliminise
    problem fragmentacije, jer program u fizickoj memoriji ne mora
    zauzimati neprekidan blok (iako u virtuelnoj zauzima susedne
    adrese).

*) NACIN ORGANIZACIJE VIRTUELNE MEMORIJE

 Najcesci nacin realizacije virtuelne memorije je tehnika STRANICENJA
 (engl. paging).  Virtuelni adresni prostor podeljen je na STRANICE
 (engl. pages) jednake velicine. Na primer, na 32-bitnim Intel-ovim
 procesorima stranice su bile velicine 4KB (2^12 bajtova). S obzirom
 da je virtuelni adresni prostor bio 32-bitni (4GB), to znaci da se on
 sastojao iz 2^20 stranica.

 Fizicka memorija je takodje podeljena na OKVIRE (engl. page frames)
 iste velicine (4KB kod Intel-a). Intel-ova arhitektura je u vreme
 Pentium procesora imala fizicki adresni prostor koji je takodje bio
 velicine 4GB, ali je vec kod PentiumPro procesora taj fizicki adresni
 prostor uvecan na 64GB (36-bitne fizicke adrese). Ovaj rezim se
 obicno naziva PAE (physical address extension) i ukljucuje se
 posebnim bitom u kontrolnom registru procesora. Mi cemo se u nastavku
 fokusirati na osnovni slucaj kada je fizicki adresni prostor takodje
 32-bitni.

 Virtuelna (32bitna) adresa se sada moze logicki podeliti na sledeci
 nacin:
  
      _____________________________
     |  BROJ STRANICE  |  POMERAJ  |
      -----------------------------
            20 bita       12 bita

 Ovu adresu je potrebno prevesti u fizicku adresu (32-bitnu u nasem
 primeru):

      _____________________________
     |  BROJ OKVIRA    |  POMERAJ  |
      -----------------------------
            20 bita       12 bita
   
 Ovo se postize pomocu TABELE STRANICA (Page Table). Ova tabela se
 sastoji iz STAVKI (Page Table Entry (PTE)). Za svaku stranicu postoji
 jedna stavka (ukupno 2^20 stavki u nasem primeru). Otuda se broj
 stranice koristi kao indeks u ovoj tabeli. Tabela stranice se takodje
 nalazi u fizickoj memoriji, a njena adresa se cuva u posebnom
 registru procesora (koji se inicijalizuje od strane operativnog
 sistema i deo je podataka o programu koji se izvrsava; svaki program
 koji se izvrsava ima svoju tabelu stranica koja se cuva u memoriji, a
 prilikom zamene programa koji se izvrsava menja se i vrednost ovog
 registra, tako sto se u njega ucitava adresa tabele stranica programa
 koji treba da nastavi sa izvrsavanjem).

 Svaka PTE stavka sadrzi broj okvira fizicke memorije u kom se nalazi
 stranica, ukoliko je stranica zaista u fizickoj memoriji. U
 suprotnom, PTE stavka sadrzi informaciju da stranica nije u
 memoriji. Pored toga, PTE stavka sadrzi i dodatne bitove koji mogu
 blize odredjivati nacin koriscenja ove stranice (npr. da li je
 stranica samo za citanje, ako npr. sadrzi instrukcije, ili se u nju
 moze i pisati, da li je koriscena od kako je ucitana u fizicku
 memoriju, da li je modifikovana, i sl.). Prilikom pristupa virtuelnoj
 adresi, procesor automatski pronalazi stavku u tabeli
 stranica. Ukoliko je stranica prisutna u RAM-u, tada se broj okvira i
 pomeraj kombinuju u fizicku adresu i salju se na adresnu
 magistralu. U suprotnom, dolazi do izuzetka koji se naziva GRESKA
 STRANICE (engl. page fault). Ovaj izuzetak automatski pokrece
 izvrsavanje funkcije za obradu prekida operativnog sistema koji
 odlazi na disk, ucitava odgovarajucu stranicu sa diska u RAM, azurira
 tabelu stranica i vraca kontrolu programu, pri cemu se instrukcija
 koja je izazvala izuzetak ponovo pokrece. Ovog puta, stranica je u
 memoriji.

 Stranice programa koje sadrze instrukcije se svakako nalaze i na
 disku (kao deo odgovarajuceg izvrsnog fajla), odakle se po potrebi
 mogu ucitavati. Stranice koje odgovaraju drugim zonama virtuelne
 memorije (stek, hip) koje dinamicki rastu se inicijalno alociraju u
 okvirima u RAM-u, po potrebi. Medjutim, kada se RAM popuni (ne
 zaboravimo da u njega smestamo stranice svih programa koji rade na
 racunaru, ukljucujuci i sam operativni sistem), vise nije moguce
 alocirati nove okvire za stranice. Tada je neophodno izvrsiti ZAMENU
 STRANICA. Potrebno je neku od stranica izbaciti iz okvira u fizickoj
 memoriji, sacuvati je na disku, a okvir osloboditi za drugu stranicu
 kojoj zelimo da pristupimo. Kada nam stranica koju smo zamenili u
 nekom trenutku ponovo zatreba, ponovo cemo je ucitati sa diska u RAM
 (ne obavezno u isti okvir). Iz svega ovoga sledi da ce mnoge stranice
 istovremeno postojati i na disku i u RAM-u. Ako postoji u RAM-u,
 pristupamo joj iz RAM-a, a ako ne postoji, ucitavamo je sa diska u
 RAM, pa joj odatle pristupamo.  Ovo dosta lici na ono sto smo imali
 kod kes memorije -- tamo smo imali kopije istog kes bloka i u kesu i
 u RAM-u. Otuda se i ovde postavljaju ista pitanja kao i kod kesa:
 koja politika se koristi prilikom zamene stranica, kao i koja
 politika se koristi prilikom promene stranica?

 Prilikom zamene stranica koriste se slicni algoritmi kao kod kes
 memorija. Najcesce se koristi neka varijanta LRU strategije. Iako se
 ovde algoritam zamene implementira softverski, ipak nije moguce
 implementirati punu LRU strategiju, s ozbirom na veliki broj
 okvira. Zbog toga se i ovde primenjuje neka varijanta pseudo-LRU
 strategije: procesor najcesce odrzava informaciju o tome koje su
 stranice koriscene, a koje ne (postoji poseban bit u PTE stavkama
 koji tome sluzi). Stranice kod kojih je ovaj bit iskljucen se mogu
 smatrati stranicama koje se dugo ne koriste i neka od njih se moze
 izbaciti. Operativni sistem s vremena na vreme resetuje ove bitove.

 Kada su u pitanju politike pisanja, za razliku od kesa, ovde nema
 smisla koristiti politiku sa propustanjem (write-through), s obzirom
 da je razlika u brzini izmedju RAM memorije i hard diska jos
 drasticnija nego izmedju kesa i RAM-a: upis na disk pri svakoj
 promeni stranice znacio bi veliki gubitak na efikasnosti. Zbog toga
 se kod virtuelne memorije po pravilu koristi politika pisanja sa
 prepisivanjem (write-back): uz svaku stranicu se u PTE stavkama cuva
 i "prljavi bit" (dirty bit) koji procesor automatski azurira prilikom
 promene sadrzaja stranice u RAM-u. Prilikom zamene stranice, ako je
 bilo promena, stranica ce biti sacuvana na disku, a u suprotnom nece,
 jer je kopija koju vec imamo na disku azurna.

*) STRANICENJE NA VISE NIVOA

 Glavni problem sa gore opisanom organizacijom virtuelne memorije je u
 tome sto tabele stranica mogu biti prilicno velike. U gornjem
 primeru, imamo 2^20 stavki u tabeli stranica. Svaka stavka je na
 Intel-ovoj arhitekturi velicine 4 bajta (32 bita). Ovo znaci da imamo
 ukupno 2^22 = 4MB prostora koji zauzima sama tabela stranica. Ova
 tabela mora zauzimati neprekidan prostor u fizickoj memoriji (to je
 ukupno 2^10=1024 uzastopnih okvira u RAM-u). Tabela stranica za
 program koji se trenutno izvrsava mora biti u celini prisutna u
 fizickoj memoriji. Tabele stranica ostalih programa se mozda i mogu
 privremeno izmestiti na disk. Medjutim, nakon sto pokusamo ponovo da
 ih ucitamo, imacemo problem fragmentacije (jer im je potrebno pronaci
 slobodnih uzastopnih 1024 okvira u RAM-u).

 Ovaj problem se resava stranicenjem na vise nivoa. Naime, umesto da
 insistiramo da tabela stranica mora da zauzima 1024 uzastopnih okvira
 u RAM-u, mozemo dozvoliti da se tih 1024 stranica koje sadrze stavke
 tabele stranica i same rasprse po memoriji u proizvoljne okvire. Da
 bismo imali informaciju o tome gde se koja stranica nalazi, uvodi se
 dodatna tabela koja se zove DIREKTORIJUM TABELE STRANICA (engl. Page
 Directory). Ovaj direktorijum sadrzi stavke (page-directory entry
 (PDE)), koje su takodje na Intel-ovoj arhitekturi velike 32 bita (4
 bajta). Ovakvih stavki ima 1024 (za svaku stranicu tabele stranica po
 jedna), a svaka stavka sadrzi broj fizickog okvira u kome se nalazi
 odgovarajuca stranica tabele stranica. Ukupna velicina direktorijuma
 tabele stranica je 1024*4B = 4KB, sto staje u jedan okvir! Sada ce
 poseban registar u procesoru sadrzati redni broj fizickog okvira koji
 sadrzi direktorijum tabele stranica. Prilikom prevodjenja, najvisih
 10 bitova virtuelne adrese se koristi kao indeks u direktorijumu,
 iz koga se odredjuje broj okvira u kome se nalazi odgovarajuca
 stranica tabele stranica. Zatim se sledecih 10 bitova virtuelne
 adrese koriste kao indeks u toj stranici da bi se odredio broj
 okvira same stranice koju trazimo:


      ______________________________________________________
     |  BROJ DIREKTORIJUMA      | BROJ STRANICE  | POMERAJ  |
      ------------------------------------------------------
                 10 bita             10 bita       12 bita
 

 Prednost ovog pristupa je to sto se sada samo direktorijum stranica
 mora nalaziti u fizickoj memoriji, dok se stranice iz kojih se
 sastoji tabela stranica mogu nalaziti i na disku i po potrebi
 ucitavati. Takodje, resen je problem fragmentacije, jer se ne moraju
 nalaziti u susednim okvirima u fizickoj memoriji. Nedostatak je u
 izvesnom gubitku efikasnoti, jer sada imamo jedan nivo indirekcije
 vise prilikom prevodjenja adresa. Ipak, ovaj gubitak nije drastican u
 praksi, zahvaljujuci koriscenju TLB kesa (videti dole).

*) KORISCENJE VECIH STRANICA

 Noviji Intelovi procesori podrzavaju i vece velicine stranica, npr.
 od 2MB ili 4MB. U slucaju da koristimo stranice od 4MB, tada ce
 struktura virtuelne adrese biti sledeca:

      _____________________________
     |  BROJ STRANICE  |  POMERAJ  |
      -----------------------------
            10 bita       22 bita

 Dakle, nizih 22 bita predstavljaju pomeraj u okviru 4MB velike
 stranice, dok visih 10 bita odredjuju broj stranice (sada je ceo
 virtuelni 32-bitni prostor sastavljen iz svega 1024 stranice od po
 4MB). Tabela stranica sadrzi ukupno 1024 stavke od po 32 bita, sto
 nam daje tabelu velicine 4KB. Dakle, imamo veoma male tabele
 stranica, jer imamo mali broj velikih stranica. Ovo je drugi nacin
 kako se moze resiti problem sa velikim tabelama stranica: samo treba
 koristiti vece stranice, pa ce tabele stranica biti manje.

 Jos jedna dobra strana velikih stranica je u tome sto efikasnije
 koriste disk: s obzirom na nacin rada diska, citanje stranice od 4MB
 sa diska ne traje mnogo duze od citanja stranice od 4KB, a s obzirom
 na drasticno manji broj stranica citanje i pisanje na disk bice mnogo
 manje frekventno.

 Medjutim, postoje i lose strane upotrebe velikih stranica. Prvi
 problem je velika interna fragmentacija. Naime, kako program zauzima
 odredjeni broj uzastopnih stranica virtuelnog adresnog prostora,
 poslednja "naceta" stranica ce po pravilu biti polu-prazna. Sto su
 stranice vece, to ja taj baceni prostor u operativnoj memoriji veci.
 Drugi problem je manja preciznost: kada nam je potrebna neka adresa,
 mi cemo sa njom ucitati i celu njenu okolinu velicine 4MB, sto cesto
 ukljucuje i mnogo toga sto nam ne treba niti ce nam biti potrebno u
 narednom periodu.

*) KORISCENJE VECEG FIZICKOG ADRESNOG PROSTORA

 Pocev od PentiumPro procesora, Intel je omogucio veci fizicki adresni
 prostor od 64GB (36-bitne fizicke adrese), dok je virtuelni adresni
 prostor ostao 32-bitni. Sada su brojevi okvira 24-bitni, pa stavke u
 tabeli stranica uz sve ostale bitove koje moraju da sadrze ne mogu da
 stanu u 32 bita. Zbog toga se koriste 64-bitne stavke, sto tablice
 cini duplo vecim. Otuda se u slucaju 4KB velikih tablica koristi cak
 tri nivoa stranicenja: najpre se na prvom nivou bira jedan od cetiri
 POKAZIVACA DIREKTORIJUMA STRANICA: oni su smesteni u jednoj TABELI
 POKAZIVACA koja sadrzi samo cetiri stavke, a indeksira se pomocu dva
 najvisa bita virtuelne adrese. Poseban registar u procesoru cuva
 adresu ove tabele u fizickoj memoriji. Stavke u ovoj tabeli ukazuju
 na jedan od cetiri direktorijuma stranica. U svakom direktorijumu
 stranica se narednih 9 bitova virtuelne adrese koriste kao indeksi za
 jednu od 512 stavki (svaka stavka je 8 bajtova velika, sto
 direktorijum cini 4KB velikim, sto staje u jednu stranicu). Stavka
 iz direktorijuma nam daje fizicku adresu stranice tabele stranica
 koju indeksiramo pomocu sledecih 9 bitova virtuelne adrese. Stavka
 u ovoj tabeli nam daje 24-bitni redni broj okvira u kome se nalazi
 trazena stranica.


      ______________________________________________________
     | DIR_PTR |   DIR   |   BR STRANICE |     POMERAJ      |
      ------------------------------------------------------
      2 bita     9 bita        9 bita        12 bita


 U slucaju koriscenja vecih stranica  (4MB), broj okvira je 2^14, pa
 je 14 bitova dovoljno za odredjivanje rednog broja okvira. Otuda
 stavke ponovo mogu da stanu u 32 bita, pa imamo samo jednu tabelu
 stranica sa 1024 stavki od po 4 bajta (tabela velicine 4KB). Tabela
 se indeksira pomocu visih 10 bitova virtuelne adrese.

      _____________________________
     |  BROJ STRANICE  |  POMERAJ  |
      -----------------------------
            10 bita       22 bita


*) STRANICENJE KOD X86-64 PROCESORA

 Noviji 64-bitni Intel/AMD procesori teorijski koriste 64-bitni
 virtuelni adresni prostor. Medjutim, aktuelne implementacije visih 16
 bitova virtuelne adrese uvek oznaceno prosiruje, tj. efektivno ih ne
 koristi. Otuda je stvarna velicina virtuelnog adresnog prostora
 48-bitna. Fizicki adresni prostor varira od 36-bitnog do 40-bitnog,
 pa i vise. Pritom, koriste se sledece dve varijante organizacije
 virtuelne memorije:

 1) 4KB stranice: prevodjenje adrese se vrsi na cetiri nivoa (4 x 9
 visih bitova virtuelne adrese, ne uzimajuci najvisih 16 koji se ne
 koriste). Svaka od stavki u svim tabelama i direktorijumima je
 64-bitna, a sve tabele i direktorijumi sadrze 2^9=512 stavki, pa
 staju u po jednu stranicu. [Direktorijum na najvisem nivou se
 oznacava sa PML4 (skraceno od Page-Map-Level 4, sto oznacava cetvri
 nivo mapiranja; u pitanju je Intel-ova terminologija i nije toliko
 bitna).
 


      __________________________________________________________
     | PML4 | DIR PTR  |  DIR  | BR STRANICE |     POMERAJ      |
      ----------------------------------------------------------
      9 bita  9 bita    9 bita      9 bita        12 bita



 2) 2MB stranice: prevodjenje adrese se vrsi na tri nivoa (3 x 9 visih
 bitova virtuelne adrese ne uzimajuci u obzir visih 16 bitova koji se
 ne koriste). Nizih 21 bit se koristi kao pomeraj u okviru 2MB velike
 stranice. Stavke su velike 64-bita, a svaka tabela ili direktorijum
 ima po 512 ovakvih stavki, pa staje u 4KB. Otuda stavke u
 direktorijumima sadrze redne brojeve okvira od po 4KB (tj. 28-bitne
 brojeve), dok stavke u samim tabelama stranica sadrze 19-bitne
 brojeve 2MB-nih okvira (do 40 bita su fizicke adrese).

      ______________________________________________________
     | DIR_PTR |   DIR   |   BR STRANICE |     POMERAJ      |
      ------------------------------------------------------
       9 bita     9 bita        9 bita        21 bita


*) TLB (Translation-Lookahead Buffer)

 Kako se tabele i direktorijumi stranica nalaze u memoriji, da bismo
 izvrsili prevodjenje virtuelnih u fizicke adrese, neophodno je da
 odemo u memoriju po odgovarajuce stavke iz tabela. Kako je pristup
 memoriji spor, ovo bi bilo nedopustivo neefikasno. Zbog toga je
 neophodno koristiti kesiranje. TLB je specijalni kes u procesoru koji
 se koristi u ove svrhe. U pitanju je veoma mali i veoma brz kes,
 obicno implementiran kao razdvojen kes (poseban za instrukcije, a
 poseban za podatke). U slucaju manjih TLB-ova koristi se potpuno
 asocijativno mapiranje, dok u slucaju vecih koristi se
 skup-asocijativno mapiranje. TLB dohvata i cuva u sebi stavke tabela
 i direktorijuma stranica. Stranice koje su nedavno koriscene se sada
 mogu razresiti direktno u TLB-u, pa se fizicka adresa moze izracunati
 na osnovu virtuelne bez odlaska u memoriju. U slucaju da TLB ne
 sadrzi trazenu stavku, odlazi se u memoriju i stavka se prebacuje
 u TLB.

 
