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

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

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

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

Якщо у файлі конфігурації CONFIG.SYS вказані імена файлів додаткових (завантажуваних) драйверів, то ці драйвери поміщаються в списку попереду стандартних системних драйверів. Тому, якщо ім'я пристрою для завантажуваного драйвера збігається з ім'ям стандартного пристрою MS-DOS, то буде викликаний завантажуваний драйвер, а не стандартний.

Блок стратегії драйвера MS-DOS не робить практично нічого, тільки запам'ятовує адресу заявки. Блок переривань виконує всю роботу по обробці заявки, причому у всіх стандартних драйверів цей блок працює зовсім не по перериваннях, а за опитуванням готовності. Мабуть, розробники першої версії MS-DOS припускали небудь у майбутньому реалізувати нормальну структуру драйвера, та так і не зібралися.

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