Chránený režim

**Chránený režim** alebo **chránená virtuálna adresácia** je prevádzkový režim CPU kompatibilných s x86.

Prvýkrát bol pridaný do architektúry x86 v roku 1982, vydala ho spoločnosť Intel ako procesor 80286 (286), ale až od procesora 80386 (386) v roku 1985 sa začal využívať v operačných systémoch a aplikáciách. Chránený režim dovoľuje systémovým programom využívať mnoho nových rysov navrhnutých k zlepšeniu multitaskingu (spracovanie viacerých úkonov naraz) a k lepšiemu ovládaniu aplikačných programov, napr. systém stránkovania, ochrana pamäti a podpora pre virtuálnu pamäť.

Po zapnutí procesoru, ktorý podporuje x86 chránený režim, sa začnú vykonávať príkazy v reálnom režime, aby sa zaručila spätná kompatibilita so staršími procesormi. Chránený režim môže byť zavedený až potom, čo systémový program nastaví niekoľko deskriptorových tabuliek a umožní "Povolenie ochrany" bit v Kontrolnom registri 0 (CR0).

Kvôli pridaným zlepšeniam sa chránený režim stal základom pre všetky nasledujúce vylepšenia na architektúre x86.

## História
8086, predchodca 286, bol pôvodne navrhnutý s 20-bitovou pamäťovou adresovou zbernicou. Toto dovoľovalo procesoru prístup 220 bajtov pamäte, ekvivalentné k 1 mebibajtov. V tej dobe bol 1 mebibajt považovaný za relatívne veľké množstvo pamäte, a tak návrhári z IBM Personal Computer rezervovali prvých 640 kilobajtov pre aplikácie a použitie operačného systému a zvyšných 384 kilobajtov bolo rezervovaných pre základný vstupno-výstupný systém (BIOS) a pamäť pre prídavné zariadenia.

Ako plynul čas, cena pamäti sa nepretržite znižovala a využitie sa zväčšovalo. Limitovanie 1MB sa nakoniec stalo významným problémom. Intel zamýšľal riešit tuto limitáciu spolu s inými vydaním 286.

### 286

Prvotný chránený režim, vydaný s 286, sa nedočkal širšieho využitia. Bránili tomu nedostatky, ako neschopnosť prístupu k BIOS-u a neschopnosť prepnúť späť do reálneho režimu bez resetovania procesoru. Toto bolo brzdené faktom, že 286 dovoľovala prístup k pamäti v 16 bitoch, 216 bajtov, ekvivalent k 64 kilobajtom, prístupných v čase.

Spätná kompatibilita s predchodcami 8086 bola zachovaná tým, že pri štarte sa inicializoval reálny režim. Reálny režimu umožňoval starším programom bežať bez modifikácie na novších 286. Pre prístup k doplňujúcim funkciám 286, operačný systém nastavoval procesor do chráneného režimu. Toto umožnilo 24 bitovú adresáciu, ktorá dovoľovala procesoru pristupovať k 224 bajtov pamäti, teda 16 megabajtov.

### 386
150px|thumb|Intel 80386 microprocesor

S vydaním 386 v roku 1985, mnoho problémov zabránilo rozsiahlemu prijatiu predchádzajúceho chráneného režimu.

386 vydali s adresovou zbernicou veľkosti 32 bitov, ktorá dovoľuje prístup do 231 bajtov pamäti, ekvivalent ku 4 gigabajtom. Pre zmapovanie segmentov pamäte využíva procesor Global Descriptor Table (GDT) alebo Local Descriptor Table (LDT), sú v nich obsiahnuté 64 bitové (8 bajtové) záznamy v ktorých je zapísaný typ, pozícia, limit segmentu a prístupové práva (Protection Rings). Do segmentových registrov sa presúva len ofset záznamu od začiatku tabuľky. Po presunutí hodnoty do seg. registra procesor automaticky načíta záznam z GDT/LDT do neviditeľnej časti segmentového registra (base, limit). Ak je popisovač chybný, alebo ak sa aplikácia vo väčšom ochrannom kruhu snaží pristúpiť k segmentu s nižším procesor aktivuje prerušenie 10 (Invalid TSS), 11 (Segment Not Present), 12 (Stack-segment fault) alebo 13 (General Protection Fault). Navyše k zvýšeniu veľkosti adresovej zbernice a segmentom registrov, mnoho iných nových rysov bolo pridaných so zámerom väčšej operačnej bezpečnosti a stability. PAE PSE NX bit 

