Домашня » як » Чому процесори x86 використовують лише два з чотирьох кільця?

    Чому процесори x86 використовують лише два з чотирьох кільця?

    Дізнавшись більше про те, як операційні системи та апаратні засоби працюють на роботі та взаємодіють один з одним, ви можете бути здивовані, побачивши, що, здається, дивацтва або недостатнє використання "ресурсів" відбувається. Чому так? Сьогоднішня стаття SuperUser Q&A має відповідь на запитання цікавого читача.

    Сьогоднішня сесія запитань та відповідей приходить до нас люб'язно SuperUser - підрозділ Stack Exchange, групування веб-сайтів із запитаннями та відповідями на рівні спільноти..

    Фото люб'язно надано Lemsipmatt (Flickr).

    Питання

    Читач SuperUser AdHominem хоче знати, чому процесори x86 використовують лише два з чотирьох кілець:

    Системи x86 на базі Linux і Windows використовують тільки Кільце 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-ish були реалізовані на ньому, і вони не знали, що саме буде використовувати операційна система. Це не було до того, як ми отримали пейджер на x86, що ми могли реалізувати справжні Unix-ish або VMS-подібні ядра.

    Сучасні операційні системи x86 значною мірою ігнорують сегментацію (вони просто налаштовують сегменти C, D і S з базовою адресою 0 і розміром 4 Гб; сегменти F та G іноді використовуються для вказівки на ключові структури даних операційної системи). ), вони також значною мірою ігнорують такі речі, як «сегменти завдання держави». Механізм TSS був чітко розроблений для перемикання контекстних потоків, але виявляється, що він має дуже багато побічних ефектів, тому сучасні операційні системи x86 роблять це «вручну». Єдиний час, коли x86 NT змінює апаратні завдання для деяких дійсно виняткових умов, наприклад виняток з подвійною помилкою.

    Що стосується архітектури x64, то багато цих вилучених функцій було виключено. На їхню честь, AMD дійсно розмовляв з командами ядра операційної системи і запитував, що їм потрібно від x86, чого їм не потрібно або не хоче, і що вони хотіли б додати. Сегменти на x64 існують тільки в тому, що можна назвати рудиментарною формою, перемикання стану завдання не існує і т.д., а операційні системи продовжують використовувати лише два кільця.


    Маєте щось додати до пояснення? Звучить в коментарях. Хочете прочитати більше відповідей від інших технологічних користувачів Stack Exchange? Перегляньте повний потік обговорення тут.