Защо x86 процесорите използват само две от четири “пръстена”?
Когато научавате повече за това как операционните системи и хардуерът работят и си взаимодействат помежду си, може да се изненадате да видите какви са странностите или недостатъчното използване на „ресурсите“. Защо така? Днешната публикация за въпроси и отговори SuperUser има отговор на въпрос на любопитен читател.
Днешната сесия за въпроси и отговори идва при нас с любезното съдействие на SuperUser - подразделение на Stack Exchange, групирано от общността уеб сайтове за въпроси и отговори.
Снимката е предоставена от Lemsipmatt (Flickr).
Въпроса
Четецът на SuperUser AdHominem иска да знае защо x86 процесорите използват само два от четири пръстена:
Linux и Windows базирани x86 системи използват само Пръстен 0 за режим на ядрото и Пръстен 3 за потребителски режим. Защо процесорите дори различават четири различни пръстена, ако в крайна сметка всички използват само два от тях? Това се промени с архитектурата AMD64?
Защо x86 процесорите използват само два от четири пръстена?
Отговорът
Сътрудникът на SuperUser Джейми Ханрахан има отговор за нас:
Има две основни причини.
Първото е, че въпреки че x86 процесорите предлагат четири пръстена за защита на паметта, гранулираността на предложената защита е само на ниво сегмент. Това означава, че всеки сегмент може да бъде настроен на специфичен пръстен (ниво на привилегии), заедно с други защити, като например забранени за запис. Но не са налице много дескриптори на сегменти. Повечето операционни системи биха искали да имат много по-фина гранулираност на защитата на паметта, като… за отделните страници.
Така че, въведете защита на базата на таблицата. Повечето, ако не всички, модерни x86 операционни системи повече или по-малко пренебрегват механизма за сегментиране (колкото и да е възможно) и разчитат на защитата, достъпна от нискобюджетните битове в записите в таблиците на страниците. Едно от тях се нарича „привилегирован“ бит. Този бит контролира дали процесорът трябва да бъде в едно от “привилегированите” нива за достъп до страницата. Привилегированите нива са PL 0, 1 и 2. Но това е само един бит, така че при нивото на защита по страница, броят на „режимите“, доколкото се отнася до защитата на паметта, е само две: една страница може да бъде достъпна от не-привилегирован режим, или не. Следователно, само два пръстена. За да има четири възможни пръстена за всяка страница, те трябва да имат два защитни бита във всеки запис в таблицата на страници, за да кодират една от четирите възможни номера на пръстена (точно както дескрипторите на сегменти). Те обаче не го правят.
Другата причина е желанието за преносимост на операционната система. Не става въпрос само за x86; Unix ни научи, че една операционна система може да бъде относително преносима към архитектури с множество процесори и че това е нещо добро. А някои процесори поддържат само два пръстена. Като не зависят от множество пръстени в архитектурата, изпълнителите на операционни системи са направили операционните системи по-преносими.
Има трета причина, която е специфична за разработката на Windows NT. Дизайнерите на NT (Дейвид Катлър и неговият екип, които Microsoft наемаше от DEC Western Region Labs) имаха богат опит в VMS; всъщност Кътлър и някои от останалите бяха сред първоначалните дизайнери на VMS. А VAX процесорът, за който е проектиран VMS, има четири пръстена (VMS използва четири пръстена).
Но компонентите, които се изпълняват в VMS Пръстени 1 и 2 (Услугите за управление на записи и съответно CLI) бяха оставени извън дизайна на NT. Пръстен 2 в VMS всъщност не става въпрос за сигурност на операционната система, а по-скоро за запазване на потребителската CLI среда от една програма към друга, а Windows няма тази концепция; CLI работи като обикновен процес. Що се отнася до VMS Пръстен 1, RMS кода в Пръстен 1 трябваше да се обадя Пръстен 0 сравнително често и преходът на пръстена е скъп. Оказа се, че е много по-ефективно да отида Пръстен 0 и да се направи с него, а не да има много Пръстен 0 преходи в рамките на. \ t Пръстен 1 код (отново, не че NT все пак има нещо като RMS).
Що се отнася до това защо x86 реализира четири пръстена, докато операционните системи не ги използват, вие говорите за операционни системи от много по-скорошен дизайн от x86. Много от функциите на системното програмиране на x86 са проектирани много преди NT или истинските Unix-ish ядра да бъдат внедрени на него, и те наистина не знаят какво ще използва операционната система. Едва когато получихме страници на x86, можем да реализираме истински Unix-ish или VMS-подобни ядра.
Модерните x86 операционни системи не само пренебрегват сегментирането (те просто задават C, D и S сегменти с основен адрес от 0 и размер от 4 GB; сегментите F и G понякога се използват за насочване към ключови структури от данни на операционната система). ), те до голяма степен пренебрегват неща като „сегменти на задачите“. Механизмът TSS е проектиран ясно за превключване на контекста на нишките, но се оказва, че има твърде много странични ефекти, така че модерните x86 операционни системи го правят “на ръка”. Единственият път, когато x86 NT променя хардуерните задачи е за някои наистина изключителни условия, като изключение с двойна грешка.
Що се отнася до x64 архитектурата, много от тези неизползвани функции бяха пропуснати. AMD всъщност разговаря с екипите на ядрото на операционната система и попита какво им е необходимо от x86, какво не им е нужно или не, и какво биха искали да добавят. Сегментите на x64 съществуват само в това, което може да се нарече рудиментарна форма, превключването на състоянието на задачите не съществува и т.н., а операционните системи продължават да използват само два пръстена.
Имате ли какво да добавите към обяснението? Звучи в коментарите. Искате ли да прочетете повече отговори от други технологични потребители на Stack Exchange? Вижте пълната тема за дискусия тук.