Багаторівневі драйвери
У колишніх ОС драйвер разом з контролером пристрою та прикладною програмою втілювали ідею багатошарового підходу до організації програмного забезпечення: контролер представляв нижній шар управління пристроєм, драйвер виконував складніші операції, прикладна програма вже працювала з даними, перетвореними на досить зрозумілу для людини форму – файлами, текстовими вікнами на моніторі тощо, не вдаючись у деталі представлення цих даних у пристроях вводу-виводу.
Поступово, у міру розвитку операційних систем та ускладнення структури підсистеми введення-виводу, поряд з традиційними драйверами в операційних системах з'явилися так звані високорівневі драйвери, які розташовуються в загальній моделі підсистеми введення-виводу над традиційними драйверами. Поява високорівневих. можна вважати подальшим розвитком ідеї багатошарової організації підсистеми введення-виведення. Замість того, щоб концентрувати всі функції управління пристроєм в одному програмному модулі, в багатьох випадках набагато ефективніше розподілити їх між декількома модулями в сусідніх шарах ієрархії. Традиційні драйвери, які стали називати апаратними драйверами, низькорівневими драйверами або драйверами пристроїв, звільняються від високорівневих функцій і займаються лише низькорівневими операціями. Ці низькорівневі операції становлять фундамент, у якому можна побудувати той чи інший набір операцій у драйверах вищих рівнів.
При такому підході підвищується гнучкість і розширюваність функцій управління пристроєм: якщо різним додаткам необхідно працювати з різними логічними моделями одного і того ж фізичного пристрою, то для цього достатньо встановити в системі кілька драйверів на одному рівні,працюючих над одним апаратним драйвером.
Кількість рівнів драйверів у підсистемі вводу-виводу зазвичай не обмежується якоюсь межею, але на практиці найчастіше використовують від двох до п'яти рівнів драйверів - занадто велика кількість рівнів може знизити швидкість операцій вводу-виводу. Декілька драйверів, які керують одним пристроєм, але на різних рівнях, можна розглядати як набір окремих драйверів або один багаторівневий драйвер.
Високорівневі драйвери оформляються за тими самими правилами і дотримуються тих самих внутрішніх інтерфейсів, як і апаратні драйвери. Єдиною відмінністю є те, що високорівневі драйвери, як правило, не викликаються перериваннями, так як взаємодіють з керованим пристроєм через посередництво апаратних драйверів. Менеджер вводу-виводу керує драйверами однотипно, незалежно від того, до якого рівня він належить. За наявності великої кількості драйверів різного рівня ускладнюються зв'язки між ними, що, у свою чергу, ускладнює їхню взаємодію, і саме ця ситуація призвела до стандартизації внутрішнього інтерфейсу в підсистемі введення-виведення та виділення спеціальної оболонки у вигляді менеджера введення-виводу, виконує службові функції з організації роботи драйверів.
Приклад 1.
У підсистемі керування графічними пристроями, такими як графічні монітори та принтери, існує кілька рівнів драйверів. На нижньому рівні працюють апаратні драйвери, які дозволяють керувати конкретним графічним адаптером або принтером певного типу, змушуючи їх виконувати деякий набір примітивних графічних операцій: виведення точки, кола, заповнення області кольором, виведення символів тощо. Високорівневі графічні драйвери будують на базіБільш потужні операції, наприклад масштабування зображення, перетворення графічного формату відповідно до роздільних можливостей пристрою і т.п. графічні дані. Менеджер керує вікнами, відображаючи їх у певну область фізичного екрану або роблячи їх невидимими, а також надає до них спільний доступ із контролем прав доступу. Менеджер вікон не залежить від особливостей конкретного графічного пристрою, надаючи високорівневим драйверам займатися перетворенням форматів даних.
Приклад 2.
В уніфікацію драйверів великий внесок зробила операційна система UNIX. У ній всі драйвери були розділені на два великі класи: блок-орієнтовані (block-oriented) драйвери та байт-орієнтовані (character-oriented) драйвери.
Операційна система UNIX свого часу зробила ще один важливий крок щодо уніфікації операцій та структуризації програмного забезпечення введення-виведення. У ОС UNIX всі пристрої розглядаються як деякі віртуальні (спеціальні) файли, що дозволяє використовувати загальний набір базових операцій вводу-виводу для будь-яких пристроїв незалежно від їх специфіки.
Спеціальні файли
Спеціальні файли, які називаються іноді віртуальними, не пов'язані зі статичними наборами даних, що зберігаються на дисках, є зручним уніфікованим представленням пристроїв вводу-виводу.
Поняття спеціального файла з'явилося операційній системі UNIX. Спеціальний файл завжди пов'язаний з деяким пристроєм введення-виводу і представляє його для решти операційної системи таприкладних процесів у вигляді неструктурованого набору байт. Зі спеціальним файлом можна працювати так само, як і зі звичайним, тобто відкривати, зчитувати з нього певну кількість байт або ж записувати в нього певну кількість байт, а після завершення операції закривати. Для цього використовуються самі системні виклики, що і для роботи зі звичайними файлами: open, create, read, write і close. Таким чином, щоб вивести на алфавітно-цифровий термінал, з яким пов'язаний спеціальний файл /dev/tty3, повідомлення "Hello, friends!", достатньо відкрити цей файл за допомогою системного виклику open:
fd = open ("/de/tty3". 2)
Потім можна вивести повідомлення за допомогою системного дзвінка write:
write (fd, "Hello, friends!". 15)
Для пристроїв прямого доступу має сенс також покажчик поточного положення файлу, яким можна керувати за допомогою системного виклику lseek.
Очевидно, що представлення пристрою у вигляді файлу та використання для керування пристроєм файлових системних дзвінків у багатьох випадках дозволяє виконувати лише прості операції.
Традиційно спеціальні файли розміщуються в каталогі /dev, хоча ніщо не заважає створити їх у будь-якому каталозі файлової системи. При появі нового пристрою та відповідно нового драйвера адміністратор системи може створити новий запис за допомогою команди mknod. Наприклад, наступна команда створює блок-орієнтований спеціальний файл:
mknod /dev/dsk/sc4d2s3 b 32 33