Почему процессоры x86 используют только два из четырех «колец»?
Когда вы узнаете больше о том, как операционные системы и оборудование, на котором они работают, работают и взаимодействуют друг с другом, вы можете быть удивлены, увидев, что происходит как-то странно или не используется «ресурсы». Это почему? Сегодняшний пост SuperUser Q & A содержит ответ на любопытный вопрос читателя.
Сегодняшняя сессия вопросов и ответов пришла к нам благодаря 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 переходы в пределах Кольцо 1 код (опять же, NT не имеет ничего похожего на RMS в любом случае).
Что касается того, почему x86 реализовал четыре кольца, в то время как операционные системы их не использовали, вы говорите об операционных системах гораздо более свежего дизайна, чем x86. Многие функции системного программирования x86 были разработаны задолго до того, как на нем были реализованы ядра NT или настоящие Unix-версии, и они не знали, что будет использовать операционная система. Только когда мы получили подкачку на x86, мы смогли реализовать настоящие ядра Unix или VMS-подобные..
Современные операционные системы x86 не только в значительной степени игнорируют сегментирование (они просто устанавливают сегменты C, D и S с базовым адресом 0 и размером 4 ГБ; сегменты F и G иногда используются для указания на ключевые структуры данных операционной системы). ), они также в значительной степени игнорируют такие вещи, как «сегменты состояния задачи». Механизм TSS был явно разработан для переключения контекста потока, но, как оказалось, он имеет слишком много побочных эффектов, поэтому современные операционные системы x86 делают это «вручную». Единственный раз, когда x86 NT меняет аппаратные задачи, это некоторые действительно исключительные условия, такие как исключение двойной ошибки.
Что касается архитектуры x64, многие из этих неиспользуемых функций были исключены. К чести, AMD фактически поговорила с командами разработчиков ядра операционной системы и спросила, что им нужно от x86, что им не нужно или не нужно, и что они хотели бы добавить. Сегменты на x64 существуют только в том, что можно назвать рудиментарной формой, переключение состояний задачи не существует и т. Д., И операционные системы продолжают использовать только два кольца.
Есть что добавить к объяснению? Отключить звук в комментариях. Хотите узнать больше ответов от других технически подкованных пользователей Stack Exchange? Ознакомьтесь с полным обсуждением здесь.