Windows NT 裝置驅動程式開發基礎(6) (轉)
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物件同步對公共資料的訪問。
--
如果有可能在某時刻有多個部分在同時執行,比如有中斷處理過程,或
存在多個裝置等,對公共資料或程式碼的訪問就需要同步。方法有
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Windows NT 裝置驅動程式開發基礎(1) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(3) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(2) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(4) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(5) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(7) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(8) (轉)Windows
- DeviceDriver Windows NT 驅動程式型別 (轉載) (轉)devWindows型別
- SCO UNIX 下裝置驅動程式開發 (轉)
- SCO UNIX 下裝置驅動程式開發(轉)
- 使用Windows 95虛擬裝置驅動程式(VxD) (轉)Windows
- Windows95的裝置驅動程式的編寫 (轉)Windows
- Linux裝置驅動程式 (轉)Linux
- linux裝置驅動編寫基礎Linux
- 開發Linux系統裝置驅動程式並不難(轉)Linux
- Linux驅動開發筆記(四):裝置驅動介紹、熟悉雜項裝置驅動和ubuntu開發雜項裝置DemoLinux筆記Ubuntu
- Windows裝置和驅動的安裝Windows
- Linux下的硬體驅動——USB裝置(下)(驅動開發部分)(轉)Linux
- LINUX下的裝置驅動程式 (轉)Linux
- 用 Delphi 編寫 VxD 裝置驅動程式(轉) (轉)
- 【linux】驅動-6-匯流排-裝置-驅動Linux
- Linux裝置驅動程式學習----1.裝置驅動程式簡介Linux
- Linux驅動之裝置樹的基礎知識Linux
- 字元裝置驅動 —— 字元裝置驅動框架字元框架
- iOS 裝置驅動 for windows 32&64iOSWindows
- 《Linux裝置驅動開發詳解(第2版)》——第1章Linux裝置驅動概述及開發環境構建1.1裝置驅動的作用Linux開發環境
- Linux裝置驅動之字元裝置驅動Linux字元
- UNIX下裝置驅動程式的基本結構(轉)
- 基於匯流排裝置驅動模型的按鍵讀取驅動程式模型
- 在Linux中,什麼是裝置驅動程式?如何安裝和解除安裝裝置驅動程式?Linux
- Linux裝置驅動開發詳解:基於Linux4.0核心Linux
- 裝置驅動程式包可以刪除嗎 win10裝置驅動程式包能刪嗎Win10
- 裸裝置基礎知識(轉)
- 深入淺出:Linux裝置驅動之字元裝置驅動Linux字元
- 乾坤合一:Linux裝置驅動之塊裝置驅動Linux
- Windows的驅動開發模型Windows模型
- Windows驅動開發入門Windows
- 虛擬裝置驅動程式的設計與實現 (轉)