共用方式為


同步處理裝置資料的存取

一般而言,驅動程式的 InterruptServiceInterruptMessageService 常式 (ISR) 必須與其他驅動程式常式共用驅動程式資料和硬體資源的存取權。 由於 ISR 會在提升許可權的 IRQL 中斷內容中執行,而且因為系統可能有多個處理器,因此請務必同步處理共用資料和資源的存取權,以確保每個常式可以暫時擁有此共用資訊的獨佔存取權,而不會中斷。

系統支援這項同步處理,方法是在 中斷關鍵區段內執行 ISR。 中斷具有指派的微調鎖定、 中斷微調鎖定IRQL,以及中斷同步處理 IRQL。 系統會藉由將處理器的 IRQL 提升至中斷同步處理 IRQL,並在執行程式碼之前取得中斷微調鎖定,保證此程式碼會在重要區段獨佔存取共用資訊內執行。 系統在執行其 ISR 之前,一律會進入中斷的重要區段。 不同的中斷可以共用其中斷微調鎖定和同步處理 IRQL,來共用相同的重要區段。

驅動程式可以藉由提供 SynchCritSection 常式,實作在中斷的重要區段中執行的程式碼。 當驅動程式使用 KeSynchronizeExecution 呼叫 SynchCritSection 常式時,系統會自動輸入 Interrupt 參數所指定之中斷的重要區段。

將處理器的 IRQL 提升至中斷的同步處理 IRQL 可防止目前的處理器中斷,但與較高同步處理 IRQL 的中斷除外。 取得微調鎖定可防止其他處理器執行與該微調鎖定相關聯的任何重要區段程式碼。

當驅動程式呼叫 IoConnectInterruptEx時,系統會為中斷指派中斷微調鎖定和同步處理 IRQL。 在大部分情況下,驅動程式可讓系統判斷這兩個值:

  • 如果驅動程式使用 ioConnectInterruptEx的CONNECT_LINE_BASED版本,並指定 Null 微調鎖定,系統會為中斷線配置微調鎖定。 系統也會決定同步處理 IRQL (驅動程式的值,可以選擇性地指定較高的值) 。

  • 如果驅動程式使用 ioConnectInterruptEx CONNECT_MESSAGE_BASED版本,並指定 Null 微調鎖定,系統會為每個中斷訊息配置微調鎖定。 系統也會決定每個訊息的同步處理 IRQL 值, (驅動程式可以選擇性地指定較高的值,以便所有訊息) 通用。

只有在使用 ioConnectInterruptEx CONNECT_FULLY_SPECIFIED 版本,且有多個必須共用相同重要區段的中斷向量時,驅動程式才必須配置自己的微調鎖定。 驅動程式可以使用IO_CONNECT_INTERRUPT_PARAMETERSSpinLockSynchronizeIrql成員,來指定自己的微調鎖定和同步處理 IRQL。 如需詳細資訊,請參閱 IO_CONNECT_INTERRUPT_PARAMETERS

如需撰寫和輸入重要區段的相關資訊,請參閱 使用重要區段