WavePci Miniport 驅動程式的可靠性問題
WavePci 迷你埠驅動程式必須追蹤它從埠驅動程式接收的對應。 WavePci 迷你埠驅動程式會在驅動程式執行緒之間共用的資料結構中維護其對應清單。 驅動程式執行緒也必須共用 DMA 通道的存取權,才能將新的對應新增至硬體佇列,並從佇列中移除已完成的對應。 為了防止資料損毀,迷你埠驅動程式會使用微調鎖定來序列化共用資料結構和周邊的存取。 微調鎖定可保護共用資料和硬體佇列,避免兩個或多個驅動程式執行緒同時存取。
開發管理對應之驅動程式的部分時,廠商應該特別注意下列幾點。
微調鎖定
若要避免潛在的死結,迷你埠驅動程式在呼叫 Portcls.sys 取得或釋放對應時,不得保留自己的微調鎖定。 Microsoft Windows 驅動程式套件中的 Ac97 範例驅動程式 (WDK) 說明此準則。 在呼叫 IPortWavePciStream::GetMapping 或 IPortWavePciStream::ReleaseMapping之前,範例驅動程式會呼叫 KeReleaseSpinLock 以釋放微調鎖定。 GetMapping或ReleaseMapping呼叫傳回之後,驅動程式會呼叫KeAcquireSpinLock以再次取得微調鎖定。 在釋放和取得微調鎖定的呼叫之間,驅動程式執行緒不得假設它具有對應清單的獨佔存取權。 在此未受保護的間隔期間存取共用資料是危險的。 如果釋放和取得微調鎖定之間的間隔很小,則兩個驅動程式執行緒之間競爭條件損毀資料的可能性也很小。 這表示產生的失敗是間歇性的,因此難以追蹤。 釋放並取得微調鎖定之後,撰寫良好的驅動程式應該假設先前用來存取共用資料結構內容的任何暫存指標或索引都不再有效。
IRP 取消
在處理播放或擷取資料流程時,取消 IRP 可能會導致作業系統撤銷迷你埠驅動程式已取得的一或多個對應。 發生這種情況時,埠驅動程式會呼叫 IMiniportWavePciStream::RevokeMappings 方法來通知迷你埠驅動程式。 為了避免播放資料或將資料擷取到撤銷的對應,迷你埠驅動程式必須從其軟體清單和 DMA 控制器的硬體佇列中移除對應。 由於軟體清單和硬體佇列會在驅動程式執行緒之間共用,因此必須謹慎地執行這些作業。
例如,要撤銷的一組對應可能包含剛發行或即將發行的對應。 在此情況下,兩個驅動程式執行緒可能會同時嘗試從 DMA 佇列中移除相同的對應。 如果驅動程式無法同時存取,結果可能會損毀管理佇列的暫存器或記憶體結構中的資料。
如需運作中的程式碼範例,請參閱 Windows 驅動程式套件中的 Ac97 範例驅動程式 (WDK) 。