If-Koubou

Защо процесорите x86 използват само два от четирите "пръстена"?

Защо процесорите x86 използват само два от четирите "пръстена"? (Как да)

Когато научите повече за това как работят операционните системи и хардуера, които работят, и взаимодействате помежду си, може да се изненадате да видите какво изглежда странно или недостатъчно използване на "ресурси". Защо така? Днешната публикация "SuperUser Q & A" е отговорът на въпроса на любознателен читател.

Днешната сесия за въпроси и отговори ни идва с любезното съдействие на SuperUser - подразделение на Stack Exchange - обединяване на уеб сайтове с въпроси и отговори.

Снимката е предоставена от Lemsipmatt (Flickr).

Въпроса

Reader на SuperUser AdHominem иска да разбере защо процесорите x86 използват само два от четирите пръстена:

Linux и Windows базирани x86 системи използват само Пръстен 0 за режима на ядрото и Пръстен 3 за потребителския режим. Защо процесорите дори разграничават четири различни пръстена, ако всички в крайна сметка просто използват две от тях, така или иначе? Променено ли е това с архитектурата AMD64?

Защо процесорите x86 използват само два от четирите позвънявания?

Отговорът

Доставчикът на SuperUser Jamie Hanrahan има отговор за нас:

Има две основни причини.

Първият е, че въпреки че процесорните процесори x86 предлагат четири пръстена за защита на паметта, предлаганата по-голяма степен на защита е само на ниво сегмент. Това означава, че всеки сегмент може да бъде настроен на конкретен пръстен (ниво на привилегия), заедно с други защити като забранени за писане. Но няма много дескриптори на сегмента. Повечето операционни системи биха искали да имат много по-фина грануларност на защитата на паметта, като ... за отделни страници.

Така че, въведете защитата на базата на таблицата. Повечето, ако не всички съвременни операционни системи x86 игнорират механизмите за сегментиране (колкото и да могат) и разчитат на наличната защита от битовете с нисък ред в записите в таблицата на страниците. Една от тях се нарича "привилегирован" бит. Този бит контролира дали процесорът трябва да бъде в едно от "привилегированите" нива за достъп до страницата. Привилегированите нива са PL 0, 1 и 2, Но това е само един бит, така че при нивото на защита на страниците, броят на наличните "режими" по отношение на защитата на паметта е само две: Страницата може да бъде достъпна от непривилегирован режим или не. Следователно само два пръстена. За да има четири възможни позвънявания за всяка страница, те би трябвало да имат два бита за защита във всеки запис на таблица на страници, за да кодират един от четирите възможни номера на позвъняванията (точно както дескрипторите на сегмента). Те обаче не го правят.

Другата причина е желанието за преносимост на операционната система. Това не е просто x86; Unix ни учи, че една операционна система може да бъде сравнително преносима към архитектурите на множество процесори и че това е нещо добро. Някои процесори поддържат само два пръстена. Като не зависи от множеството пръстени в архитектурата, изпълнителите на операционната система направиха операционните системи по-преносими.

Има трета причина, която е специфична за развитието на Windows NT. Дизайнерите на NT (Дейвид Кътлър и неговият екип, които Microsoft наеха далеч от DEC Western Lab Labs) имаха богат опит в VMS; всъщност Кътлър и някои от другите бяха сред оригиналните дизайнери на VMS. И процесорът VAX, за който е проектиран VMS, има четири пръстена (VMS използва четири пръстена).

Но компонентите, които се изпълняват в VMS's Пръстени 1 и 2 (Record Management Services и CLI, съответно) останаха извън дизайна на NT. Пръстен 2 в VMS не се отнасяше всъщност към сигурността на операционната система, а по-скоро към запазването на клиентската среда CLI от една програма в друга и Windows не разполагаше с тази концепция; CLI работи като обикновен процес. Що се отнася до VMS's Пръстен 1, RMS кодът в Пръстен 1 трябваше да се обадя Пръстен 0 доста често, а преходът на пръстените е скъп. Оказа се, че е много по-ефективно да отида Пръстен 0 и да се направи с него, вместо да има много Пръстен 0 преходи в рамките на Пръстен 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? Вижте цялата тема на дискусията тук.