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


Прерывание синхронизации объектов

Системный драйвер PortCls реализует интерфейс IInterruptSync для использования драйверов miniport. IInterruptSync представляет объект синхронизации прерываний, который синхронизирует выполнение списка процедур обслуживания прерываний (ISR) с подпрограммами без прерываний.

Объекты синхронизации прерываний предоставляют две ключевые возможности:

  • Выполнение списка ISR в ответ на прерывание. Объект синхронизации подключен к источнику прерываний. При каждом прерывании объект синхронизации выполняет ISR в указанном порядке в соответствии с выбранным режимом. (См. следующее описание трех режимов.)

  • Выполнение подпрограмм, которые не являются ISR. Эти подпрограммы, не связанные с прерыванием, не подключены к прерыванию объекта синхронизации. Вместо этого подпрограмма, не являющаяся прерыванием, выполняется в то время, когда вызывающий объект выбирает. Однако объект синхронизации выполняет подпрограмму, не связанную с прерыванием, синхронно со списком ISR объекта. Другими словами, подпрограмма без прерывания выполняется до завершения, прежде чем начнется выполнение любого из ISR в списке объекта синхронизации, и наоборот.

Объект синхронизации прерываний является гибким при работе с несколькими ISR. IsR находятся в связанном списке, который объект синхронизации проходит во время прерывания. Когда драйвер минипорта регистрирует ISR с объектом синхронизации, он указывает, следует ли добавить ISR в начало или конец этого списка.

Драйвер мини-порта вызывает функцию PcNewInterruptSync для создания объекта синхронизации прерываний. Во время этого вызова драйвер указывает способ, с помощью которого объект будет проходить по списку ISR во время прерывания. Вызов поддерживает три параметра, указанные константами перечисления INTERRUPTSYNCMODE в следующей таблице.

Константа Значение

ПрерываниеSyncModeNormal

Вызывайте каждый ISR в списке, пока один из них не вернет STATUS_SUCCESS.

ПрерываниеSyncModeAll

Вызовите каждый ISR в списке ровно один раз, независимо от кодов возврата предыдущих ISR.

InterruptSyncModeRepeat

Просмотрите весь список ISR до тех пор, пока не произойдет переход по списку, в котором isr в списке не возвращает STATUS_SUCCESS.

В режиме InterruptSyncModeNormal объект синхронизации вызывает каждый ISR в списке, пока один из них не вернет STATUS_SUCCESS. Все ISR в списке, который следует за этим ISR, не вызываются. Этот режим эмулирует способ, которым операционная система обычно обрабатывает ISR. Если ни один из isR не возвращает STATUS_SUCCESS, поведение будет таким же, как и в режиме InterruptSyncModeAll.

В режиме InterruptSyncModeAll каждый ISR в списке вызывается ровно один раз, независимо от кодов возврата предыдущих ISR. Это предназначено для более примитивного оборудования, где источник прерывания не является детерминированным, хотя он может быть полезен и в других ситуациях. Например, два источника прерываний могут быть тесно синхронизированы для каждого прерывания, независимо от того, из какого из двух источников поступает конкретное прерывание.

В режиме InterruptSyncModeRepeat объект синхронизации многократно проходит по всему списку ISR до тех пор, пока не произойдет переход по списку, в котором ни одно из подпрограмм в списке не возвращает STATUS_SUCCESS. Этот режим подходит для ситуаций, когда прерывания из нескольких источников могут возникать в одной строке прерывания одновременно или второе прерывание может сработать во время обработки ISR. Каждый источник прерывания должен иметь возможность определить, требуется ли обработка. Система перестанет отвечать, если ISR, который всегда возвращает STATUS_SUCCESS, зарегистрирован с объектом синхронизации в этом режиме.

В любом из этих режимов объект синхронизации подтвердит прерывание в операционной системе, если какой-либо из зарегистрированных ISR возвращает STATUS_SUCCESS. Во всех трех режимах, если все источники прерываний указывают на то, что они не успешно обработали прерывание, объект синхронизации вернет в операционную систему код неудачного результата.

Интерфейс IInterruptSync поддерживает следующие методы:

IInterruptSync::CallSynchronizedRoutine

IInterruptSync::Connect

IInterruptSync::D isconnect

IInterruptSync::GetKInterrupt

IInterruptSync::RegisterServiceRoutine