Спеціальні файли як універсальний інтерфейс - загальне - операційні системи - каталог статей -

Спеціальні файли як універсальний інтерфейс

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

Використання спеціальних файлів в багатьох випадках істотно спрощує програмування операцій з зовнішніми пристроями. Зі спеціальним файлом можна працювати так само, як і зі звичайним, тобто відкривати, зчитувати з нього або ж записувати в нього певну кількість байт, а після завершення операції закривати. Для цього використовуються звичні багатьом програмістам системні виклики для роботи зі звичайними файлами: open, create, read, write і close. Крім того, є кілька системних викликів, які використовуються тільки при роботі зі спеціальними файлами, наприклад виклик loctl, за допомогою якого можна передати команду контролеру пристрою. Для того щоб вивести на алфавітно-цифровий термінал, з яким пов'язаний спеціальний файл / dev / tty3, повідомлення «Hello, friendsl», досить відкрити цей файл за допомогою системного виклику open:

fd = open (7dev / tty3 ", 2)

Потім можна вивести повідомлення за допомогою системного виклику write:

write (fd, "Hello, friends!", 15)

Для пристроїв прямого доступу має сенс також покажчик поточного становища в файлі, яким можна керувати за допомогою системного виклику lseek.

Очевидно, що уявлення пристрою у вигляді файлу і використання для управління пристроєм файлових системних викликів дозволяє виконувати тільки прості операції керування, які зводяться до передачі в пристрій послідовності байт. Для деяких пристроїв такі операції цілком адекватні-в основному це пристрої, що відображають рядки символів (алфавітно-цифрові термінали, алфавітно-цифрові принтери) або приймають від користувача рядки символів (клавіатура). Форматування введення-виведення в пристроях цього класу здійснюється з допомогою службових символів початку кодової таблиці і їх послідовностей, наприклад для перекладу рядка і повернення каретки принтера або терміналу досить до послідовності символів тексту додати восьмеричні коди <12> <15>.

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

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

Спеціальні файли як універсальний інтерфейс - загальне - операційні системи - каталог статей -

Мал. 8.1. Робота з диском як зі спеціальним файлом

В UNIX спеціальні файли традиційно поміщаються в каталог / dev, хоча ніщо не заважає створенню їх в будь-якому каталозі файлової системи. При появі нового пристрою і відповідно нового драйвера адміністратор системи може створити новий запис за допомогою команди mknod. Наприклад, наступна команда створює блок-орієнтований спеціальний файл для представлення третього розділу на другому диску четвертого SCSI-контролера:

mknod / dev / dsk / scs1 b 32 33

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

По-перше, в індексному дескрипторі зберігається ознака того, що файл є спеціальним, причому ця ознака дозволяє розрізнити клас відповідного пристрою драйвера, тобто він визначає, чи є драйвер байт-орієнтованим або блок-орієнтованим.

  • major - номер драйвера;
  • minor - номер пристрою.

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

У наведеному вище прикладі команди створення спеціального файлу / dev / dsk / scsi аргумент b визначає створення спеціального файлу для блок-орієнтованого драйвера, аргумент 32 визначає номер драйвера, який буде викликатися при відкритті пристрої / dev / dsk / scsi, а аргумент 33 декодируется самим драйвером (в ньому закодовані дані про те, що потрібно управляти третім розділом на другому диску четвертого SCSI-контролера).

ОС UNIX використовує для зберігання інформації про встановлені апаратних драйвери дві системні таблиці:

  • bdevsw - таблиця блок-орієнтованих драйверів;
  • cdevsw - таблиця байт-орієнтованих драйверів.

Номер драйвера (major) є індексом відповідної таблиці. При відкритті спеціального файлу операційна система виявляє, що вона має справу зі спеціальним файлом тільки після того, як прочитає з диска або знайде в системному буфері його індексний дескриптор. При цьому вона дізнається, чи є викликається драйвер блок- або байт-орієнтованим, після чого використовує номер драйвера для звернення до певної рядку однієї з двох таблиць: bdevsw або cdevsw (рис. 8.2).

Спеціальні файли як універсальний інтерфейс - загальне - операційні системи - каталог статей -

Концепція спеціальних файлів ОС UNIX була реалізована в багатьох операційних системах, хоча для зв'язку з драйверами в них часто використовуються механйзми, відмінні від описаного вище. Так, в OG Windows NT для зв'язку віртуальних пристроїв (аналогів спеціальних файлів) з драйверами використовується механізм об'єктів. При цьому в об'єктах-пристроях є посилання на об'єкти-драйвери, за рахунок чого при відкритті віртуального пристрою система знаходить потрібний драйвер.