Windows NT 裝置驅動程式開發基礎(6) (轉)

worldblog發表於2007-12-12
Windows NT 裝置驅動程式開發基礎(6) (轉)[@more@]1.3.8 同步 
 
 如果有可能在某時刻有多個部分在同時執行,比如有中斷處理過程,或 
存在多個裝置等,對公共資料或程式碼的訪問就需要同步。方法有 
 
 i) 自旋鎖(SpinLock) 
 
 驅動程式可以在初始化時KeInitializeSpinLock建立該。在任何程式碼段 
訪問被保護的資料之前,先呼叫KeAcquireSpinLock試圖獲得該物件的所有權,如果成功 
,該段程式碼被提升至DISPATCH_LEVEL,進行資料訪問。訪問完畢後須呼叫KeRelease 
SpinLock釋放所有權,執行級別也被恢復。此方法只適用於同步執行級別小於等於DISP 
ATCH_LEVEL的程式碼,主要用於多的情形。此外,還有一種中斷自旋鎖用於與中斷處理 
過程同步,可以將較低階別的程式碼提升到需要與之同步的中斷DIRQL。 
 
 ii) 控制器(Controller) 
 
 該物件主要用於同步一個驅動程式中的多個裝置,保證它們能順序地訪問特定的 
程式碼或資料。該物件在驅動程式初始化呼叫IoCreateController被建立。裝置在StartI 
o過程中呼叫IoAllocateController請求獲得Controller物件的獨佔權。使用完後呼叫I 
oFreeController釋放。驅動程式停止時呼叫IoDeleteController從刪除該物件。該 
物件有一個指標ControllerExtension指向一塊由驅動程式定義的結構,其中儲存有此驅 
動程式的公共資料。 
 
 iii) 介面卡(Adapter) 
 
 該物件用於同步多個裝置(不一定在一個驅動程式中)對DMA通道的使用。該物件 
在系統啟動偵測時自動被建立。驅動程式在初始化時呼叫HalGetAdapter獲得該物件 
的指標。裝置在StartIo過程中呼叫IoAllocateAdapterChannel請求獲得DMA通道的獨佔 
權,然後開始傳輸資料。使用完後呼叫IoFreeControllerChannel釋放DMA通道。 
 
 iv) DPC 
 
 由於DPC佇列中的物件總是被系統順序地處理,所以也可以將需要同步的程式碼做成 
Dpc過程,需要呼叫時將相應的DPC物件放到佇列的末尾即可。 
 
 v) 其他 
 
 同的應用程式類似,驅動程式也可以使用多執行緒,也提供了一套用來同步的 
物件,如Event, Mutex, Semaphore, Timer, Thread。其中Event物件可以被命名,不同 

的驅動程式可以利用同名的Event物件同步對公共資料的訪問。 
 
-- 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992244/,如需轉載,請註明出處,否則將追究法律責任。

相關文章