V reálnym režimu múžou všechny aplikace přistupovat ke všem portúm
a měnit libovolný místo v paměti.
Paměť se adresuje jako SEGMENT:OFFSET.
Fyzická adresa = lineární adresa = SEGMENT * 16 + OFFSET.
SEGMENT a OFFSET jsou 16bitový, takže lze adresovat 1 MiB paměti
( + 64 KiB - 16, pokud zapnete A20).
[1234h:5] = [1230h:45h] = [1200h:345h] = [1000h:2345h]
Kvúli zpětný kompatibilitě se všechny procesory spouštěj v reálnym režimu.
U procesorú 80286 a novějších lze přejít do chráněnýho režimu, jak? Viz dál.
V tomhle režimu procesor rozlišuje 4 úrovně oprávnění (privilege level, PL).
Úroveň 0 (kernel level) múže všechno, úroveň 3 (user level) je nejvíc omezená.
Aktuální úroveň oprávnění je určená bitama 0 a 1 registru CS.
Podmínka | Instrukce |
---|---|
PL == 0 | lgdt, lidt, lldt, ltr, lmsw, mov cr?, mov dr?, clts, hlt, změna IOPL (popf, iret) |
PL <= IOPL | in, insb, insw, insd, out, outsb, outsw, outsd, lock, změna IF (popf, iret, cli, sti) |
Pro adresaci paměti se používá tabulka GDT(Global Descriptor Table)
a libovolnej počet tabulek LDT(Local Descriptor Table).
Každej proces múže mít svoji tabulku LDT.
Tyhle tabulky obsahujou záznamy o velikosti 8 bajtú, kerejm se říká
DESKRIPTORY.
Velikost tabulky múže bejt maximálně 64 KiB, takže 8192 záznamú.
Tabulky se nastavujou instrukcema lgdt a lldt.
Paměť se adresuje jako SELECTOR:OFFSET.
Segmentový registry procesoru (es, cs, ss, ds, fs, gs) obsahujou cache, v kerý uchovávají příslušnej deskriptor,
takže při změně tabulek je potřeba znovu nastavit segmentový registry, aby se změna projevila.
if ((SELECTOR & 4) == 0)
DESCRIPTOR = GDT[SELECTOR/8]
else
DESCRIPTOR = LDT[SELECTOR/8]
LA = DESCRIPTOR.base + OFFSET
Přitom se kontroluje:
max(SELECTOR & 3, cs & 3) <= DESCRIPTOR.dpl
0 <= OFFSET <= DESCRIPTOR.limit
Readable? Writable?
Pokud podmínky nejsou splněny, vyvolá se int 0Dh.
Stránkování umožňuje, aby každej proces měl svúj vlastní adresovej prostor
(virtuální paměť).
Virtuální paměť je rozdělená na stránky (page) o velikosti 4 KiB (4096 bajtú).
Fyzická paměť je rozdělená na rámce (frame) o velikosti 4 KiB.
Virtuální paměť se mapuje do fyzický paměti pomocí stránkovejch adresářú a
stránkovejch tabulek.
Ve fyzický paměti se nacházejí pouze ty stránky, kerý proces používá.
Pokud chce pracovat se stránkou, kerá není ve fyzický paměti, vyvolá se
přerušení 0Eh. Obsluha tohohle přerušení načte požadovanou stránku do fyzický
paměti. Pokud není volný místo, vyswapuje nejmíň používanou stránku.
Stránkování se zapíná nastavením bitu 31 (PG) registru CR0.
Každej proces má svúj vlastní stránkovej adresář, na kerej ukazuje registr CR3.
Stránkovej adresář obsahuje 1024 položek o velikosti 4 bajty.
Ty ukazujou na stránkový tabulky, kerý taky obsahujou 1024 položek o velikosti
4 bajty.
Při přístupu ke stránce, kerá není přítomná ve fyzický paměti (P=0), se vyvolá
přerušení 0Eh. V registru CR2 je lineární adresa, kerá zpúsobila výpadek.
Bity | Význam |
---|---|
31-22 | index do stránkovýho adresáře |
21-12 | index do stránkový tabulky |
11-0 | offset ve stránce(rámci) |
CR3 → stránkovej adresář (page directory) → stránková tabulka (page table) → stránka/rámec (page/frame)
Bity | Význam |
---|---|
31-12 | (*4096) fyzická adresa stránkový tabulky (nebo 4 MiB rámce) |
11-9 | - k použití |
8 | G - global page (stránka zústane v cache, i když se změní CR3) |
7 | PS - page size (4 MiB rámec místo stránkový tabulky, Pentium) |
6 | D - rezervováno |
5 | A - accessed (použito, nastavuje CPU, nuluje OS) |
4 | PCD - page table will be cached (stránková tabulka bude kešovaná) |
3 | PWT - write through (cache bude ukládaná prúběžně) |
2 | U - user accessible (povolen přístup s PL 1..3) |
1 | W - writable (povolen zápis) |
0 | P - present (přítomno ve fyzický paměti) |
Bity | Význam |
---|---|
31-12 | (*4096) fyzická adresa rámce |
11-9 | - k použití |
8-7 | RSVD - rezervováno |
6 | D - dirty (změněno, nastavuje CPU, nuluje OS) |
5 | A - accessed (použito, nastavuje CPU, nuluje OS) |
4-3 | RSVD - rezervováno |
2 | U - user accessible (povolen přístup s PL 1..3) |
1 | W - writable (povolen zápis) |
0 | P - present (přítomno ve fyzický paměti) |
Pokud chcete zpřístupnit stránku pro aplikaci, musíte nastavit příznak U jak u stránkový tabulky(PT), tak u stránkovýho adresáře(PD).
PAE se zapíná nastavením bitu 5 (PAE) registru CR4.
Při nastavení PS (page size) má stránka velikost 2 MiB (místo 4).
Bity | Význam |
---|---|
31-30 | index do tabulky ukazatelú na stránkový adresáře |
29-21 | index do stránkovýho adresáře |
20-12 | index do stránkový tabulky |
11-0 | offset ve stránce(rámci) |
CR3 → tabulka ukazatelú na stránkový adresáře (page directory pointer table) → stránkovej adresář (page directory) → stránková tabulka (page table) → stránka/rámec (page/frame)
Registr CR3 ukazuje na tabulku ukazatelú na stránkový adresáře (page directory
pointer table).
Tahle tabulka obsahuje 4 položky o velikosti 8 bajtú.
Stránkovej adresář obsahuje 512 položek o velikosti 8 bajtú.
Ty ukazujou na stránkový tabulky, kerý rovněž obsahujou 512 položek o velikosti
8 bajtú.
Režim Long rozšiřuje registry na 64bitú a přidává registry R8-R15.
Mapovací tabulky mají položky o velikosti 8 bajtú.
Registry CS, SS, DS a ES se chovají, jako by měly bázi 0 a limit
0xFFFFFFFFFFFFFFFF.
Vypněte stránkování (bit 31 registru CR0).
Zapněte PAE (bit 5 registru CR4).
Vytvořte mapovací tabulky a nastavte CR3.
Zapněte režim Long (bit 8 registru MSR(ecx = 0xC0000080)).
Zapněte stránkování (bit 31 registru CR0).
Skočte na 64bitovej instrukční segment.
Bity | Význam |
---|---|
63 | NX bit (No eXecute) / XN (eXecute Never) - zakázáno spouštění, obsahuje pouze data. |
47 - 39 | index do tabulky PML4 (Page-Map Level 4) |
38 - 30 | index do tabulky ukazatelú na stránkový adresáře |
29 - 21 | index do stránkovýho adresáře |
20 - 12 | index do stránkový tabulky |
11 - 0 | offset ve stránce(rámci) |
CR3 → PML4 → tabulka ukazatelú na stránkový adresáře (page directory pointer table) → stránkovej adresář (page directory) → stránková tabulka (page table) → stránka/rámec (page/frame)