Введення-виведення, кероване перериваннями 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Введення-виведення, кероване перериваннями



Про концепцію переривань ішлося у розділах 2 і 3, а тут зупинимося на викори­станні переривань для організації введення-виведення та особливостях їхньої об­робки у драйверах пристроїв.

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

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

Рівні переривань

Насамперед необхідно мати можливість скасовувати або відкладати обробку пе­реривань під час виконання важливих дій.

Виходячи з цього, переривання поділяють на рівні відповідно до їхнього пріо­ритету (Interrupt Request Level, IRQL - рівень запиту переривання). Окремі фрагменти коду ОС можуть маскувати переривання, нижчі від певного рівня, скасовуючи їхнє отримання. Виділяють, крім того, немасковані переривання, от­римання яких не можна скасувати (апаратний збій пам'яті тощо).

Зазначимо, що за деяких умов переривання вищого рівня можуть переривати виконання оброблювачів нижчого рівня.

Встановлення оброблювачів переривань

Контролер переривань здійснює роботу з перериваннями на апаратному рівні. Він є спеціальною мікросхемою, що дає змогу відсилати сигнал процесору різними лініями. Процесор вибирає оброблювач переривання, на який потрібно перейти, на підставі номера лінії, що нею прийшов сигнал. її називають лінією запиту перериван­ня або просто лінією переривання (IRQ line). У старих архітектурах застосовували­сяконтролери переривань, розраховані на 15-16 ліній переривання і на один проце­сор, сучасні системи мають спеціальні розширені програмовані контролери переривань (Advanced Programmable Interrupt Controllers, APIC), які реалізують багато ліній пе­реривання (наприклад, для стандартного АРІС фірми Intel таких ліній 255) і корект­но розподіляють переривання між процесорами за умов багатопроцесорних систем.

Ядро ОС зберігає інформацію про всі лінії переривань, доступні у системі. Драй­вер пристрою дає запит каналу переривання (ÎRQ) перед використанням (вста­новленням оброблювача) і вивільняє після використання. Крім того, різні драй­вери можуть спільно використовувати лінії переривань.

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

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

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

♦ Драйвер може використати ці номери прямо, оскільки для деяких стандарт­них пристроїв номер лінії переривання документований і незмінний (або, як для паралельного порту, однозначно залежить від базової адреси відображу­ваної пам'яті). Але так можна робити далеко не для всіх пристроїв.

♦ Драйвер може виконати зондування (probing) пристрою. Під час зондування драйвер посилає контролеру пристрою запити на генерацію переривань, а по­тім перевіряє, яка з ліній переривань була активізована. Проте цей підхід є до­сить незручним, і його вважають застарілим.

♦ І, нарешті, найкращим є підхід, за якого пристрій сам «повідомляє», який но­мер переривання він використає. У цьому разі завданням драйвера є просте визначення цього номера, наприклад, читанням регістра статусу одного із пор­тів введення-виведення пристрою або спеціальної ділянки відображуваної па­м'яті. Більшість сучасних пристроїв допускають таке визначення конфігурації. До них належать, наприклад, усі пристрої шини РСІ (для них це визначено специфікацією, інформацію зберігають у спеціальному просторі конфігура­ції), а також ISA-пристрої, що підтримують специфікацію Plug and Play.

Особливості реалізації оброблювачів

Оброблювачі переривань — це звичайні послідовності інструкцій процесора; їх можна розробляти як на асемблері, так і мовами програмування високого рівня. В оброблювачах дозволено виконувати більшість операцій за деякими винятками:

♦ не можна обмінюватися даними із адресним простором режиму користувача, оскільки він не виконується у контексті процесу;

♦ не можна виконувати жодних дій, здатних спричинити очікування (явно викли­кати sleepO, звертатися до синхронізаційних об'єктів із викликами заблокувати, резервувати пам'ять за допомогою операцій, що призводять до сторінкового переривання). Фактично оброблювачі не можуть взаємодіяти із планувальником потоків. Основні дії оброблювача:

♦ повідомлення пристрою про те, що переривання оброблене (щоб той міг поча­ти приймати нові переривання);

♦ читання або записування даних відповідно до специфікації оброблюваного переривання;

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

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

Відкладена обробка переривань

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

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

Верхня половина (top half) — це безпосередньо оброблювач переривання, що виконується у відповідь на прихід сигналу відповідною лінією. Зазвичай у верх­ній половині здійснюють мінімально необхідну обробку (наприклад, повідомля­ють пристрій про те, що переривання оброблене), після чого вона планує до вико­нання другу частину.

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

Таку технологію називають відкладеною обробкою переривань, вона реалізова­на в усіх сучасних ОС. У Linux механізми реалізації коду нижньої половини, по­чинаючи із версії 2.4, називають тасклетами (tasklets), у Windows ХР - відкла­деними викликами процедур (deferred procedure calls, DPC).

 

15.3.3. Прямий доступ до пам'яті

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

Проблема полягає в тому, що процесор бере участь у кожній операції читання і записування, просто пересилаючи дані від пристрою у пам'ять і назад. Із цією за­дачею упорався б і простіший пристрій; зазначимо також, що розмір даних, які пересилають за одну операцію, обмежений розрядністю процесора (32 біти, для пересилання наступних 32 біт потрібна нова інструкція процесора). Якщо пере­ривання йдуть часто (наприклад, від жорсткого диска), то час їхньої обробки мо­же бути порівняний із часом, відпущеним для решти робіт. Бажано пересилати дані між пристроєм і пам'яттю більшими блоками і без участі процесора, а його у цей час зайняти більш продуктивними операціями.

Усе це спонукало до розробки контролерів прямого доступу до пам'яті (direct memory access, DMA). Такий контролер сам керує пересиланням блоків даних від пристрою безпосередньо у пам'ять, не залучаючи до цього процесора. Блоки да­них, які пересилають, завжди набагато більші, ніж розрядність процесора, на­приклад вони можуть бути завдовжки 4 Кбайт. Схема введення-виведення при цьому наприклад, буде такою:

♦ процесор дає команду DMA-контролеру виконати читання блоку від прист­рою, разом із командою він відсилає контролеру адресу буфера для введен­ня-виведення (такий буфер має бути у фізичній пам'яті);

♦ DMA-контролер починає пересилання, процесор у цей час може виконувати інші інструкції;

♦ після завершення пересилання всього блоку DMA-контролер генерує перери­вання;

♦ оброблювач переривання (нижня половина) завершує обробку операції чи­тання, наприклад переміщуючи дані із фізичного буфера у сторінкову пам'ять. Процесор тут бере участь тільки на початку операції та в кінці - за все інше

відповідає контролер прямого доступу до пам'яті.

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

 



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 268; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.134.81.206 (0.008 с.)