Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС по С_Р.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.2 Mб
Скачать

2.2.1. Монолітне ядро

У системах з монолітною архітектурою все ядро працює на рівні супервізора. Ядро саме такої архітектури наведено на рис. 2.1.

До переваг такої системи належать:

  • простота розроблення, оскільки не потрібно розробляти до­датки для різних рівнів;

  • висока швидкість роботи за рахунок відсутності необхід­ності переключення між рівнями для взаємодії модулів ОС між собою, а така взаємодія відбувається досить часто через багатоша­рову архітектуру ОС.

Недоліки системи з монолітним ядром:

  • великий обсяг оперативної пам'яті, займаний ядром ОС, через що для програм користувача залишається менший обсяг пам'яті. З огляду на це такі ОС висувають високі вимоги до ресур­сів комп'ютера;

  • оскільки всі модулі працюють в одному адресному просто­рі, то збій одного модуля ОС може призвести до збою всієї системи. Отже, помилка в ядрі ОС дуже небезпечна, а безпосередня взаємо­дія між об'єктами ядра може призвести до краху системи в цілому через наявність помилок в окремих модулях.

33

Прикладами ОС з монолітним ядром є традиційні ядра UNIX, такі як BSD, LINUX.

У системах із мікроядерною архітектурою на рівні супер­візора працює тільки дуже невелика частина ОС, якій потрібен безпосередній доступ до апаратури. Інші модулі ОС працюють у користувальницькому режимі, вони називаються службами, або сервісами.

Прикладом мікроядерної ОС є система Mach, розроблена в університеті Карнегі — Медлона.

Що ж являє собою мікроядро? Аналогом мікроядра є набір функцій базового класу загального виду, застосовуваних в об'єкт­но-орієнтованому програмуванні. Мікроядро складається з не­великого (як правило) набору абстракцій, що не є операційною системою самі по собі, але дозволяють реалізувати ОС у вигляді служб, що використовуватимуть надані мікроядром сервіси. На­приклад, мікроядро Mach надає такі абстракції: задачі, потоки, об'єкти пам'яті, порти й повідомлення. Цього досить, щоб побуду­вати на їх базі повноцінну ОС лише за допомогою тих частин, що працюватимуть у користувальницькому режимі.

Функції ядра зазвичай не залежать від конкретної ОС. Мікро­ядро можна розглядати як набір необхідних служб і застосовувати їх у будь-якій ОС, як у розроблюваній, так і в існуючій. Зокрема, ці служби використовувалися в ОС з монолітним ядром; наприклад, Apple відобразила LINUX на мікроядро Mach для використання на процесорі PowerMac.

Назва «мікроядро» означає малий розмір ядра, воно надає набагато менше сервісів, ніж монолітне ядро. Існують системи, в яких мікроядро займає всього 32 кбайт.

Різниця між користувальницькими додатками і компонен­тами ОС, що працюють у користувальницькому режимі, є суто умовною. Вважають, що сервіс ОС відрізняється від додатка тим, що він надає певні послуги додаткам. Саме в цьому розумінні тут використовується термін «сервіс».

Розглянемо переваги і недоліки мікроядерної ОС.

Переваги мікроядерних ОС

Надзвичайно високий ступінь модульності й розширюва­ності. Використання ядра, що не залежить від конкретної ОС, є, безумовно, перевагою в порівнянні з використанням моноліт­ного ядра. Будь-які можливості ОС визначаються лише додатком ористувальницького режиму. Відповідно, простим запуском гулянкою таких додатків можна зовсім змінити систему.

Стабільність і безпека. Ці дві властивості системи залежать - _тьки від мікроядра. У зв'язку з невеликим розміром код для мік- ^zpa можна ретельно налагодити, виконати його верифікацію гральними, математичними методами. Інші компоненти не готичними, і їх можна легко запустити знов у випадку збою, к ільки в адресному просторі ядра працює лише невелике число гулів, збої в цих модулях не є критичними, вони не впливають н і роботу інших модулів, що працюють у користувальницькому ге жимі.

Простота програмування модулів користувальницького:режиму.Звичайне програмування користувальницьких додатківі програмування компонентів ОС істотно відрізняються. Так, ітялвери для DOS і різних версій WINDOWS мають неоднакову тстуру, для їх налагодження використовуються різні програм- н. середовища. Усередині драйверів використовуються функції знлілення пам'яті, уведення/виведення тощо, відмінні від анало- них функцій у користувальницькому режимі. У випадку ж мі- роядра і драйвер, і звичайний додаток користувача застосовують ті самі програмні засоби.

Недолік мікроядерної структури ядра

