Share via


使用微調鎖定時防止錯誤和死結

雖然驅動程式常式會保留微調鎖定,但它無法造成硬體例外狀況,或引發軟體例外狀況,而不需要關閉系統。 換句話說,驅動程式的 ISR 和驅動程式在呼叫KeSynchronizeExecution中提供的任何SynchCritSection常式不得造成錯誤或陷阱,例如分頁錯誤或算術例外狀況,而且無法引發軟體例外狀況。 呼叫 KeAcquireSpinLockKeAcquireInStackQueuedSpinLock 的常式也無法造成硬體例外狀況或引發軟體例外狀況,直到它釋放其執行微調鎖定,而且不再在 IRQL = DISPATCH_LEVEL上執行。

可分頁的資料和支援常式

在按住微調鎖定時,驅動程式不得呼叫可分頁資料的常式。 請記住,如果驅動程式在 IRQL 執行時發生呼叫時,可以呼叫某些支援常式來存取可分頁資料,且只會在 IRQL 上執行時,嚴格小於DISPATCH_LEVEL。 此 IRQL 限制會排除在按住微調鎖定時呼叫這些支援常式。 如需任何特定支援常式的 IRQL 需求,請參閱常式的參考頁面。

遞迴

嘗試以遞迴方式取得微調鎖定可確保造成死結:遞迴常式的保留具現化無法在第二次具現化微調時釋放微調鎖定,嘗試取得相同的微調鎖定。

下列指導方針說明如何搭配遞迴常式使用微調鎖定:

  • 遞迴常式在保留微調鎖定時不得呼叫本身,或不得嘗試在後續呼叫時取得相同的微調鎖定。

  • 當遞迴常式保留微調鎖定時,如果遞迴可能會導致死結,或可能導致呼叫端保留超過 25 毫秒的微調鎖定,則另一個驅動程式常式不得呼叫遞迴常式。

如需遞迴驅動程式常式的詳細資訊,請參閱 使用核心堆疊

巢狀微調鎖定擷取

嘗試取得第二個微調鎖定,同時按住另一個微調鎖定也可能會導致死結或驅動程式效能不佳。

下列指導方針說明驅動程式應如何保存微調鎖定:

  • 除非無法發生死結,否則驅動程式不得呼叫使用微調鎖定的支援常式。

  • 即使無法發生死結,驅動程式不應該呼叫使用微調鎖定的支援常式,除非替代的編碼技術無法提供可比較的驅動程式效能和功能。

  • 如果驅動程式進行巢狀呼叫以取得微調鎖定,則每次取得微調鎖定時,必須一律以相同的順序取得微調鎖定。 此順序有助於避免死結。

一般而言,請避免使用巢狀微調鎖定來保護重迭的子集或離散共用資料和資源的集合。 如果驅動程式使用兩個執行微調鎖定來保護離散資源,例如可由各種驅動程式常式個別設定的一組計時器物件,請考慮會發生什麼事。 每當有兩個常式的任一常式時,驅動程式會在 SMP 機器中間歇性死結,每個常式都保留一個微調鎖定,嘗試取得另一個微調鎖定。

如需取得巢狀微調鎖定的詳細資訊,請參閱 鎖定、死結和同步處理