1、通常,驅動程式在某些不可**執行緒的上下文中應該使用非同步方式處理
i/o請求。我們使用術語任意執行緒上下文
(arbitrary thread context)
來描述驅動程式並不知道
(或並不關心
)處理器當前執行在哪乙個執行緒上的上下文。
<?xml:namespace prefix = o />
2、 windows 2000
使用對稱多處理器模型,即所有的處理器都是相同的,系統任務和使用者模式程式可以執行在任何乙個處理器上,並且所有處理器都平等地訪問記憶體。多處理器的存在給裝置驅動程式帶來了乙個困難的同步問題,因為執行在多個
cpu上的**可能同時訪問共享資料或共享硬體資源。
windows 2000
提供了乙個同步物件,自旋鎖
(spin lock)
,驅動程式可以使用它來解決多處理器的同步問題。
3、當cpu執行在
passive_level
級時,當前執行的執行緒可以被任何優先順序大於它的執行緒搶先。然而,一旦
cpu的
irql
大於passive_level
級,執行緒搶先將不再發生,此時
cpu執行在使
cpu越過
passive_level
級的任意執行緒上下文中。但是,執行在任何
irql
級上的活動都可以被更高
irql
級上的活動中斷。所以驅動程式必須假定在任何時刻都可能失去控制權,而此時系統可能需要執行更基本的任務。
4、為了實現可配置性,首先應該在**中避免直接引用硬體,即使是在平台相關的條件編譯塊中也是這樣。應該使用
hal工具或呼叫低階匯流排驅動程式,或者實現乙個標準的或定製的控制介面,並通過控制面板程式與使用者互動。另外,還應該支援
windows
管理儀器
(wmi)
控制項,這種控制項允許使用者和管理員在分布式企業環境中配置硬體特徵。最後,應該使用登錄檔作為配置資訊的資料庫,這可以使配置資訊在系統重新啟動後仍然存在。
5、為了實現這種可移植性,驅動程式應該全部用
c寫,並且只使用
ansi c
標準規定的語言元素。應避免使用編譯器廠商專有的語言特徵,並避免使用沒有被作業系統核心輸出的執行時間庫函式
(參見第三章
)。如果不能避免驅動程式中的平台依賴,至少應該用條件編譯指令隔離這些**。
6、可以把乙個完整的驅動程式看作是乙個容器,它包含許多例程,當作業系統遇到乙個
irp時,它就呼叫這個容器中的例程來執行該
irp的各種操作。
可以把乙個完整的驅動程式看作是乙個容器,它包含許多例程,當作業系統遇到乙個irp
時,它就呼叫這個容器中的例程來執行該
irp的各種操作。有些例程,例如
driverentry
和adddevice
,還有與幾種
irp對應的派遣函式將出現在每乙個這樣的容器中。需要對
irp排隊的驅動程式一般都有乙個 startio
例程。執行
dma傳輸的驅動程式應有乙個
adaptercontrol
例程。大部分能生成硬體中斷的裝置,其驅動程式都有乙個中斷服務例程
(isr)
和乙個推遲過程呼叫
(dpc)
例程。驅動程式一般都有幾個支援不同型別
irp的派遣函式,其中三個派遣函式是必須的。所以,
wdm驅動程式開發 者的乙個任務就是為這個容器選擇所需要的例程。
圖示 p21 1-5
wdm驅動程式「容器」中的內容
7、有三種登錄檔鍵負責配置。它們是硬體
(hardware)
鍵、類
(class)
鍵、服務
(service)
鍵。必須明確一點,這些名字(指
hardware
、class
、service)
並不是某個專用子鍵的名稱:它 們是這三種鍵的一般稱謂,其具體的路徑名要取決於它們所屬的裝置。概括地講,硬體鍵包含單個裝置的資訊,類鍵涉及所有相同型別裝置的共同資訊,服務鍵包含 驅動程式資訊。有時人們用「例項
(instance)鍵」
和「軟體(software)鍵」
來代表硬體鍵和服務鍵。
裝置的硬體鍵出現在登錄檔local machine
分支的\system\currentcontrolset\enum
子鍵上。
應用程式經常需要訪問登錄檔中關於硬體裝置的資訊。為了使這成為可能而同時又不暴露重要的enum
鍵,microsoft
提供了一組
setupdi***
函式。
裝置介面的符號連線名(
通過列舉該介面
guid
的所有例項或者從
wm_devicechange
訊息的引數中獲得這個名字)。
classguid
是裝置類
guid(
全域性唯一識別符號)的
ascii
形式;在效果上,它是乙個指向該裝置類鍵的指標。
service
指向服務鍵。 類鍵
所有裝置類的類鍵都出現在hklm\system\currentcontrolset\control\class
鍵中。它們的鍵名是由
microsoft
賦予的guid值。
服務(或軟體)鍵
對裝置驅動程式重要的最後乙個鍵是服務鍵。它指出驅動程式執行檔案的位置,以及控制驅動程式裝入的一些引數。服務鍵位於hklm\system\currentcontrolset\services
鍵中。
當我說系統「裝入」
乙個驅動程式時,是指系統把驅動程式的映像對映到虛擬記憶體中,並重定位記憶體參考,最後呼叫驅動程式的主入口點。主入口點通常命名為
driverentry
。我將在本章後面講述
driverentry
函式。如果驅動程式已經在記憶體中,則裝入過程僅僅是增加驅動程式映像的參考計數。
8、驅動程式的裝入順序並不是很重要。系統以
pnp管理器裝入驅動程式的順序呼叫驅動程式的
adddevice
函式,而這個順序與裝置物件在裝置堆疊**現的順序完全一致。
圖示2-2
裝置遞迴列舉過程
圖示2-2
顯示了乙個由多個裝置堆疊組成的樹形結構,但這並不表示
irp必須從上一層的
pdo流向下一層的
fido
。實際上,乙個堆疊的
pdo驅動程式就是其下一層堆疊的
fdo驅動程式,見圖示
2-2中的陰影塊。當驅動程式以
pdo角色接收到乙個
irp時,它對該
irp執行一些操作但不發出這個或其它
irp到裝置(以
fdo角色
)。相反,當匯流排驅動程式以
fdo角色接收到乙個
irp時,它可能需要向裝置傳送某些
irp(
以pdo角色)
圖示 圖2-8
裝置(位於二級匯流排
)讀請求處理流程
windows驅動程式開發初探
最近,由於需求推動,自己得開始學一下在windows下如何開發驅動程式。雖然,後來由於其他的原因使得學習沒繼續下去,但是我還是把一些粗略的學習經歷與體會寫在這裡,方便自己日後捲土重來,也方便其他的對windows開發一竅不通的有志之士參考一下。一 開發的目的 二 開發的歷程 1 學習的歷程 要開發出...
Linux裝置驅動程式模型
第1章 linux裝置驅動程式模型 linux系統中包含字元裝置 塊裝置 網路裝置三類基本的裝置驅動程式。隨著技術的不斷進步,linux驅動程式體系的拓撲結構越來越複雜,linux 2.4核心已經不能適應這種形勢的需求。為此2.6核心開發了全新的裝置模型,它採用sysfs檔案系統,該檔案系統是乙個類...
48 Windows驅動程式模型筆記(六),同步
關於 同步 執行在某執行緒上下文中的 在任何時刻都可能被系統奪去控制權。另外,只有在多處理器的計算機上才能真正實現多執行緒的併發執行 windows nt為解決一般的同步問題提供了兩種方法,乙個是中斷請求優先順序 irql 方案,另乙個是在關鍵 段周圍宣告和釋放自旋鎖。irql可以避免在單 cpu上...