Chránený režim je teraz využívaný doslova vo všetkých moderných operačných systémov, ktoré fungujú na x86 architektúre, napr. Microsoft Windows, Linux, a mnoho iných.

## 386 Dodatky k chránenému režimu
S vydaním 386, nasledujúce ďalšie prvky boli pridané k chránenému režimu:
* Stránkovanie
* 32-bitový fyzický a virtuálny adresový priestor (32 bitový fyzický adresový priestor nie je súčasť 80386SX a iných 386 procesorových variant, ktoré používajú staršiu 286 zbernicu.)
* 32-bitová segmentová časť
* Schopnosť prepínania sa späť k reálnemu režimu
* Virtuálny 8086 režim

## Vstupy a výstupy chráneného režimu
Až do vydania 386, chránený režim neposkytoval priamu metódu na vrátenie sa do reálneho režimu hneď ako už raz bol prepnutý do chráneného režimu. IBM vytvorilo obkľučku, ktorá zahrňovala resetovanie CPU a ukladanie systémových registrov, ukazovateľ zásobníka a často aj masku prerušení v real-time hodinách čipu RAM. Toto dovoľovalo BIOS-u navrátiť CPU do rovnakého stavu a začať vykonávať kód pred resetom.

Pre vojdenie do chráneného režimu, musela byť vytvorená globálna tabuľka deskritporov (GDT) s minimálne troma záznamami: nulový deskriptor, kódový segmentový deskriptor a dátový segmentový deskriptor. 20. adresový riadok (A20 riadok) taktiež musel dovoľovať použitie všetkých adresových riadkov takže CPU mohol pristupovať za 1MB pamäti (iba prvých 20. bolo povolených použivať až po spustení kvôli garantovaniu kompatibility so starším softvérom). Po uskutočnení týchto dvoch krokov, PE bit musel byť nastavený v CR0 registri a druhý skok sa musel uskutočniť k vyčisteniu vstupnej fronty.

 ; nastav PE bit
 mov eax, cr0
 or eax, 1
 mov cr0, eax
 
 ; druhý skok (cs = selektor časti kódu)
 jmp cs:@pm
 
 @pm:
 ; teraz sme v chránenom režime.

Vydaním 386 mohol chránený režim vyjsť načítaním segmentových registrov s hodnotami reálneho režimu, vyradením A20 riadku a čistením PE bitu v CR0 registra, bez potreby vykonávať počiatočné nastavovacie kroky ako v 286.

## Črty
Chránený režim má množstvo nových čŕt navrhnutých k zlepšeniu kontroly operačného systému nad aplikačným softwarom, aby zväčšil bezpečnosť a stabilitu systému. Tieto bonusy dovoľujú operačnému systému fungovať spôsobom, ktorý by inak bol významne ťažší alebo dokonca nemožný bez poriadnej hardwarovej podpory.

### Privilegované úrovne
thumb|right|250px|Príklad použitia privilegovaných prstencov v klasickom operačnom systéme.

V chránenom režime existujú 4 privilegované úrovne alebo prstence, začínajú od 0 po 3, kde prstenec 0 je najprivilegovanejší a 3 najmenej privilegovaný. Používanie prstencov dovoľuje programovému vybaveniu obmedziť úlohy z prístupneních dát, volacie brány alebo vykonávať privilegované inštrukcie.

