Драйвери пристроїв

Драйвер пристрою - це системна програма, яка під управлінням ОС виконує всі операції з конкретним периферійним пристроєм. Драйвер є ніби посередником між ОС і пристроєм. Перед драйверами стоять дві однаково важливі, але важко сумісні завдання:

· Забезпечити можливість стандартного звернення до будь-якого пристрою, приховуючи від інших частин ОС специфічні особливості окремих пристроїв;

· Досягти максимально ефективного використання всіх функціональних можливостей і особливостей конкретних пристроїв.

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

Зрозуміло, повністю приховати всі відмінності між пристроями неможливо. Ніяким чином не можна прирівняти, скажімо, диск до клавіатури, і навіть різні типи дисків схожі, але не зовсім. Наприклад, для дискет можна виконати таку операцію, як перевірка зміни носія (фактично при цьому перевіряється, відкривався чи кишеню дисковода). Для жорстких дисків ця операція не має сенсу.

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

Звертаючись до драйвера, ОС вказує функцію, яку потрібно виконати.

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

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

Типовий драйвер пристрою містить, як мінімум, три основні блоки:

· Заголовок драйвера;

· Блок стратегії;

· Блок переривань.

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

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

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

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

Крім трьох основних блоків, в різних ОС драйвери можуть містити, наприклад, блок ініціалізації (він використовується один раз при завантаженні ОС, а потім може бути вивантажений з пам'яті), блок зміни параметрів драйвера та ін

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