Які базові компоненти можна виділити у складі ОСЯкі базові компоненти можна виділити у складі ОС

0 Comment

Які базові компоненти можна виділити у складі ОС

В ОС насамперед необхідно виділити набір фундаментальних можливостей, які надають її компоненти; ці базові можливості становлять механізм (mechanism). З іншого боку, необхідно приймати рішення щодо використання зазначених можливостей; такі рішення визначають політику (policy). Отже, механізм показує, що реалізовано компонентом, а політика — як це можна використати. Коли за реалізацію механізму і політики відповідають різні компоненти (механізм відокремлений від політики), спрощується розробка системи і підвищується її гнучкість. Компонентам, що реалізують механізм, не повинна бути доступна інформація про причини та цілі його застосування; усе, що потрібно від них, — це виконувати призначену їм роботу. Для таких компонентів використовують термін «вільні від політики» (policy-free). Компоненти, відповідальні за політику, мають оперувати вільними від неї компонентами як будівельними блоками, для них недоступна інформація про деталі реалізації механізму.

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

Ядро системи. Привілейований режим і режим користувача

Базові компоненти ОС, які відповідають за найважливіші її функції, зазвичай перебувають у пам’яті постійно і виконуються у привілейованому режимі, називають ядром операційної системи (operating system kernel). Існуючі на сьогодні підходи до проектування архітектури ОС по-різному визначають функціональність ядра. До найважливіших функцій ОС, виконання яких звичайно покладають на ядро, належать обробка переривань, керування пам’яттю, керування введенням-виведенням. До надійності та продуктивності ядра висувають підвищені вимоги.

Основною характерною ознакою ядра є те, що воно виконується у привілейованому режимі. Розглянемо особливості цього режиму. Для забезпечення ефективного керування ресурсами комп’ютера ОС повинна мати певні привілеї щодо прикладних програм. Треба, щоб прикладні програми не втручалися в роботу ОС, і водночас ОС повинна мати можливість втрутитися в роботу будь-якої програми, наприклад для перемикання процесора або розв’язання конфлікту в боротьбі за ресурси. Для реалізації таких привілеїв потрібна апаратна підтримка: процесор має підтримувати принаймні два режими роботи – привілейований (захищений режим, режим ядра, kernel mode) і режим користувача (user mode). У режимі користувача недопустимі команди, які є критичними для роботи системи (перемикання задач, звертання до пам’яті за заданими межами, доступ до пристроїв введення-виведення тощо).

Розглянемо, яким чином використовуються різні режими процесора під час взаємодії між ядром і застосуваннями. Після завантаження ядро перемикає процесор у привілейований режим і отримує цілковитий контроль над комп’ютером. Кожне застосування запускається і виконується в режимі користувача, де воно не має доступу до ресурсів ядра й інших програм. Коли потрібно виконати дію, реалізовану в ядрі, застосування робить системний виклик (system call). Ядро перехоплює його, перемикає процесор у привілейований режим, виконує дію, перемикає процесор назад у режим користувача і повертає результат застосування.

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

Системне та мережне програмування

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

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

Системні виклики (system calls) – механізм, що дозволяє призначеним для користувача програмам звертатися до послуг ядра ОС, тобто це інтерфейс між операційною системою і призначеної для користувача програмою. Концептуально системний виклик схожий на звичайний виклик підпрограми. Основна відмінність полягає в тому, що при системному виклику виконання програми здійснюється в привілейованому режимі або режимі ядра. Тому системні виклики іноді ще називають програмними перериваннями, на відміну від апаратних переривань, які частіше називають просто перериваннями. У більшості операційних систем системний виклик є результатом виконання команди програмного переривання (INT). Таким чином, системний виклик – це синхронна подія.

Переривання (hardware interrupt)це подія, яка генерується зовнішнім (по відношенню до процесора) пристроєм. За допомогою апаратних переривань апаратура або інформує центральний процесор про те, що відбулася подія, що вимагає негайної реакції (наприклад, користувач натиснув клавішу), або повідомляє про завершення операції введення виведення (наприклад, закінчено читання даних з диска в основну пам’ять). Кожен тип апаратних переривань має власний номер, що однозначно визначає джерело переривання. Апаратне переривання – це асинхронна подія, тобто воно виникає незалежно від того, який код виконується процесором в даний момент. Обробка апаратного переривання не повинна враховувати, який процес або потік є поточним.

