Prečo procesory x86 používajú len dva zo štyroch krúžkov?
Keď sa dozviete viac o tom, ako fungujú operačné systémy a hardvér, na ktorých pracujú, a navzájom sa vzájomne ovplyvňovať, možno vás prekvapí, aké to sa zdá byť zvláštnosťou alebo nedostatočným využitím "zdrojov". Prečo to je? Dnešný príspevok typu SuperUser Q & A má odpoveď na otázku zvedavého čitateľa.
Dnešná relácia otázok a odpovedí sa k nám pridelí zdvorilosťou SuperUser - podskupiny Stack Exchange, zoskupenia webových stránok typu Q & A.
Foto s láskavým dovolením Lemsipmatt (Flickr).
Otázka
Čítačka SuperUser AdHominem chce vedieť, prečo procesory x86 používajú iba dva zo štyroch zvonení:
Linux a Windows x86 systémy používajú len Prsteň 0 pre režim jadra a Prsteň 3 pre užívateľský režim. Prečo procesory dokonca rozlišujú štyri rôzne krúžky, ak všetci skončia práve pomocou dvoch z nich? To sa zmenilo s architektúrou AMD64?
Prečo procesory x86 používajú iba dva zo štyroch zvonení?
Odpoveď
Sprostredkovateľ SuperUser Jamie Hanrahan má pre nás odpoveď:
Existujú dva hlavné dôvody.
Prvým je to, že hoci CPU x86 ponúkajú štyri kruhy ochrany pamäte, granularita ponúkanej ochrany je iba na úrovni jednotlivých segmentov. To znamená, že každý segment môže byť nastavený na konkrétny prsteň (úroveň privilégií) spolu s inými ochranami, ako je zapisovanie. Nie je však k dispozícii mnoho deskriptorov segmentov. Väčšina operačných systémov by chcela mať oveľa jemnejšiu granularitu ochrany pamäte, ako ... pre jednotlivé stránky.
Preto zadajte ochranu tabuľky stránok. Väčšina, ak nie všetky, moderné operačné systémy x86 ignorujú mechanizmus segmentácie (akokoľvek môžu) a spoliehajú sa na ochranu dostupnú z bitov nízkych rádov v záznamoch tabuľky stránok. Jeden z nich sa nazýva "privilegovaný" bit. Tento bit určuje, či musí byť procesor v jednej z "privilegovaných" úrovní prístupu k stránke. "Privilegované" úrovne sú PL 0, 1 a 2. Je to však iba jeden bit, takže na úrovni ochrany jednotlivých stránok je počet "režimov" dostupných v oblasti ochrany pamäte iba dva: Stránka môže byť prístupná z režimu bez privilegovania alebo nie. Preto len dva zvonenia. Aby každá stránka disponovala štyrmi možnými krúžkami, museli by mať dve bitky ochrany v každej vstupnej tabuľke stránok, aby zakódovali jedno zo štyroch možných čísel zväzkov (rovnako ako deskriptory segmentov). Avšak nemajú.
Ďalším dôvodom je túžba po prenositeľnosti operačného systému. Nie je to len x86; Unix nás naučil, že operačný systém by mohol byť relatívne prenosný pre viac procesorových architektúr a že to bola dobrá vec. Niektoré procesory podporujú len dva zvonenia. V závislosti od viacerých krúžkov v architektúre implementátori operačného systému urobili operačné systémy prenosnejšími.
Existuje tretí dôvod, ktorý je špecifický pre vývoj Windows NT. Projektanti NT (David Cutler a jeho tím, ktorých Microsoft najal od DEC Western Labs) mali rozsiahle predchádzajúce skúsenosti s VMS; v skutočnosti Cutler a niekoľko ďalších boli medzi pôvodnými dizajnérmi VMS. A procesor VAX, pre ktorý bol navrhnutý systém VMS, má štyri zvonenia (VMS používa štyri zvonenia).
Ale komponenty, ktoré bežali vo VMS Krúžky 1 a 2 (Služby správy záznamov a CLI, resp.) Boli z návrhu NT vynechané. Prsteň 2 v systéme VMS nebolo v skutočnosti o zabezpečení operačného systému, ale skôr o zachovaní prostredia CLI používateľa z jedného programu na druhý a systém Windows nemal tento koncept; CLI beží ako bežný proces. Čo sa týka VMS Krúžok 1, kód RMS v Krúžok 1 museli zavolať Prsteň 0 pomerne často, a prechod prsteňov sú drahé. Ukázalo sa, že je oveľa efektívnejšie jednoducho ísť Prsteň 0 a urobiť s ním skôr než mať veľa Prsteň 0 prechody v rámci Krúžok 1 kód (znova, nie že NT má niečo ako RMS rovnako).
Pokiaľ ide o to, prečo x86 implementoval štyri zvonenia, zatiaľ čo operačné systémy ich nepoužívali, hovoríte o operačných systémoch s oveľa novším dizajnom ako x86. Veľa funkcií programovania systému x86 bolo navrhnutých dlho predtým, ako boli implementované NT alebo pravé Unix-ish jadrá, a naozaj nevedeli, čo by používal operačný systém. Až do chvíle, kedy sme na stránkach x86 zistili, že by sme mohli implementovať pravé Unix-ish alebo VMS-podobné jadrá.
Nielen, že moderné operačné systémy x86 prevažne ignorujú segmentáciu (iba nastavujú segmenty C, D a S so základnou adresou 0 a veľkosťou 4 GB, segmenty F a G sa niekedy používajú na označenie kľúčových dátových štruktúr operačného systému ), taktiež väčšinou ignorujú veci ako "segmenty úloh". Mechanizmus TSS bol jasne navrhnutý na prepínanie kontextu vlákien, ale ukázalo sa, že má príliš veľa vedľajších účinkov, takže moderné operačné systémy x86 to robia "ručne". Jediný čas, keď x86 NT zmení hardvérové úlohy, je pre niektoré skutočne výnimočné podmienky, ako je dvojitá výnimka chyby.
Pokiaľ ide o architektúru x64, mnohé z týchto nepoužívaných funkcií boli vynechané. Na úkor AMD vlastne hovorili s tímami jadra operačného systému a spýtali sa, čo potrebujú od x86, čo nepotrebovali alebo nechceli a čo by chceli pridať. Segmenty na platforme x64 existujú len v tom, čo by sa dalo označiť ako varianta, prepínanie stavu úloh neexistuje atď. A operačné systémy naďalej používajú len dva krúžky.
Máte niečo doplniť vysvetlenie? Znie to v komentároch. Chcete sa dozvedieť viac odpovedí od iných používateľov technickej úrovne Stack Exchange? Pozrite sa na celý diskusný príspevok tu.