43 Windows驅動程式模型筆記 一

2021-09-08 21:18:36 字數 3786 閱讀 9028

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上...