微調鎖定簡介
微調鎖定是核心定義的僅限內核模式同步處理機制,匯出為不透明類型:KSPIN_LOCK。 微調鎖定可用來保護共享數據或資源免於同時存取。 在 IRQL <= DISPATCH_LEVEL執行時,驅動程式可以使用 KeAcquireInStackQueuedSpinLock 和 KeReleaseInStackQueuedSpinLock,以佇列微調鎖定的形式取得和釋放微調鎖定。
或者,在 IRQL >= DISPATCH_LEVEL執行的呼叫端可以呼叫 KeAcquireSpinLockAtDpcLevel 和 KeReleaseSpinLockFromDpcLevel ,以提升驅動程式效能。
許多元件都使用微調鎖定,包括驅動程式。 任何類型的驅動程式都可能會使用一或多個 執行微調鎖定。 例如,大部分的文件系統都會使用文件系統驅動程式 (FSD) 裝置延伸模組中的聯結工作佇列來儲存檔系統背景工作線程回呼例程和 FSD 所處理的 IRP。 聯結的工作佇列受到執行微調鎖定的保護,可解決 FSD 嘗試將 IRP 插入佇列中的爭用,以及同時嘗試移除 IRP 的任何線程。 另一個範例是,系統軟盤控制器驅動程式使用兩個執行微調鎖定。 一個主管微調鎖定可保護與此驅動程式的裝置專用線程共用的聯鎖工作佇列;另一個會保護由三個驅動程式例程共用的定時器物件。
佇列的微調鎖定比多處理器計算機上高競爭鎖定的一般微調鎖定提供更好的效能。 如需詳細資訊,請參閱 佇列微調鎖定。 驅動程式也可以使用 KeAcquireSpinLock 和 KeReleaseSpinLock,以一般微調鎖定的形式取得並釋放微調鎖定。
若要同步處理簡單數據結構的存取,驅動程式可以使用任何 ExInterlockedXxx 例程來確保數據結構的不可部分完成存取。 使用這些例程的驅動程式不需要明確取得或釋放微調鎖定。
擁有ISR的每個驅動程式都會使用 中斷微調鎖定 來保護其ISR與其 SynchCritSection 例程之間共用的任何數據或硬體,這些例程通常從 StartIo 和 DpcForIsr 例程呼叫。 中斷微調鎖定與驅動程式呼叫Io連線Interrupt時所建立的中斷物件集相關聯,如註冊ISR中所述。
請遵循下列指導方針,在驅動程式中使用微調鎖定:
提供任何受微調鎖定保護的數據或資源的記憶體,以及常駐系統空間記憶體中對應的微調鎖定(非分頁集區,如虛擬記憶體空間和物理記憶體圖所示)。 驅動程式必須為其使用的任何執行微調鎖定提供記憶體。 不過,裝置驅動程式不需要提供中斷微調鎖定的記憶體,除非它有多向量ISR或有一個以上的ISR,如註冊ISR中所述。
呼叫 KeInitializeSpinLock ,以初始化驅動程式提供記憶體的每個微調鎖定,再使用它來同步存取它所保護的共用數據或資源。
在適當的 IRQL 上呼叫使用微調鎖定的每個支援例程,通常位於 <= DISPATCH_LEVEL執行微調鎖定,或呼叫 <= DIRQL,以取得與驅動程式中斷對象相關聯的中斷微調鎖定。
實作例程,以在保留微調鎖定時儘快執行。 任何例程都不應該保留超過 25 微秒的微調鎖定。
永不實作在保留微調鎖定時執行下列任何動作的例程:
造成硬體例外狀況或引發軟體例外狀況。
嘗試存取可分頁記憶體。
進行遞歸呼叫,會導致死結,或可能導致微調鎖定保留超過 25 微秒。
如果這樣做可能會導致死結,請嘗試取得另一個微調鎖定。
呼叫違反上述任何規則的外部例程。