- •Введение
- •Подсистема ввода-вывода: общие принципы построения и работы
- •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
Обработка прерывания по завершению ввода-вывода
После того, как запрос на ввод-вывод достигнет самого нижнего драйвера в стеке обработки IRP, драйвер сформирует команду для устройства и вернет управление диспетчеру ввода-вывода со статусом «незавершенная операция ввода-вывода». После этого обработка данного запроса ввода-вывода будет отложена вплоть до возникновения прерывания по завершению операции ввода-вывода от устройства.
Для поддержки обработки прерываний от устройств ввода-вывода драйверы регистрируют в системе процедуру обработки прерывания – ISR (Interrupt Service Routine), определенную следующим образом:
BOOLEAN InterruptService( IN PKINTERRUPT Interrupt, // структура ядра, // описывающая прерывание IN PVOID Context // пользовательский контекст, // опред. при регистрации ISR );
Регистрация ISR выполняется драйвером на этапе инициализации посредством вызова функции IoConnectInterrupt. Зарегистрированное прерывание описывается структурой KINTERRUPT. Отметим некоторые поля этой структуры:
ULONG Vector – вектор (номер) аппаратного прерывания;
PKSPIN_LOCK IrqLock – spin-блокировка, гарантирующая взаимоисключения при работе ISR драйвера;
PKSERVICE_ROUTINE ServiceRoutine – указатель на ISR, предоставленную драйвером;
PVOID ServiceContext – пользовательский контекст прерывания, передаваемый в ISR при ее вызове;
LIST_ENTRY Entry – элемент списка для связывания ISR, разделяющих общее аппаратное прерывание.
Аппаратное прерывание от устройства ввода-вывода будет перехвачено ловушкой ядра, и после сохранения контекста прерванной задачи управление будет передано ISR процедуре драйвера, подготовленной для данного устройства.
Так как в Windows возможно разделение одного канала прерывания несколькими устройствами, процедура обработки прерывания драйвера, получив управление, прежде всего, должна опросить контролируемое устройство, чтобы определить, является ли оно источником прерывания.
Если устройство не генерировало прерывание, ISR возвращает FALSE и завершается. В этом случае диспетчер прерываний вызовет ISR следующего драйвера, использующего тот же канал прерывания, и т.д., пока не будет обнаружено устройство, инициировавшее прерывание.
Обнаружив, что прерывание вызвано контролируемым устройством, ISR драйвера подтверждает устройству прерывание, чтобы устройство отключило сигнал запроса прерывания. Затем ISR драйвера должна выполнить полезные действия по передаче данных от контролируемого устройства.
Поскольку процедура обработки прерывания выполняется на высоком уровне IRQL, она должна завершиться максимально быстро, чтобы не блокировать поступление новых прерываний и не нарушить нормальную работу системы. Поэтому ISR процедура драйвера обычно просто подготавливает DPC и завершается.
Все DPC организованы в виде очереди, ассоциированной с конкретным процессором. Когда уровень IRQL на этом процессоре опустится до уровня Dispatch/DPC, процедура DPC будет выбрана из очереди и завершит обработку прерывания от устройства.