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

Обработка прерывания по завершению ввода-вывода

После того, как запрос на ввод-вывод достигнет самого нижнего драйвера в стеке обработки 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 будет выбрана из очереди и завершит обработку прерывания от устройства.