Vo väčšine prostredí, operačné systémy a niektoré ovládače zariadení bežia v prstenci 0 a aplikácie bežia v prstenci 3.

### Aplikačná kompatibilita reálneho režimu
Z najväčšej časti, binárna kompatibilita s kódom reálneho režimu, schopnosť k prístupu až 16 MB fyzickej pamäti a 1GB virtuálnej pamäti boli najväčšie zmeny na programových aplikáciách. Ale neprebiehalo to bez limitácií, ak aplikácia využila alebo sa spoliehala na niektoré techniky uvedené nižšie nebežala:
* Aritmetika segmentu
* Privilegované inštrukcie
* Priamy hardwarový prístup
* Písanie do časti kódu
* Dáta vykonávania
* Segmenty prekrývania
* Použitie bios-ových funkcií, pretože bios-ové prerušenia patria Intel-u

V skutočnosti takmer všetky DOS aplikačné programy porušili tieto pravidlá. Kvôli týmto obmedzeniam bol vytvorený virtuálny 8086 režim a povolený s 386. I napriek takýmto potencionálnym prekážkam, Windows 3.x a jeho nástupcovia môžu využívať binárnu zlučiteľnosť s reálnym režimom pri spustení aplikácii Windows 2.x, ktoré bežali v reálnom režimu vo Windows 2.x.

### Virtuálny 8086 režim

S vydaním 386, chránený režim predviedol niečo, čo manuály Intel-u nazvali **virtuálny 8086 režim**. Virtuálny 8086 režim je navrhnutý, aby dovoľoval kódu predtým písanému pre 8086 fungovať bez prevádzkových modifikácii a súbežne s inými úlohami, bez znižovania bezpečnosti alebo stability systému. Virtuálny 8086 režim nie je spätne zlučiteľný so všetkými programy. Programy, ktoré vyžadujú manipuláciu segmentu, privilegované inštrukcie, priamy hardwarový prístup alebo používajú samomodifikačný kód, budú vytvárať výnimky a nebudú spustiteľné. Navyše, aplikácie bežiace vo virtuálnom 8086 režime vytvárajú pasť s použitím inštrukcií, ktoré zahrňujú vstup/výstup (I/O), ktorý môže záporne ovplyvniť výkon.

Kvôli týmto obmedzeniam mnoho programov pôvodne navrhnutých k behu na 8086 nemohli bežať vo virtuálnom 8086 režime. Dôsledkom čoho bol systémový program nútený buď ku kompromisnej sys-témovej bezpečnosti alebo k spätnej kompatibilite, ktorou sa zaoberá softwarové dedičstvo. Príklad takýchto kompromisov môže byť videný napríklad u Windows NT, ktorý vylúčil spätnú kompatibilitu pre mnoho DOS aplikácií.

### Stránkovanie
thumb|250px|Bežný spôsob použitia stránkovania na vytvorenie priestoru virtuálnej pamäte

Okrem pridania do virtuálneho 8086 režimu, 386 pridal **stránkovanie** aj ku chránenému režimu. Napriek stránkovaniu, systémový program môže obmedzovať a riadiť úlohový prístup ku stranám, ktoré sú súčasťou pamäte. V mnohých operačných systémoch, stránkovanie je používané k vytvoreniu nezávislého virtuálneho adresového priestoru pre každú úlohu. Toto bráni jednej úlohe v manipulovaní pamäte inej úlohy. Stránkovanie taktiež počíta s odstraňovaním strán z primárnej pamäte a na ukladanie na pomalejšiu a väčšiu druhotnú pamäť, ako pevný disk. Architektúra x86 dovoľuje kontrolu nad stranami cez dve sady: adresár strany a tabuľky strany.

