Поделиться через


Обслуживание прерывания

В этом разделе описывается обслуживание прерывания DIRQL. Сведения об обслуживании прерываний пассивного уровня см. в разделе Поддержка прерываний пассивного уровня.

Обслуживание прерывания состоит из двух, а иногда и трех этапов:

  1. Быстрое сохранение непостоянной информации (например, регистр содержимого) в процедуре прерывания, которая выполняется в IRQL = DIRQL.

  2. Обработка сохраненных переменных данных в отложенном вызове процедуры (DPC), который выполняется в IRQL = DISPATCH_LEVEL.

  3. Выполнение дополнительных работ в IRQL = PASSIVE_LEVEL, если это необходимо.

Когда устройство создает аппаратное прерывание, платформа вызывает подпрограмму обслуживания прерываний драйвера (ISR), которую драйверы на основе платформы реализуют как функцию обратного вызова EvtInterruptIsr .

Функция обратного вызова EvtInterruptIsr , которая выполняется в DIRQL устройства, должна быстро сохранять сведения об прерывании, такие как содержимое регистра, которые будут потеряны в случае другого прерывания.

Как правило, функция обратного вызова EvtInterruptIsr планирует отложенный вызов процедуры (DPC) для обработки сохраненных сведений позже в более низком IRQL (DISPATCH_LEVEL). Драйверы на основе платформы реализуют подпрограммы DPC как функции обратного вызова EvtInterruptDpc или EvtDpcFunc .

Большинство драйверов используют одну функцию обратного вызова EvtInterruptDpc для каждого типа прерывания. Чтобы запланировать выполнение функции обратного вызова EvtInterruptDpc , драйвер должен вызвать WdfInterruptQueueDpcForIsr из функции обратного вызова EvtInterruptIsr .

Если драйвер создает несколько объектов очередей платформы для каждого устройства, можно использовать отдельный объект DPC и функцию обратного вызова EvtDpcFunc для каждой очереди. Чтобы запланировать выполнение функции обратного вызова EvtDpcFunc , драйвер должен сначала создать один или несколько объектов DPC, вызвав WdfDpcCreate, обычно в функции обратного вызова EvtDriverDeviceAdd драйвера. Затем функция обратного вызова EvtInterruptIsr драйвера может вызвать WdfDpcEnqueue.

Драйверы обычно выполняют запросы ввода-вывода в функциях обратного вызова EvtInterruptDpc или EvtDpcFunc .

Иногда драйвер должен выполнять некоторые операции обслуживания прерываний в IRQL = PASSIVE_LEVEL. В таких случаях функция обратного вызова EvtInterruptDpc или EvtDpcFunc драйвера, выполняющаяся в IRQL = DISPATCH_LEVEL, может запланировать выполнение одного или нескольких рабочих элементов платформы, которые выполняются в IRQL = PASSIVE_LEVEL.

Пример драйвера, использующего рабочие элементы при обслуживании прерываний устройства, см. в примере драйвера PCIDRV .