Passive-Level ISR

Начиная с Windows 8, драйверы платформы драйверов в режиме ядра (KMDF) и пользовательского режима (UMDF) могут регистрировать свои процедуры обслуживания прерываний (ISR) для выполнения на пассивном уровне.

Дополнительные сведения о isR пассивного уровня для драйверов KMDF и UMDF см. в следующих разделах:

Если периферийное устройство использует контакт ввода-вывода общего назначения (GPIO) для передачи запроса на прерывание процессору, абстракция прерываний Windows позволяет драйверу этого устройства игнорировать сведения о конкретном оборудовании контроллера GPIO, которому принадлежит этот контакт. Когда обработчик перехвата ядра запускается в ответ на запрос прерывания с ретранслятором GPIO от устройства, он автоматически очищает или маскирует прерывание в аппаратных регистрах GPIO. Кроме того, обработчик перехвата ядра либо напрямую вызывает ISR устройства, либо планирует выполнение этого ISR в другом потоке.

Часто аппаратные регистры GPIO сопоставляются в памяти, и в этом случае обработчик перехвата ядра может напрямую обращаться к ним в DIRQL. Однако аппаратные регистры периферийного устройства могут не быть сопоставлены в памяти. В этом случае драйвер периферийного устройства должен использовать запросы ввода-вывода для доступа к ним. В этом случае ISR для драйвера периферийного устройства должен выполняться по адресу IRQL = PASSIVE_LEVEL, чтобы он смог использовать запросы ввода-вывода для отключения прерывания или выполнения первоначального обслуживания прерывания. ISR пассивного уровня может отправлять запрос ввода-вывода синхронно и при необходимости блокировать до завершения запроса.

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

Для поддержки isR пассивного уровня для периферийного устройства, которое генерирует сигнал запроса прерывания, активированного на уровне, обработчик перехвата ядра маскирует ожидающее прерывание на контакте GPIO, а затем планирует выполнение ISR в потоке ядра пассивного уровня. ISR отвечает за очистку запроса прерывания на периферийном устройстве. После возврата ISR поток ядра расмаскивает прерывание в контакте GPIO.

Так как прерывание остается маскируемым до возврата ISR, ISR пассивного уровня устройства должно выполнять только начальное обслуживание прерывания, а затем вернуться, чтобы избежать задержки ISR пассивного уровня для других устройств. Как правило, драйвер должен отложить дополнительную обработку, связанную с прерываниями, в рабочий поток прерывания, который выполняется с более низким приоритетом, чем ISR.