Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000377.doc
Скачиваний:
29
Добавлен:
30.04.2022
Размер:
2.52 Mб
Скачать

2.1. Драйверы в операционных системах семейства unix

В операционной системе драйвер предоставляет системе функции, осуществляющие управление устройством в соответствии со спецификой данного устройства. Адреса точек входа в функции драйвера передаются операционной системе при инициализации драйвера и сохраняются в ней на протяжении всего времени работы системы.

В операционных системах семейства UNIX адреса точек входа в функции драйверов хранятся системных таблицах, которые называются таблицы коммутаторов устройств. В ядре UNIX определено две таблицы коммутаторов устройств: таблица cdevsw для символьных устройств и таблица bdevsw для блочных устройств.

Элементами таблиц коммутаторов устройств являются структуры cdevsw и bdevsw для символьных и блочных устройств соответственно. Определение этих структур может различаться отдельными деталями в различных версиях UNIX, поэтому примем в рассмотрение их упрощенное определение, включающее только общепринятые точки входа символьных и блочных драйверов.

В UNIX системах определены, как минимум, следующие точки входа для драйвера символьного устройства:

struct cdevsw { // открытие специального файла устройства int (*d_open)(); // закрытие специального файла устройства int (*d_close)(); // запрос на управление устройством int (*d_ioctl)() // запрос на получение данных от устройства int (*d_read)(); // запрос на вывод данных в устройство int (*d_write)(); // опрос устройства int (*d_poll)(); };

Для драйверов блочного устройства определены следующие точки входа:

struct bdevsw { // открытие специального файла устройства int (*d_open)(); // закрытие специального файла устройства int (*d_close)(); // запрос на управление устройством int (*d_ioctl)() // управление очередью запросов к устройству int (*d_strategy)(); };

Точки входа d_open, d_close, d_read, d_write, d_ioctl соответствуют системным вызовам open, close, read, write, ioctl. Функции драйвера автоматически вызываются через эти точки входа при вызове соответствующих системных вызовов с файловым дескриптором специального файла устройства.

Схема вызова функции драйвера в системах семейства UNIX может быть представлена, как показано на рис. 3.

Рис.3. Схема вызова функций драйвера

Функции драйвера вызываются через таблицы коммутаторов устройств. Требуемая таблица – таблица коммутаторов блочных устройств или таблица коммутаторов символьных устройств, выбирается по атрибуту специального файла устройства. Индексом для входа в таблицу служит старший (major) номер устройства, который также берется из атрибутов специального файла устройства.

Младший номер устройства не используется для выбора драйвера, но он передается в функции драйверов для внутреннего использования. Младший номер обычно используется в том случае, когда один драйвер управляет сразу несколькими однотипными устройствами. Например, в драйвере диска младший номер устройства указывает раздел диска.

Стратегическая функция драйвера блочного устройства

Для повышения производительности, взаимодействие с блочными устройствами в UNIX системах всегда выполняется через системный кэш. Как показывают измерения, использование кэша позволяет сократить число запросов к устройству на чтение на 95%, а на запись – на 85%.

Стратегическая функция драйвера является связующим звеном между системным кэшем и внешним устройством. Она обслуживает запросы на сохранение или загрузку блоков системного кэша, переданные внешнему устройству системой кэширования.

Для каждого блочного устройства, ядро UNIX поддерживает очередь запросов ввода-вывода, представляющую собой двусвязный список экземпляров структуры buf, и организованную, как показано на рис. 4.

Поле b_flags структуры buf указывает направление передачи (B_READ, B_WRITE) и состояние буфера (занят, ошибка при воде-выводе, используется для ПДП и т.п.).

Запрос ставится в очередь и стратегическая функция вызывается ядром системы, когда в кэше нет требуемого блока, или при необходимости сохранить данные из модифицированного блока кэша перед его перераспределением.

Указатель на начало списка запросов ввода-вывода передается в стратегическую функцию драйвера при ее вызове. Стратегическая функция может сама определять порядок выполнения запросов из очереди в соответствии с принятой для устройства дисциплиной управления. Начав обработку очереди запросов, стратегическая функция обычно не завершается, пока в очереди есть запросы.

Рис.4. Очередь запросов ввода-вывода блочного устройства