Obsah

Režimy procesoru

Reálnej režim (real mode)

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.

Chráněnej režim (protected mode)

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.

Přechod do chráněnýho režimu

Privilegovaný instrukce

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)

Adresace paměti

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.

Výpočet lineární adresy ze selektoru a ofsetu

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í (paging) - virtuální paměť (virtual memory)

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.

Výpočet fyzický adresy z lineární adresy

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)

Položka stránkovýho adresáře (page directory)

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)

Položka stránkový tabulky (page table)

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 (Physical Address Extension)

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).

Výpočet fyzický adresy z lineární adresy

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 (long mode)

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.

Přechod do režimu Long z chráněnýho režimu

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.

Výpočet fyzický adresy z lineární adresy

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)

Příklad přechodu do režimu Long