Недолік використання мікроядра — зниження швидкодії. Це пов'язано з тим, що взаємодія між окремими компонентами ОС і ядром, а також компонентами, що працюють у користуваль- Ендькому режимі, можлива тільки через ядро ОС. Так, ті дані, що монолітній системі компонент ядра міг просто прочитати із системної ділянки пам'яті, сервер мікроядерної системи змушений одержувати, використовуючи механізми міжпроцесної взаємодії PC InterProcess Communication). Таким чином, для забезпе- чеяня взаємодії необхідно кілька разів переходити від користу- : ільницького режиму до режиму ядра. Такі переходи між цими знями привілеїв відбирають багато процесорного часу.

2.2.3. Екзоядерна система

Мікроядро у своєму ідеальному прояві складається тільки : з засобів IPC (взаємодія користувальницьких додатків із модуля- чи ОС і модулів ОС між собою здійснюється за допомогою тих же засобів).

Розглянемо застосування концепції мікроядра на прикладі мікроядра операційної системи Tyros [11]. За основу IPC було обрано черги повідомлень. За необхідності взаємодії надсилається запит у вигляді повідомлення, яке вміщується в чергу повідом­лень. Якщо черга повідомлень повністю заповнена, то процес, що надіслав повідомлення, зупиняється, доки черга звільниться, і стане можливою передача повідомлення. Ядро містить у собі такі функції: send — надіслати повідомлення, recv — одержати повідом­лення і wait чекати повідомлення. Виклик recv є асинхронним, тобто відразу після запуску примітива recv виконується черговий оператор програми. Для синхронного відправлення повідомлення слід послідовно викликати recv і wait. Одержувачем і відправником повідомлення може бути об'єкт, якому виділяється процесорний час (для сучасних ОС це потоки, процеси або те й інше). Якщо в мікроядрі, крім IPC, повинні бути засоби виділення ресурсів, наприклад, пам'яті, то у випадку квазіядра ці можливості нада­ються через IPC.

Кожен сервер одержує у своє розпорядження лише ті систем­ні ресурси, на які він має право. Для додержання безпечного режи­му роботи в повідомленні задається рівень привілеїв об'єкта, який надіслав це повідомлення (модуль ОС або модуль користувача). Об'єкти користувача мають доступ тільки до IPC, а об'єкти ОС та­кож мають можливість запитати в ядра різні ресурси. Цей простий механізм захисту, подібний до наявних у сучасних процесорах, дозволяє серверам мікроядра створювати будь-які та як завгодно складні системи захисту. Це основна перевага цього типу ядра.

У наш час такі системи активно досліджуються, але повно­цінно працюючих ОС на цьому принципі поки що не існує. Це пов'язано з тим, що вони вимагають виділення всіх ресурсів мо­дулями, що працюють у користувальницькому режимі. Заува­жимо, що в DOS існувала можливість безконтрольного доступу до пристроїв у користувальницькому режимі, в якому працювали модулі ОС і користувальницькі модулі. Для забезпечення захисту в сучасних процесорах і ОС можливість керування зовнішніми пристроями можна включити тільки в режимі ядра. Наприклад, для процесора 1-32 мінімальний рівень пріоритету програми, що здатна керувати зовнішніми пристроями, визначається вмістом 12-го, 13-го бітів регістра ознаки (це поле називається IOPL, Input- Output Privilege Level). Наведемо фрагмент програми для визна­чення цього рівня:

Результат «О» відповідає рівню привілею «0», тобто можли­вість керування зовнішніми пристроями мають тільки модулі, які працюють на рівні привілею «0», що відповідає рівню ядра.

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

Змінити це поле може програма, рівень приві­лею якої не нижче, ніж той, що заданий у полі ІОРЬ.

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

У більшості сучасних ОС до складу ядра, як правило, входять такі модулі:

  • модулі керування введенням/виведенням, які використову­ються, насамперед, для завантаження самої ОС. У цьому випадку спочатку завантажується програма початкового завантаження під керуванням базисної системи введення/виведення (Basic Input/ Output System BIOS). Ця програма запускається на виконання і завантажує першу порцію модулів ОС. Інші модулі ОС заванта­жуються модулями ОС, завантаженими на попередньому кроці. У DOS завантаження виконується у два етапи, у сучасних ОС — у чотири і більше етапів. На кожному етапі можливості ОС з погляду керування введенням/виведенням увесь час розширю­ються. Найбільш розповсюдженими завантажувачами є NTLDR (NT — LoaDeR) — завантажувач ядра для сучасних WINDOWS, LILO (Linux LOader) — завантажувач ядра LINUX;

  • модуль керування пам'яттю. Для завантажуваних модулів ОС необхідно виділити пам'ять, куди будуть завантажені код і дані для модуля. Для запуску й виконання будь-якого додатка йому повинна бути виділена пам'ять, тому модуль керування пам'ят­тю звичайно постійно є присутнім у пам'яті. Якщо оперативної пам'яті для модуля, що завантажується, не вистачає, додаткова пам'ять повинна бути отримана за рахунок звільнення її шляхом скидання невикористовуваних у цей час даних і програми у спе­ціальний файл завантажування. Якщо програма і дані, що зараз повинні виконуватися, знаходяться в сторінковому файлі, вони повинні бути завантажені в оперативну пам'ять;

  • модуль керування процесами. Виконанням будь-якого до­датка керує ОС. Вона завантажує додаток у пам'ять2, запускає його на виконання, виділяє для нього пам'ять і час процесора, завершує його. Фактично завжди виконується не менше двох про­цесів — один або більше процесів ОС і користувальницькі процеси. Для забезпечення максимальної продуктивності й узгодження їх роботи, а також виключення небажаного впливу використовуєть­ся модуль керування процесами;

