Proč procesory x86 používají pouze dva ze čtyř prstenců?
Když se dozvíte více o tom, jak fungují operační systémy a hardware, na kterém pracují, a vzájemně se vzájemně ovlivňují, možná vás překvapí, jak se zdá, že se jedná o zvláštnosti nebo nedostatečné využití "zdrojů". Proč je to tak? Dnešní příspěvek SuperUser Q & A má odpověď na zvědavou otázku čtenáře.
Dnešní zasedání Otázky a odpovědi nás přichází s laskavým svolením SuperUser - podřízené rozdělení Stack Exchange, které je založeno na komunitě prostřednictvím skupin webových stránek.
Foto s laskavým svolením Lemsipmattu (Flickr).
Otázka
Reader SuperUser AdHominem chce vědět, proč procesory x86 používají pouze dva ze čtyř kroužků:
Systémy x86 se systémem Linux a Windows používají pouze Ring 0 pro režim jádra a Ring 3 pro uživatelský režim. Proč procesory dokonce rozlišují čtyři různé kroužky, pokud všichni nakonec jen používají dva z nich? To se změnilo s architekturou AMD64?
Proč procesory x86 používají pouze dva ze čtyř kroužků?
Odpověď
Příspěvek SuperUser Jamie Hanrahan má pro nás odpověď:
Existují dva hlavní důvody.
První z nich je, že i když procesory x86 nabízejí čtyři kroužky s ochranou paměti, poskytuje granularita ochrany pouze na úrovni jednotlivých segmentů. To znamená, že každý segment může být nastaven na určitý prstenec (úroveň privilegií) spolu s dalšími ochranami, jako je zapisování zakázáno. Neexistuje však mnoho deskriptorů segmentů. Většina operačních systémů by chtěla mít mnohem jemnější granularitu ochrany paměti, jako ... pro jednotlivé stránky.
Takže zadejte ochranu tabulky stránek. Většina, ne-li všechny, moderní operační systémy x86 víceméně ignorují mechanismus segmentace (pokud mohou stejně) a spoléhají se na ochranu, která je k dispozici z bitů nízkého pořadí v položkách tabulky stránek. Jeden z nich se nazývá "privilegovaný" bit. Tento bit řídí, zda musí být procesor v jedné z "privilegovaných" úrovní pro přístup k této stránce. "Privilegované" úrovně jsou PL 0, 1 a 2. Jedná se však pouze o jeden bit, takže při úrovni ochrany jednotlivých stránek je počet "dostupných" režimů, pokud jde o ochranu paměti, pouze dvě: Stránka může být přístupná z režimu bez privilegovaného přístupu nebo ne. Proto mají jen dva kroužky. Aby každá stránka měla čtyři možné kroužky, měly by mít v každém záznamu tabulky stránek dva ochranné bity, aby kódovaly jedno ze čtyř možných čísel (stejně jako deskriptory segmentů). Nicméně, ne.
Druhým důvodem je touha po přenositelnosti operačního systému. Nejde jen o x86; Unix nás učil, že operační systém může být poměrně přenosný pro architekturu více procesorů a že to byla dobrá věc. Některé procesory podporují pouze dva kroužky. Tím, že závisí na více kruzích v architektuře, implementátoři operačního systému učinili operační systémy více přenosnými.
Existuje třetí důvod, který je specifický pro vývoj systému Windows NT. Návrháři společnosti NT (David Cutler a jeho tým, kteří Microsoft najali od DEC Western Lab Labs) měli rozsáhlé předchozí zkušenosti s VMS; ve skutečnosti byl Cutler a několik dalších mezi původními návrháři VMS. A procesor VAX, pro který byl navržen systém VMS, má čtyři kroužky (VMS používá čtyři kroužky).
Ale komponenty, které běží ve VMS Prstence 1 a 2 (Služby správy záznamů a CLI, resp.) Byly z návrhu NT vynechány. Ring 2 ve VMS nebylo opravdu o zabezpečení operačních systémů, ale spíše o zachování prostředí CLI uživatele z jednoho programu na jiný a Windows neměl tento koncept; CLI běží jako běžný proces. Co se týče VMS Prsten 1, kód RMS v souboru Prsten 1 musel zavolat Ring 0 poměrně často a přechody prstenů jsou drahé. Ukázalo se, že je mnohem efektivnější jít Ring 0 a udělat s tím spíše než mít spoustu Ring 0 přechody v rámci Prsten 1 kód (opět, že NT nemá nic jako RMS stejně).
Pokud jde o to, proč x86 implementoval čtyři kroužky, zatímco operační systémy je nepoužívaly, mluvíte o operačních systémech s mnohem novějším designem než x86. Mnoho vlastností programování systému x86 bylo navrženo dlouho předtím, než byly na něm implementovány NT nebo pravdivé jádra Unix-ish a nevěděli, co by operační systém použil. Až do doby, než jsme na serveru x86 dostali stránkování, mohli bychom implementovat pravdivé jádra typu Unix-ish nebo VMS.
Nejen, že moderní operační systémy x86 z velké části ignorují segmentaci (pouze nastavují segmenty C, D a S se základní adresou 0 a velikostí 4 GB, segmenty F a G se někdy používají k orientaci na klíčové struktury operačního systému ), většinou také ignorují věci jako "úkolové segmenty". Mechanismus TSS byl jasně navržen pro přepínání kontextu vláken, ale ukázalo se, že má příliš mnoho vedlejších efektů, takže moderní operační systémy x86 to dělají "ručně". Jediný čas, kdy x86 NT změní hardwarové úlohy, je pro některé opravdu výjimečné podmínky, jako je dvojitá výjimka chyby.
Pokud jde o architekturu x64, mnoho těchto nepoužívaných funkcí bylo vynecháno. AMD ve skutečnosti mluvil s týmy jádra operačního systému a zeptal se, co potřebují od x86, co nepotřebovali nebo nechtěli a co by chtěli přidat. Segmenty na platformě x64 existují pouze v tom, co se může nazývat viskózní formou, přepnutí stavu úlohy neexistuje atd. A operační systémy nadále používají pouze dva kruhy.
Musíte něco přidat k vysvětlení? Vyjměte v komentářích. Chcete se dozvědět více odpovědí od ostatních uživatelů technologie Stack Exchange? Podívejte se na celý diskusní příspěvek zde.