Режими процесора й архітектурні моделі ядра
Операційна система має захищати ресурси, але сама повинна виконувати дії, заборонені звичайним програмам: налаштовувати пам'ять, обробляти переривання та керувати пристроями. Апаратна підтримка привілеїв розділяє ці можливості. Архітектура ядра, своєю чергою, визначає, скільки системних компонентів працює з найвищими привілеями та як вони взаємодіють.
Цілі лекції
Після опрацювання матеріалу ви зможете:
- пояснювати відмінність між User Mode і Kernel Mode;
- описувати роль привілейованих інструкцій, захисту пам'яті та контрольованого переходу до ядра;
- співвідносити режими ОС із кільцями привілеїв x86 без хибного ототожнення цих понять;
- пояснювати, чому кільця 1 і 2 рідко використовуються сучасними універсальними ОС;
- розрізняти монолітну, мікроядерну, гібридну та екзоядерну моделі;
- порівнювати моделі за продуктивністю, ізоляцією, надійністю та складністю;
- обирати аргументовану модель для заданого сценарію, не шукаючи універсального переможця.
Передумови
Потрібно розуміти роль ОС як менеджера ресурсів, знати поняття ядра, процесу, пам'яті, драйвера та API (англ. Application Programming Interface — прикладний програмний інтерфейс) на оглядовому рівні. Адміністративні права й зміна налаштувань системи не потрібні.
1. Навіщо процесору рівні привілеїв
Уявімо, що будь-яка прикладна програма може довільно:
- змінювати таблиці відображення пам'яті;
- вимикати обробку переривань;
- безпосередньо програмувати контролер накопичувача;
- читати пам'ять іншого процесу;
- зупиняти процесор.
Тоді помилка текстового редактора могла б пошкодити дані всієї системи, а шкідлива програма - обійти контроль доступу. Для створення межі процесор підтримує стани з різними повноваженнями, а ОС налаштовує механізми захисту пам'яті й пристроїв.
Привілейована інструкція - інструкція, яку дозволено виконувати лише на достатньому рівні привілеїв. Якщо процес у непривілейованому режимі намагається виконати таку інструкцію, процесор не виконує її як звичайну дію, а передає керування обробнику ОС через виняток.
Захист не базується на ввічливості програми. Він має апаратне підґрунтя: поточний рівень привілеїв, контроль доступу до сторінок пам'яті та правила виконання інструкцій.
2. User Mode і Kernel Mode
User Mode - непривілейований режим, у якому працює більшість прикладного коду. Назва не означає, що код обов'язково запускає людина або що він має графічний інтерфейс. Системна фонова служба теж може більшу частину часу виконуватися в User Mode.
Kernel Mode - привілейований режим для коду ядра. Він дозволяє виконувати операції, необхідні для керування всією системою. Kernel Mode не означає, що будь-який код у ньому автоматично правильний або безпечний. Навпаки, помилка привілейованого компонента має більший потенційний вплив.
| Властивість | User Mode | Kernel Mode |
|---|---|---|
| типова роль | застосунки та частина системних служб | ядро й привілейовані драйвери |
| доступ до пам'яті | лише дозволені відображення процесу | доступ до системної пам'яті за правилами ядра |
| привілейовані інструкції | заборонені | дозволені |
| прямий доступ до пристроїв | зазвичай через ядро | контролюється ядром і драйверами |
| наслідок помилки | часто завершується окремий процес | можливий збій або компрометація всієї системи |
Поділ режимів реалізує принцип найменших привілеїв: компонент отримує лише ті повноваження, які потрібні для його роботи.
3. Контрольований перехід до ядра
Програма в User Mode не може самостійно виконати привілейовану операцію, як-от прочитати файл або створити процес. Вона просить ядро через системний виклик (system call) - контрольовану передачу керування до визначеної точки входу ядра. Програма не обирає довільну адресу всередині ядра, а потрапляє туди, де ядро перевіряє запит і права.
Такий перехід має вартість, але є платою за межу між режимами. Детальну механіку системних викликів, переривань і винятків розглянемо в наступній лекції.
4. Кільця привілеїв x86
Архітектура x86 описує чотири кільця привілеїв від 0 до 3:
- Ring 0 має найвищі привілеї;
- Ring 1 і Ring 2 мають проміжні рівні;
- Ring 3 має найменші привілеї.
У поширеній моделі сучасних універсальних x86-ОС ядро працює в Ring 0, а застосунки - у Ring 3. Ring 1 і Ring 2 зазвичай не використовуються для звичайного поділу компонентів. Одна з причин полягає в тому, що переносна ОС має працювати й на архітектурах з іншою моделлю привілеїв; інша - двох основних рівнів достатньо для поширеної межі «ядро - користувацький процес».
Не слід вважати, що Kernel Mode завжди буквально означає Ring 0 на будь-якому процесорі. User Mode і Kernel Mode - поняття моделі ОС, а rings - конкретний механізм x86. ARM (англ. Advanced RISC Machine — архітектура процесорів ARM), наприклад, використовує рівні винятків EL0, EL1 та інші.
Віртуалізація додає окремі механізми, наприклад VMX (англ. Virtual Machine Extensions — розширення віртуалізації Intel) root/non-root на Intel. Їх не варто спрощено називати «Ring -1» у формальному описі: це популярна метафора, а не номер кільця в базовій моделі x86.
5. Що саме називають архітектурою ядра
Архітектурна модель відповідає на запитання:
- які служби входять до привілейованого ядра;
- у яких адресних просторах виконуються драйвери й системні сервери;
- як компоненти обмінюються запитами;
- де проходять межі відмови й довіри;
- як систему розширюють та оновлюють.
Реальні ОС розвиваються десятиліттями й рідко точно відповідають одному навчальному рисунку. Назви моделей описують переважну організаційну ідею, а не кожну деталь реалізації.
6. Монолітне ядро
У монолітній моделі основні служби ОС працюють у спільному привілейованому адресному просторі: планувальник, керування пам'яттю, файлові системи, мережевий стек і багато драйверів. Компоненти можуть викликати один одного як звичайні внутрішні функції.
Переваги:
- короткий шлях виклику між підсистемами;
- низькі накладні витрати на обмін усередині ядра;
- зручний спільний доступ до внутрішніх структур;
- висока продуктивність для багатьох навантажень.
Обмеження:
- велика довірена кодова база;
- помилка драйвера може пошкодити стан ядра;
- сильні внутрішні залежності ускладнюють перевірку;
- межа відмови часто охоплює всю систему.
Linux класифікують як модульне монолітне ядро. Завантажувані модулі дозволяють додавати частину драйверів і функцій під час роботи, але модуль у Kernel Mode не отримує ізоляцію user-space процесу. Модульність покращує структуру й розгортання, але сама по собі не перетворює ядро на мікроядро.
7. Мікроядро
Мікроядро залишає в привілейованому ядрі мінімальний набір механізмів, зазвичай планування, базове керування адресними просторами, переривання та міжпроцесну взаємодію. Файлові системи, мережеві служби й частина драйверів можуть працювати як окремі сервери в User Mode.
Переваги:
- менша привілейована й довірена кодова база;
- ізоляція служб в окремих адресних просторах;
- можливість перезапустити деякі служби без падіння ядра;
- чіткі інтерфейси обміну полегшують аналіз і формальну верифікацію.
Обмеження:
- більше IPC (англ. Inter-Process Communication — міжпроцесна взаємодія) і переходів між адресними просторами;
- складніше спроєктувати ефективні протоколи серверів;
- діагностика розподіленої взаємодії може бути складною;
- погано реалізований IPC створює суттєві накладні витрати.
QNX є відомим промисловим прикладом мікроядерної системи. seL4 демонструє можливість формальної верифікації важливих властивостей мікроядра. Сам термін «мікроядро» не гарантує безпеки: якість залежить від реалізації, конфігурації та решти системи.
8. Гібридне ядро
Гібридна модель поєднує ідеї монолітних і мікроядерних систем. Архітектура може мати мікроядерне походження або структурні межі, але для продуктивності значну частину служб виконує в Kernel Mode.
Windows NT часто описують як гібридну архітектуру: вона має розділені компоненти, HAL, Kernel та Executive, але багато системних служб і драйверів працюють у привілейованому просторі. XNU у macOS поєднує Mach, BSD і I/O Kit, тому його також класифікують як гібридне ядро.
Перевага гібридного підходу - можливість поєднати структурованість із практичною продуктивністю та сумісністю. Ризик - система може успадкувати складність обох підходів, а назва «гібридна» сама по собі мало говорить про конкретну межу відмови. Потрібно аналізувати компоненти, а не лише етикетку.
9. Екзоядро
Екзоядро (exokernel) мінімізує нав'язані ядром високорівневі абстракції. Ядро безпечно розподіляє та захищає фізичні ресурси, а бібліотечна ОС у просторі застосунку будує потрібні абстракції, наприклад власну політику пам'яті або файлового доступу.
Переваги:
- застосунок може спеціалізувати політики під конкретне навантаження;
- менше непотрібних шарів між програмою й ресурсом;
- зручний простір для дослідження нових абстракцій.
Обмеження:
- значно складніше створювати й переносити застосунки;
- бібліотечні ОС можуть дублювати функціональність;
- сумісність і загальне адміністрування ускладнюються;
- модель залишається переважно дослідницькою, а не масовою настільною практикою.
Екзоядро не дає програмам безконтрольного доступу до обладнання. Його ключова роль саме в безпечному мультиплексуванні ресурсів.
10. Порівняння компромісів
| Критерій | Монолітна | Мікроядерна | Гібридна | Екзоядерна |
|---|---|---|---|---|
| обсяг коду в Kernel Mode | великий | мінімальний | значний, але структурований | мінімум для захисту й розподілу |
| взаємодія служб | внутрішні виклики | IPC між серверами | поєднання викликів та IPC | бібліотечні абстракції над ресурсами |
| типова сильна сторона | продуктивність і зріла інтеграція | ізоляція та аналізованість | практичний баланс і сумісність | спеціалізація політик |
| типовий ризик | велика межа відмови | накладні витрати та складні протоколи | висока загальна складність | складність розробки й сумісності |
| приклади | Linux, багато Unix | QNX, seL4 | Windows NT (англ. New Technology — сімейство операційних систем Windows), XNU (англ. X is Not Unix — ядро macOS) | MIT Exokernel як дослідницька система |
Таблиця показує тенденції, а не виміряні гарантії. Оптимізоване мікроядро може бути достатньо швидким, а монолітне ядро може мати якісні внутрішні межі й захисні механізми. Порівняння потребує конкретного навантаження, апаратури та реалізації.
11. Безпечна модель вибору
Наступна програма не вимірює реальні ядра й не змінює систему. Вона лише робить задані ваги компромісів явними:
models = {
"монолітна": {"швидкодія": 5, "ізоляція": 2, "гнучкість": 3},
"мікроядерна": {"швидкодія": 3, "ізоляція": 5, "гнучкість": 4},
"гібридна": {"швидкодія": 4, "ізоляція": 3, "гнучкість": 4},
"екзоядерна": {"швидкодія": 4, "ізоляція": 4, "гнучкість": 5},
}
weights = {"швидкодія": 2, "ізоляція": 5, "гнучкість": 1}
for name, scores in models.items():
total = sum(scores[key] * weights[key] for key in weights)
print(f"{name}: {total}")
Очікуваний результат для цих навчальних оцінок:
монолітна: 23
мікроядерна: 35
гібридна: 27
екзоядерна: 33
Числа не є універсальним рейтингом ОС. Вони демонструють метод: спочатку зафіксувати критерії та їхню важливість, потім пояснити оцінки. Якщо змінити ваги, зміниться рішення.
12. Поетапна практична робота
Крок 1. Відтворення
Запустіть модель з наведеними вагами. Перевірте кожну суму вручну. Наприклад, для мікроядерної моделі: 3 * 2 + 5 * 5 + 4 * 1 = 35.
Крок 2. Модифікація
Для мультимедійної робочої станції задайте вагу швидкодії 5, ізоляції 2, гнучкості 2. Порівняйте результат, але не називайте найбільшу суму доказом переваги реальної ОС: початкові оцінки навчальні.
Крок 3. Прикладний вибір
Система керує критичним промисловим пристроєм. Відмова драйвера не повинна зупинити інші служби, а поведінка має бути аналізованою. Обґрунтуйте мікроядерну модель як сильного кандидата через ізоляцію служб і меншу довірену базу. Потім назвіть перевірки, яких бракує: часові обмеження, сертифікація, підтримка обладнання та виміряна продуктивність конкретної реалізації.
Підсумок
- Апаратні привілеї не дозволяють звичайній програмі довільно керувати всією системою.
- Застосунки переважно працюють у User Mode, а ядро - у Kernel Mode.
- Системний виклик є контрольованим переходом до служби ядра, а не довільним стрибком у привілейований код.
- На x86 ядро зазвичай використовує Ring 0, застосунки - Ring 3; поняття rings не є універсальною назвою режимів усіх процесорів.
- Монолітне ядро забезпечує прямі внутрішні виклики, але має велику привілейовану базу.
- Мікроядро виносить служби в User Mode, покращуючи ізоляцію ціною додаткових IPC і переходів.
- Гібридне ядро практично поєднує кілька підходів, але потребує аналізу реальних меж компонентів.
- Екзоядро захищає й розподіляє ресурси, залишаючи високорівневі абстракції бібліотечним ОС.
- Архітектуру обирають за вимогами та вимірюваннями; універсально найкращої моделі немає.