модуль для міжпроцесних з'єднань IPC. Важливість цього модуля розглянуто вище.

Розглянемо докладніше приклади ядер для сучасних ОС.

Ядро для WINDOWS 2000

Ядро містить такі модулі:

  • виконавча система (Ntoskrnl.exe), яка здійснює керування ::ам'яттю, введенням/виведенням даних, процесами і потоками, :-:ерує системою безпеки і міжпроцесними з'єднаннями;

  • драйвери (програми з розширенням sys), зокрема, драйвери пристроїв, драйвери файлових систем, драйвери для керування мережею;

  • апаратнозалежний рівень (Hardware Abstraction Layer — HAL.dll або hal.dll);

  • модулі підсистеми Win32 (Kernel32.dll, Advapi32.dll);

  • функції графічного та віконного інтерфейсу (User32.dll, Gdi32.dll).

Перелік компонентів ядра WINDOWS 2000 показує, що воно не є мікроядром у повному розумінні цього слова. У привілейсва- ному режимі виконуються не тільки основні компоненти системи модулі керування пам'яттю, введенням/виведенням, процесами), але й інші компоненти, такі як файлові системи, системи керуван­ня мережами й ін. Це зроблено для збільшення продуктивності системи. Таке ядро називають гібридним.

Для реалізації всіх компонентів застосовується переважно мова Сі. Мова Асемблер використовується тільки у випадку, якщо необхідно реалізувати код, який мовою високого рівня запрогра­мувати дуже важко, або код мовою Асемблер істотно виграє за про­дуктивністю. Крім цього, модуль HAL реалізований переважно мовою Асемблер.

Усі компоненти ядра, а також драйвери пристроїв використо­вують той самий адресний простір ядра. Це означає, що помилка в модулі або драйвері може зруйнувати інші компоненти ОС і драй­вери. Компоненти ОС і особливості побудови драйверів будуть роз­глянуті у наступних розділах.

>вува-

Зазвичай об'єкти використовують для складання програм, приховуючи їх будову. Саме ця властивість об'єктів використо­вується при застосуванні об'єктів ядра в користувальницьких програмах. Ідентифікатор об'єкта відомий користувальницькій програмі, тому вона може вказати на нього. Приховані властивості цього об'єкта і функції для користувальницьких додатків залиша­ються закритими.

До об'єктів ядра відносяться:

  • об'єкти керування, наприклад, асинхронні процедурні ви­клики (Asynchronous procedure calls АРС), функції відстроче­ного виклику (Deferred procedure call DPC3) і деякі об'єкти, що використовуються системою керування введенням/виведенням, такі як об'єкт переривання (interrupt object);

  • об'єкти диспетчеризації, наприклад, об'єкти синхронізації (подія, м'ютекс та ін.) тощо.

Апаратиозалежні компоненти ОС (Hardware Abstraction La­yer HAL) дозволяють зробити ОС багатоплатформною. Ядро ОС завантажує цей модуль для роботи в режимі ядра. З усіх модулів цього рівня на етапі інсталяції вибирається такий, що відповідає процесору. Цей модуль копіюється в системний каталог WIN­DOWS під ім'ям HAL.dll. Інші операційні системи, такі як VMS, вибирають необхідну бібліотеку DLL на етапі завантаження.

Ядро для UNIX і LINUX

У більшості версій UNIX і всіх версіях LINUX використову­ється монолітне ядро. Виняток становить версія UNIX Carnegie- Mellon's Mach 3.0, у якій використовується мікроядро, і DragonFly BSD, у якій використовується гібридне ядро.

Для зменшення обсягу пам'яті, необхідної для ядра, деякі його модулі (драйвери пристроїв) можуть завантажуватися і ви­вантажуватися з пам'яті в міру потреби. Ядра цих систем гра­нично мінімізовані й не містять жодної функції, що безпосередньо служить користувачеві. Ядро містить численні системні таблиці, списки, дерева, в яких знаходиться важлива системна інформа­ція, тому UNIX і LINUX називають системами, структура яких визначена даними. Робота систем у більшості випадків полягає в пошуку і модифікації цих даних, тому велика увага приділяєть­ся організації даних; так, якщо використовуються таблиці, то це, як правило, хеш-таблиці, якщо списки — то двонапрямлені зв'язані списки; якщо дерева, то збалансовані дерева [12].