6. Драйвери
Насправді про жодну повну сумісність лише на рівні портів ввода/вывода і протоколів обміну даними говорити годі й говорити. Тому, наприклад, разом з текстовим процесором Microsoft Word for MS-DOS поставляються десятки драйверів принтера, по одному для кожної моделі принтера або сімейства моделей принтерів.
Чи може програміст врахувати всі особливості апаратури, а також тієї, що з'явиться в майбутньому? Очевидно, не може, якщо, звичайно, у нього немає дару ясновидіння, а також необмеженого запасу часу на тестування своєї програми для нескінченних конфігурацій та моделей апаратного забезпечення. Нам зустрічалося безліч програм, які могли працювати тільки з тією апаратурою, що була у розробника. Наприклад, бухгалтерські програми, які "вміли" друкувати документи тільки на принтері Epson FX-850, програми, які встановлювалися лише з диска A: ємністю 360 Кбайт і т.д.
Чи є спосіб ізолювати розробника програмного забезпечення від апаратури комп'ютера?
Усі сучасні операційні системи звертаються до периферійних пристроїв через спеціальні програмні модулі – драйвери. У таких операційних системах, як Windows NT, OS/2 або UNIX звичайна програма не може викликати команди вводу/виводу. Для звернення до периферійного пристрою вона прямо чи опосередковано (через операційну систему) має викликати драйвер.
Оскільки драйвер пристрою створюється розробником пристрою, всі особливості апаратури залишаються прихованими для операційної системи та програміста. Користуючись стандартним для кожної операційної системи інтерфейсом, програма користувача або операційна система звертається до драйвера для виконання операцій управління, введення або виведення.
Операційна системаMS-DOS також використовує механізм драйверів. Однак драйвери MS-DOS не завжди звертаються безпосередньо до апаратури. Зазвичай вони викликають функції BIOS і вже BIOS виконує всі операції вводу/виводу. Звісно, BIOS містить програми обслуговування лише стандартної периферії, нестандартні пристрої обслуговуються драйверами напряму.
Використання BIOS як додаткового інтерфейсу між драйверами стандартних пристроїв та апаратурою різко підвищує "живучість" MS-DOS на персональних комп'ютерах, які не цілком сумісні з IBM PC. І це справді так - найпоширеніша на сьогоднішній день операційна система MS-DOS працює на всіх комп'ютерах, хоч скільки-небудь сумісних з IBM PC.
Це можливо завдяки тому, що виробники сумісних комп'ютерів враховують у BIOS всі апаратні особливості, і MS-DOS не бачить відмінностей. А прикладна програма, що працює з пристроєм через драйвер, – і поготів.
Тим не менш, BIOS не використовується в операційних системах Windows NT, UNIX або OS/2. Чому?
Справа в тому, що, на жаль, BIOS не є реентерабельним. Це не має значення для однозадачної MS-DOS, але мультизадачні операційні системи змушені самі організовувати обслуговування апаратури реентерабельним способом. Існують ще проблеми поділу ресурсів між паралельними процесами, які теж не вирішуються в рамках BIOS.
Користувачі можуть легко доповнювати операційну систему своїми драйверами для нестандартних пристроїв. Можлива також заміна стандартних драйверів, використання драйверів для заміни або розширення функцій MS-DOS та BIOS.
6.1. Структура драйвера, що завантажується.
Драйвер - це ще один різновид програм (на додаток до com-і exe-програм). Інодікажуть, що драйвер – це com-програма, але це не так. Швидше спосіб отримання завантажувального модуля драйвера схожий спосіб отримання com-програми. Є ще одна схожість драйверів і com-програм (яка якраз і з'являється через однаковий спосіб їх отримання): завантажувальні модулі цих програм є точним відображенням вихідного тексту мовою асемблера без додавання будь-яких заголовків на початок файлу на етапі редагування.
При завантаженні драйвера в пам'ять заголовок драйвера теж міститься в оперативну пам'ять, і в ньому операційна система робить деякі зміни, про які ми ще говоритимемо.
Таким чином, можна говорити і про схожість драйвера з exe-програмами, оскільки на початку завантажувального модуля драйвера є заголовок. Тільки цей заголовок, на відміну від заголовка exe-файлу, є приналежністю самої програми та завантажується разом із нею на згадку. Заголовок exe-програми використовується лише при завантаженні програми; після завантаження операційна система видаляє його з пам'яті.
Не варто намагатися запускати драйвер як com-програму, тому що керування буде передано в область пам'яті, що містить заголовок драйвера, а там немає правильних машинних команд. Тому файли драйверів зазвичай мають розширення імені, відмінні від com або exe. Найчастіше використовуються розширення sys, drv, іноді bin. Насправді можна використовувати будь-яке розширення імені, тому що при описі драйвера у файлі config.sys вказується повне ім'я.
Для завантаженого в пам'ять драйвера ніколи не створюється префікс програмного сегмента PSP. На початку вихідного тексту програми-драйвера не ставиться директива ORG 100h (як це робиться для com-програми), оскільки не потрібно резервувати місце для PSP.
Що ж являє собою завантажувальниймодуль драйвера?
На початку модуля знаходиться заголовок драйвера. Ми вже трохи говорили про нього в описі векторної таблиці зв'язку операційної системи. Наведемо формат заголовка: