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

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

У Windows використовується багаторівнева структура драйверів, в якій високорівневі драйвери можуть грати роль фільтрів, що виконують спеціальну обробку даних, отриманих від драйвера низького рівня або переданих такому драйверу. В якості прикладу можна навести відділення драйвера, керуючого шиною, від драйверів конкретних пристроїв, підключених до шини. Ще один приклад - драйвер, який виконує шифрацию / дешифрацию даних при роботі з файловою системою NTFS. Структура драйверів усіх рівнів підпорядкована єдиним стандартам, відомим як WDM (Windows Diver Model), однак високорівневі драйвери, на відміну від низькорівневих, не займаються обробкою апаратних переривань.

Як не дивно, в Windows NT низькорівневі драйвери - це ще не самий нижній рівень управління пристроями. Ще ближче до апаратури лежить так званий рівень HAL (Hardware Abstractions Level, рівень апаратних абстракцій). Його роль - приховати від інших модулів ОС, в тому числі і від драйверів, деякі деталі роботи з апаратурою, що залежать від конкретних шин, типу материнської плати, способу підключення. Наприклад, HAL надає драйверам можливість звертатися до регістрів пристроїв по їх логічним номерам, не знаючи при цьому, чи підключений регістр до порту процесора або відображений на пам'ять.

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

· Драйвери GDI (Graphic Device Interface) являють собою високорівневі драйвери графічних пристроїв (моніторів, принтерів, плоттерів). Ці драйвери виконують трансляцію графічних викликів Windows (таких, як «провести лінію», «залити область», «видати текст», «вибрати поточний шрифт, поточне перо, поточну заливку») в команди, що виконують відповідні дії на конкретному пристрої. Видача цих команд на пристрій виконується вже іншим, низькорівневим драйвером. Завдяки наявності драйверів GDI одна і та ж програма може видавати графічне зображення на різні пристрої. Яскравий приклад цього - наявний в різних редакторах режим попереднього перегляду, який відображає сторінки на екрані точно в тому вигляді, як вони будуть надруковані.

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

· Драйвери віртуалізації пристроїв (VxD-драйвери) служать для того, щоб розділяти пристрої між процесами, створюючи ілюзію, що процес монопольно володіє пристроєм. Насправді драйвер організовує чергу заявок від процесів, перемикає пристрій в потрібний для чергового процесу режим і т.п. Прикладом може служити драйвер віртуалізації монітора. Консольний додаток (наприклад, програма MS-DOS) працює з усім екраном в текстовому режимі. Але якщо таке додаток запущено у вікні Windows, то VxD-драйвер імітує текстовий режим у графіку. Для цього драйвер повинен перехоплювати спроби програми звернутися безпосередньо до адрес відеопам'яті і перетворювати координати знакомест текстового режиму в координати відповідних позицій у вікні.