Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_Шеховцов_1.docx
Скачиваний:
73
Добавлен:
09.11.2019
Размер:
14.73 Mб
Скачать

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

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

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

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

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

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

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

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

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

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

15.4. Підсистема введення-виведення ядра

У цьому розділі йтиметься про деякі можливості, які надає підсистема введен­ня-виведення ядра, та їхнє місце в загальній інфраструктурі введення-виведення.

15.4.1. Планування операцій введення-виведення

Планування введення-виведення звичайно реалізоване як середньотермінове плану­вання, особливості якого описані в розділі 4 (розділ 4.2.2, рис. 4.2). Як відомо, з кож­ним пристроєм пов'язують чергу очікування, під час виконання блокувального

виклику (такого як read() або fcntl ()) потік поміщають у чергу для відповідного пристрою, з якої його звичайно вивільняє оброблювач переривання, як це було описано в розділі 15.3.2. Різним пристроям можуть присвоювати різні пріоритети.

Ще одним прикладом планування введення-виведення є дискове планування, розглянуте в розділі 12.