Немає перевірених версій цієї сторінки; ймовірно, її ще не перевіряли на відповідність правилам проекту.

Монолітне ядро (англ. Monolithic kernel) — класична і поширена сьогодні архітектура ядер операційних систем. Монолітні ядра надають багатий набір абстракцій устаткування. Всі частини монолітного ядра працюють в одному адресному просторі.

Структура операційних систем на монолітному ядрі, мікроядрі і гібридному ядрі

Монолітні ядра мають довгу історію розвитку і вдосконалення і, в цей час, є найбільш архітектурно зрілими і придатними до експлуатації. Разом з тим, монолітність ядер ускладнює їхню відладку, розуміння коду ядра, додавання нових функцій і можливостей, видалення «мертвого», непотрібного, успадкованого від попередніх версій, коду. «Розбухання» коду монолітних ядер також підвищує вимоги до обсягу оперативної пам'яті, потрібного для функціювання ядра ОС. Це робить монолітну ядерну архітектуру мало придатними до експлуатації в системах, сильно обмежених за обсягом пам'яті, наприклад, вбудовуваних системах, виробничих мікроконтролерах тощо.

Альтернативою монолітним ядрам вважається архітектура, заснована на мікроядрах.

Модульні ядра

ред.

Старі монолітні ядра вимагали перекомпіляції при будь-якій зміні складу устаткування. Більшість сучасних ядер, такі, як OpenVMS, Linux, FreeBSD, NetBSD і Solaris дозволяють під час роботи динамічно (за потреби) підвантажувати і вивантажувати модулі, що виконують частини функцій ядра. Практично, динамічне завантаження модулів, це просто гнучкіший спосіб зміни образу ядра під час виконання — на відміну від перезавантаження з іншим ядром. Модулі дозволяють легко розширити можливості ядра в міру необхідності. Динамічне підвантаження модулів допомагає зберегти розмір коду ядра, що працює в просторі, до мінімуму, наприклад, звести до мінімуму відбиток ядра для вбудовуваних пристроїв з обмеженими апаратними ресурсами.

Модульне ядро — сучасна, вдосконалена модифікація архітектури монолітних ядер операційних систем, на відміну від «класичних» монолітних ядер, що вважаються нині застарілими.

Всі модулі ядра працюють в адресному просторі ядра і можуть користуватися всіма функціями, що надаються ядром. Тому модульні ядра продовжують залишатися монолітними. Модульні ядра здійснюється на рівні бінарного образу, а не на архітектурному рівні ядра, оскільки динамічно підвантажувані модулі завантажуються в адресний простір ядра і надалі працюють як інтегральна частина ядра. Модульні монолітні ядра не слід плутати з архітектурним рівнем модульної, властивий мікроядрам і гібридним ядрам.

Модульні ядра зручніші для розробки, чим традиційні монолітні ядра, що не підтримують динамічне завантаження модулів, оскільки від розробника не потрібна багатократна повна перекомпіляція ядра при роботі над якоюсь його підсистемою або драйвером. Виявлення, локалізація, зневадження і усунення помилок при тестуванні також полегшуються.

Модульні ядра надають особливий програмний інтерфейс (API) для пов'язування модулів з ядром, для забезпечення динамічного підвантаження і вивантаження модулів. У свою чергу, не будь-яка програма може бути зроблена модулем ядра: на модулі ядра накладаються певні обмеження в частині використовуваних функцій (наприклад, вони не можуть користуватися функціями стандартної бібліотеки С/С++ і повинні використовувати спеціальні аналоги, що є функціями API ядра). Крім того, модулі ядра зобов'язані експортувати певні функції, потрібні ядру для правильного підключення і розпізнавання модуля, для його коректної ініціалізації при завантаженні і коректного завершення при вивантаженні, для реєстрації модуля в таблиці модулів ядра і для звернення з ядра до сервісів, що надається модулем.

Не всі частини ядра можуть бути зроблені модулями. Деякі частини ядра завжди мають бути присутніми в оперативній пам'яті і мають бути жорстко «вшиті» в ядро. Також не всі модулі допускають динамічне підвантаження (без перезавантаження ОС). Загальною тенденцією розвитку сучасних модульних ядер є все більша модулярізация коду, поліпшення механізмів динамічного підвантаження і вивантаження, зменшення або усунення необхідності в ручному підвантаженні модулів або в переконфігуруванні ядра при змінах апаратури шляхом введення тих або інших механізмів автоматичного визначення устаткування і автоматичного підвантаження потрібних модулів, універсалізація коду ядра і введення в ядро абстрактних механізмів, призначених для сумісного використання багатьма модулями. Прикладом може служити VFS — «віртуальна файлова система», спільно використовувана багатьма модулями файлових систем в ядрі Linux.

Література

ред.