Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_Шеховцов_1.docx
Скачиваний:
73
Добавлен:
09.11.2019
Размер:
14.73 Mб
Скачать

15.7.2. Передавання параметрів драйверу

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

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

В UNIX-системах такий виклик називають ioctlO.

#include <sys/ioctl.h>

int ioctKint d. int request[. char *argp]);

де: d - файловий дескриптор, що відповідає відкритому файлові пристрою;

request - ціле число, що задає команду драйвера;

argp - покажчик на довільну пам'ять, за допомогою якого застосування

і драйвер можуть обмінюватися даними будь-якої природи.

Розглянемо приклад використання ioctlO в Linux для керування приводом

дисководу CD-ROM [24]:

finclude <fcntl.h> finclude <linux/cdrom.h> #iinclude <sys/ioctl ,h>

int fd = openC'/dev/cdrom". 0_RD0NLY): // відкрити пристрій ioctl(fd. CDROMEJECT): // виштовхнути CD-ROM

close(fd);

Зазначимо, що відповідна команді драйвера константа CDROMEJECT оголошена в заголовному файлі <linux/cdrom.h>, де перебувають оголошення засобів керу­вання відповідним драйвером.

15.7.3. Структура драйвера

У розділі 15.3.2 вже йшлося про ті частини драйвера, що відповідають за обробку переривань, а в розділі 15.6.1 - про функції, які потрібно реалізувати для забез­печення доступу до цього драйвера через інтерфейс файлової системи. Цей мате­ріал дає змогу окреслити загальну структуру драйвера в UNIX. Для прикладу розглянемо принципи реалізації драйверів у Linux [94].

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

Код ініціалізації виконують під час завантаження ядра (а також під час заван­таження у пам'ять модуля із кодом драйвера, якщо він реалізований як модуль ядра). Він складається з однієї функції - і nit О. У ній відбувається реєстрація драйвера у системі (вибір номера драйвера, реєстрація оброблювачів переривань тощо). Зазначимо, що спеціальні файли мають створюватись окремо із режиму користувача утилітою mknod.

Код реалізації файлових операцій зводиться до набору функцій, що реалізу­ють реакцію на виконання основних системних викликів файлового введення-ви­ведення. Набір цих функцій розрізняють для блокових і символьних драйверів. ♦ Для символьних можна реалізувати реакцію на виконання таких викликів, як openO, closeO, readO, writeO, 1 seek О, select О (для організації підтримки пові­домлення), mmapO.

♦ Для блокових важливим є те, що реалізовані в них функції реакції на операції читання і записування викликають не прямо, а після того, як керування про­йшло через буферний кеш (за наявності відповідного блоку в кеші операції його читання або записування можуть зовсім не викликатися). Читання і за­писування тут за традицією реалізовані у рамках однієї функції, позначеної в UNIX як strategyO, а в Linux - request О.

Окремо слід виділити реалізацію реакції на універсальний системний виклик ioctl (), для якого треба продумати набір команд і необхідні структури даних.

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