- •Введение
- •Подсистема ввода-вывода: общие принципы построения и работы
- •1.1. Взаимодействие процессора с внешними устройствами
- •1.2. Прямой доступ к памяти
- •Драйверы
- •Роль драйверов в операционной системе
- •Взаимодействие драйверов с компонентами операционной системы и пользовательскими программами
- •Стек обработки запросов ввода-вывода
- •Основы организации и работы подсистемы ввода-вывода unix
- •2.1. Драйверы в операционных системах семейства unix
- •Стратегическая функция драйвера блочного устройства
- •Функция обработки прерывания
- •Функция опроса устройства
- •Другие функции драйверов
- •Буферизация в символьных драйверах
- •Терминальный драйвер
- •2.2. Потоковая подсистема ввода-вывода в unix
- •Архитектура и принципы работы подсистемы streams
- •Архитектура и работа модулей потока
- •Функция модуля put
- •Функция модуля service
- •Структура сообщения
- •Основы организации и работы подсистемы ввода-вывода windows
- •3.1. Классификаций драйверов Windows
- •Драйверы пользовательского режима
- •Драйверы режима ядра
- •3.2. Объекты подсистемы ввода-вывода
- •Объект файл
- •Объект устройство
- •Объект драйвер
- •Объект пакет запроса ввода-вывода
- •Объект блок стека запросов ввода-вывода
- •3.3. Передача данных между пользовательским адресным пространством и пространством ядра
- •Буферизированный ввод-вывод
- •Прямой ввод-вывод
- •Ввод-вывод под управлением драйвера
- •3.4. Обработка запросов ввода-вывода
- •Прохождение запроса ввода-вывода вниз через стек обработки запросов ввода-вывода
- •Обработка прерывания по завершению ввода-вывода
- •Обратное прохождение запроса ввода-вывода вверх через стек запросов ввода-вывода
- •3.5. Буферизация запросов ввода-вывода
- •Системная очередь запросов
- •Очереди запросов под управлением драйвера
- •3.6. Диспетчер Plug-And-Play, установка и запуск драйверов
- •3.7. Диспетчер электропитания
- •3.8. Среда сетевых драйверов ndis
- •Драйверы среды ndis Минипорт-драйверы сетевых адаптеров
- •Драйверы протоколов
- •Промежуточные драйверы
- •Структура ndis пакета
- •Запросы к сетевым адаптерам
- •3.9. Порты завершения ввода-вывода
- •Заключение
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
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. Очередь запросов ввода-вывода блочного устройства