Pôvodne mal adresár strany veľkosť jednej strany, 4 KB, a obsahoval 1024 stránkových adresárových záznamov (PDE), aj keď nasledujúce vylepšenie architektúry x86 pridalo schopnosť používať väčšie veľkosti stránky. Každý PDE obsahuje ukazovateľa k tabuľke strany. Tabuľka strany mala tiež pôvodne 4KB a obsahovala 1024 stránkových tabuľkových záznamov (PTE). Každý PTE obsahoval ukazovateľ na skutočnú stránkovú fyzickú adresu a bol použitý len keď 4KB strany boli používané. V danom čase môže byť len jeden adresár strany v aktívnom využívaní.

### Multitasking

Od použitia prstencov, privilegované volacie brány a segmentu na uloženie stavu úlohy (TSS), predstavených spolu s 286, preemptive multitasking bol vyvíjaný na architektúre x86. TSS dovoľuje uni-verzálnym registrom, segmentovým selektorovým poliam a radom modifikáciu bez ovplyvňovania ďalších úloh. TSS taktiež dovoľuje úlohy privilegovaných úrovni a I/O portu byť nezávislý od ďalších úloh.

V mnohých operačných systémoch nie sú použité plné črty TSS. Ako výsledok mnoho operačných systémov používa ako hardware tak aj software na vybudovanie multitaskingového systému.

## Operačné systémy
Operačné systémy ako OS/2 1.x sa pokúšajú prepínať procesor medzi chránenými a skutočnými režimami. Oboje je pomalé a nebezpečné, pretože program reálneho režimu môže rýchlo spadnúť. OS/2 1.x definuje obmedzujúce programovacie pravidla dovolením *Rodiny API* alebo veľkým skokom. Tým pádom program môže bežať buď v reálnom alebo chránenom režime.

Niektoré skoršie Unix operačné systémy, OS/2 1.x a Windows používali tento režim. Windows 3.0 bol schopný spúšťať v reálnom režime programy v 16-bitovom chránenom režime. Windows 3.0, keď prepína na chránený režim, udržiava jedinú privilegovanú úroveň modelu, ktorý bol používaný v reálnom režime, ktorý je dôvodom prečo windowsové aplikácie a knižnice DLL môžu zaháknuť prerušenie a urobiť priamy hardwarový prístup. To trvalo až po Windows 9x sériu. Ak je Windows 1.x alebo 2.x program písaný vhodne a vyhýba sa aritmetickému segmentu, bude fungovať rovnako v obidvoch režimoch. Windows programy sa obecne vyhýbajú aritmetickému segmentu, pretože Windows implementuje software virtuálnej pamäťovej schémy, pohyblivý kód programu a dát v pamäti, keď programy nebežia, takže manipulácia absolútnej adresy je nebezpečná; programy by sa mali len pridržiavať kľučky k blokom pamäti, keď nebežia. Spúšťanie starého programu pokým Windows 3.0 beží je ošetrené v chránených režimoch spustením upozornenia, navrhne buď spustenie Windows v reálnom režime alebo aktualizovanie na novú verziu aplikácie. Nie je možné aby niektoré GUI programy bežali v 16-ti bitovom chránenom režime a iný GUI program bežal v reálnom režime. Vo Windows 3.1 reálny režim zmizol.

Dnes, 16-ti bitový chránený režim je ešte využívaný na spustenie dedičných *aplikácií*, napr. DPMI kompatibilný s DOS rozširovacími programami (cez virtuálne DOS stroje) alebo Windows 3.x aplikácie (cez Windows na Windows podsystém) a isté triedy ovládačov zariadení v OS/2 2.0 a neskoršie, všetky pod kontrolou 32 bitového jadra.

## Referencie

## Pozri aj
* Jazyk symbolických inštrukcií
* Intel
* Prstence (bezpečnosť počítača)
* x86 jazyk symbolických inštrukcií

## Externé odkazy
* Chránené režimové základy
* Úvod ku chránenému režimu 
* Prehľad chránených režimových operácií Intel architektúry
* Intel ® 64 a IA-32 architektúra manuály vývojára softwaru

Kategória:Architektúra x86