Опитування пристроїв і переривання. Виняткові ситуації і системні виклики.

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

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

2. Процесор записує код команди виводу в порт регістра управління.

3. Процесор записує дані в порт регістра вхідних даних.

4. Процесор встановлює біт готовності команди. У наступних кроках процесор не задіяний.

5. Коли контроллер помічає, що біт готовності команди встановлений, він встановлює біт зайнятості.

6. Контроллер аналізує код команди в регістрі управління і виявляє, що це команда виводу. Він бере дані з регістра вхідних даних і ініціює виконання команди.

7. Після завершення операції контроллер обнуляє біт готовності команди.

8. При успішному завершенні операції контроллер обнуляє біт помилки в регістрі стану, при невдалому завершенні команди – встановлює його.

9. Контроллер скидає біт зайнятості.

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

Як видимий, на першому кроці (і, можливо, після кроку 4) процесор чекає звільнення пристрою, безперервно опитуючи значення біта зайнятості. Такий спосіб взаємодії процесора і контроллера отримав назву polling або, в російському перекладі, способу опиту пристроїв. Якщо швидкості роботи процесора і пристрою введення-виводу приблизно рівні, то це не приводить до істотного зменшення корисної роботи, що здійснюється процесором. Якщо ж швидкість роботи пристрою істотно менше швидкості процесора, то вказана техніка різко знижує продуктивність системи і необхідно застосовувати інший архітектурний підхід.

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

У простому випадку для реалізації механізму переривань необхідно до шин локальної магістралі, що є у нас, додати ще одну лінію, що сполучає процесор і пристрої введення-виводу – лінію переривань. Після закінчення виконання операції зовнішній пристрій виставляє на цю лінію спеціальний сигнал, по якому процесор після виконання чергової команди (або після завершення чергової ітерації при виконанні цепочечных команд, тобто команд, що повторюються циклічно із зрушенням по пам'яті) змінює свою поведінку. Замість виконання чергової команди з потоку команд він частково зберігає вміст своїх регістрів і переходить на виконання програми обробки переривання, розташованої за заздалегідь обумовленою адресою. За наявності тільки одній лінії переривань процесор при виконанні цієї програми повинен опитати стан всіх пристроїв введення-виводу, щоб визначити, від якого саме пристрої прийшло переривання (polling переривань!), виконати необхідні дії (наприклад, вивести в цей пристрій чергову порцію інформації або перевести відповідний процес із стану очікування в стан готовність) і повідомити пристрій, що переривання оброблене (зняти переривання).

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

Розглядаючи кооперацію процесів і взаємовиключає, ми говорили про існування критичних секцій усередині ядра операційної системи, при виконанні яких необхідно виключити всякі переривання від зовнішніх пристроїв. Для заборони переривань, а точніше, для несприйнятності процесора до зовнішніх переривань зазвичай існують спеціальні команди, які можуть маскувати (забороняти) всі або деякі з переривань пристроїв введення-виводу. В той же час певні кризові ситуації в обчислювальній системі (наприклад, неусувний збій в роботі оперативної пам'яті) повинні вимагати її негайної реакції. Такі ситуації викликають переривання, які неможливо замаскувати або заборонити і які поступають в процесор по спеціальній лінії шини переривань, званою лінією немаскованих переривань (NMI – Non-Maskable Interrupt).

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

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

Для зовнішніх переривань характерні наступні особливості.

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

· Процесор при переході на обробку переривання зберігає частину свого стану перед виконанням наступної команди.

· Переривання відбуваються асихронно з роботою процесора і непередбачувано, програміст жодним чином не може передбачити, в якому саме місці роботи програми відбудеться переривання.

· Виняткові ситуації виникають під час виконання процесором команди. До їх числа відносяться ситуації переповнювання, ділення на нуль, звернення до відсутньої сторінки пам'яті (див. частина III) і так далі Для виняткових ситуацій характерний наступне.

· Виняткові ситуації виявляються процесором під час виконання команд.

· Процесор при переході на виконання обробки виняткової ситуації зберігає частину свого стану перед виконанням поточної команди.

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

· Програмні переривання виникають після виконання спеціальних команд, як правило, для виконання привілейованих дій усередині системних викликів. Програмні переривання мають наступні властивості.

· Програмне переривання відбувається в результаті виконання спеціальної команди.

· Процесор при виконанні програмного переривання зберігає свій стан перед виконанням наступної команди.

· Програмні переривання, природно, виникають синхронно з роботою процесора і абсолютно передбачені програмістом.

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

Прямий доступ до пам'яті (Direct Memory Access – DMA)

Використання механізму переривань дозволяє розумно завантажувати процесор в той час, коли пристрій введення-виводу займається своєю роботою. Проте запис або читання великої кількості інформації з адресного простору введення-виводу (наприклад, з диска) приводять до великої кількості операцій введення-виводу, які повинен виконувати процесор. Для звільнення процесора від операцій послідовного виведення даних з оперативної пам'яті або послідовного введення в неї був запропонований механізм прямого доступу зовнішніх пристроїв до пам'яті – ПДП або Direct Memory Access – DMA. Давайте коротко розглянемо, як працює цей механізм.

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

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

При підключенні до системи нового пристрою, який уміє використовувати прямий доступ до пам'яті, зазвичай необхідно програмно або апаратний задати номер каналу DMA, до якого буде приписано пристрій. На відміну від переривань, де один номер переривання міг відповідати декільком пристроям, канали DMA завжди знаходяться в монопольному володінні пристроїв.