Виняткова ситуація (exception)подія, що виникає в результаті спроби виконання програмою команди, яка з якихось причин не може бути виконана до кінця. Прикладами таких команд можуть бути спроби доступу до ресурсу за відсутності достатніх привілеїв або звернення до відсутньої сторінці пам’яті. Виняткові ситуації, як і системні виклики, є синхронними подіями, що виникають в контексті поточної задачі. Виняткові ситуації можна розділити на виправні і невиправні. До виправних відносяться такі виняткові ситуації, як відсутність потрібної інформації в оперативній пам’яті. Після усунення причини виправної виняткової ситуації програма може виконуватися далі. Виникнення в процесі роботи операційної системи виправних виняткових ситуацій вважається нормальним явищем. Невиправні виняткові ситуації найчастіше виникають в результаті помилок в програмах (наприклад, розподіл на нуль). Зазвичай в таких випадках операційна система реагує завершенням програми, що викликала виняткову ситуацію.

Застосовуючи структурну обробку виключень, можна спробувати “виправити” непоправну виняткову ситуацію, повернувши управління програмою, яка згенерувала цю ситуацію.

Приклад програми реалізує структурну обробку виключень

Реалізація переривань, системних викликів і винятків
в ОС Windows

Розглянемо реалізацію основних механізмів операційної системи в ОС Windows. Слід зазначити, що термінологія корпорації Microsoft дещо відрізняється від загальноприйнятої. Наприклад,

системні виклики називаються системними сервісами,

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

Загальним для реалізації розглянутих основних механізмів є необхідність збереження стану поточного потоку з його подальшим відновленням.

Для цього в ОС Windows використовується механізм пасток (trap). У разі виникнення вимоги обробки події (переривання, виключення або виклику системного сервісу) процесор переходить в привілейований режим і передає управління оброблювачу пасток, що входить до складу ядра. Оброблювач пасток створює в стеку ядра фрейм пастки, що містить частину контексту потоку для подальшого відновлення його стану, і в свою чергу передає управління певної частини ОС, що відповідає за первинну обробку події, що сталася .

У типовому випадку зберігаються і згодом відновлюються:

  • програмний лічильник;
  • регістр стану процесора;
  • вміст інших регістрів процесора;
  • покажчики на стек ядра і призначений для користувача стек;
  • покажчики на адресний простір, в якому виконується потік (каталог таблиць сторінок процесу).

Ця інформація специфікована в структурі CONTEXT (файл winnt.h), і може бути отримана користувачем за допомогою функції GetThreadContext.

Адреса частини ядра ОС, відповідальної за обробку даного конкретного події визначається з вектору переривань, який номеру події ставить у відповідність адресу процедури його первинної обробки

Для асинхронних подій їх номер визначається контролером переривань, а для синхроннихядром.

Процедура перегляду вектору переривань, який в термінології корпорації Microsoft називається таблицею диспетчеризації переривань (interrupt dispatch table, IDT), за допомогою відладчика kd.

Наприклад, для x86 процесора переривання від клавіатури відповідає номер 0x52, системним сервісів – 0x2e, а виняткової ситуації, пов’язаної з сторінкової помилкою, – 0xE (див. Мал. 3.1).

Після проходження первинної обробки для кожної події передбачена процедура його подальшої обробки іншими частинами ОС. Наприклад, обробка системного сервісу (системного виклику) передбачає передачу управління за адресою 0x2e, де розташовується диспетчер системних сервісів, якому через регістри EAX і EBX передаються номер запитаного сервісу і список параметрів, переданих цьому системному сервісу.

Те ж саме відбувається в разі виникнення виключень і переривань.

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

Вторинна обробка переривання забезпечується драйверами відповідних пристроїв.

Як приклад розглянемо процедуру обробки створення файлу.

Виклик Win32 функції CreateFile() генерує передачу управління функції NtCreateFile виконавчої системи, асемблерний код якої містить наступні операції:

mov ЕАХ, Ox17 номер системного сервісу для NtCreateFile

int Ox2E обробка системного сервісу

ret Ox2C повернення управління

У більшості операційних систем апаратні переривання мають пріоритети, які визначаються контролерами переривань.

Однак ОС Windows має свою апаратно-незалежну шкалу пріоритетів, які називаються рівні запитів переривань (interrupt request levels, IRQL), і охоплює не тільки переривання, а всі події, що вимагають системної обробки. У таблиці 3.1 наведені значення IRQL рівнів для x86 систем.

Таблиця 3.1. Рівні запитів переривань (IRQL) в x86 системах