使用被動層級中斷服務例程
從 Windows 8 開始,驅動程式可以使用 Io 連線 InterruptEx 例程來註冊被動層級的 InterruptService 例程 (ISR)。 當相關聯的中斷發生時,核心的插斷陷阱處理程式會排程此例程,以在 IRQL = PASSIVE_LEVEL執行。 如果ISR只能透過I/O要求存取裝置的硬體緩存器,可能需要在被動層級執行。 被動層級 ISR 可以同步傳送 I/O 要求到裝置,並封鎖要求,直到要求完成為止。
註冊被動層級 ISR
Io 連線 InterruptEx 的輸入參數是IO_CONNECT_INTERRUPT_PARAMETERS結構的指標。 若要註冊被動層級 ISR,請將這個結構的 Version 成員設定為 CONNECT_FULLY_SPECIFIED 或 CONNECT_LINE_BASED。 如果 Version = CONNECT_FULLY_SPECIFIED,請將 Irql 成員設定為 PASSIVE_LEVEL、 將 SynchronizeIrql 成員設定為 PASSIVE_LEVEL,並將 SpinLock 成員設定為 NULL。 如果 Version = CONNECT_LINE_BASED,請設定 SynchronizeIrql = PASSIVE_LEVEL 和 SpinLock = NULL。
如果中斷物件指定被動層級 ISR,KeSynchronizeExecution 例程會使用核心同步處理事件物件,而不是微調鎖定來同步處理同步處理與 ISR 的 SynchCritSection 例程的執行。
這個事件物件是由Io連線InterruptEx例程在註冊被動層級ISR的呼叫中配置。 呼叫端不得在此呼叫中提供微調鎖定。 (也就是說,呼叫端必須設定如果ISR是在被動層級執行,則IO_CONNECT_INTERRUPT_PARAMETERS結構的SpinLock成員為NULL。否則,Io 連線 InterruptEx 會失敗,並傳回錯誤狀態STATUS_INVALID_PARAMETER。
KeAcquireInterruptSpinLock 和 KeReleaseInterruptSpinLock 例程會導致錯誤檢查提供的中斷物件 ISR 是否在 IRQL = PASSIVE_LEVEL執行。
需要被動層級中斷處理的裝置
對於發出層級觸發中斷要求的記憶體對應裝置,裝置的ISR通常是從核心插斷陷阱處理程式內的 DIRQL 呼叫。 ISR 會操作裝置中的硬體緩存器,以關閉中斷。
不過,如果相關聯的裝置發出層級觸發的中斷要求,但無法直接從在 DIRQL 從核心中斷陷阱處理程式內呼叫的 ISR 存取裝置的硬體緩存器,則 ISR 可能需要在 IRQL = PASSIVE_LEVEL執行。 例如,裝置快取器可能不是記憶體對應,或ISR可能會在緩存器存取期間暫時遭到封鎖。
從 Windows 8 開始,驅動程式可以註冊被動層級 ISR。 當中斷發生時,核心的插斷陷阱處理程式會排程ISR在 IRQL = PASSIVE_LEVEL執行。 在處理程式傳回之前,它必須讓插斷控制器(或 GPIO 控制器)中的中斷無聲。 如果裝置發出邊緣觸發的中斷訊號,處理程式就會清除插斷控制器中的中斷。 如果裝置發出層級觸發的中斷訊號,處理程式會暫時遮罩插斷控制器中的中斷;在ISR執行之後,核心會解除遮罩中斷。
範例
可能需要被動層級ISR的裝置範例是連線到低功率序列總線的感測器裝置,例如I IoC。 從 Windows 8 開始,SPB 架構延伸模組 (SpbCx) 會提供 I}C 和其他簡單周邊總線的支援。
為了存取 I IoC 連接感測器裝置的快取器,感測器驅動程式會將感測器裝置傳送 I/O 要求,由 SpbCx 和總線控制器驅動程式共同處理。 若要執行要求的作業,SPB 控制器必須透過總線以序列方式傳輸數據。 此傳送速率相對較慢,而且無法在在 DIRQL 執行的 ISR 時間限制內執行。 不過,被動層級 ISR 可以同步傳送 I/O 要求,然後封鎖直到要求完成為止。
如果當ISR將I/O要求傳送至中斷裝置時關閉,本範例中的被動層級ISR可能會封鎖較長的時間。 在此情況下,控制器必須先完成轉換至 D0 電源狀態,才能透過總線傳輸數據。
相較於PCI之類的總線,本範例中的I題詞C總線不會提供任何總線特定的方法,以將周邊裝置的中斷要求傳達給處理器。 相反地,感測器裝置可能會向 GPIO 控制器裝置上的針腳發出中斷訊號,然後將中斷要求轉接至處理器。 如需詳細資訊,請參閱 GPIO 中斷。
一般而言,GPIO 控制器的硬體快取器會進行記憶體對應,而且可由核心的插斷陷阱處理程式在 DIRQL 存取。 當感測器裝置造成中斷時,處理程式必須藉由操作 GPIO 控制器緩存器中的插斷位來讓插斷無聲。
針對層級觸發的中斷,核心的插斷陷阱處理程式會遮罩 GPIO 針腳上的中斷要求,然後排程感測器裝置的 ISR 在被動層級執行。 ISR 必須清除感測器裝置的中斷要求。 ISR 傳回之後,核心會在 GPIO 針腳上解除遮罩中斷要求。
針對邊緣觸發的中斷,核心的陷阱處理程式會清除 GPIO 針腳上的中斷要求,然後排程感測器裝置的 ISR 在被動層級執行。
背景工作例程
在 Io 連線 InterruptEx 的呼叫中,驅動程式可以選擇分割被動層級 ISR 與背景工作例程之間的中斷處理。 根據一般規則,ISR 應該執行中斷的初始處理(例如,將層級觸發的中斷靜音),並將額外的處理延遲給背景工作角色。 雖然ISR和背景工作角色都以被動層級執行,但ISR會以相對較高的優先順序執行,而且可能會延遲其他高優先順序的工作。 這些工作可能包括新中斷的被動層級ISR。
在罕見的情況下,中斷可能需要如此少的處理,被動層級ISR可以執行中斷的所有處理,而且不需要任何背景工作例程。
如需在 KMDF 驅動程式中使用被動層級 ISR 的相關信息,請參閱 支援被動層級中斷。