- 系統偵測到device,將對應的driver load到memory,呼叫driver的DeviceEntry()。
- 系統的PnP Manager 呼叫driver的AddDevice( )。
- PnP將IRP 傳送給driver,讓driver處理。
- Application 開啟裝置,導致系統將一些IRP傳送給driver。
- Application 讀取裝置,系統將對應的IRP傳送給driver,driver把data備妥,放到message中傳回給系統。
- device有INT 發生時,driver的中斷服務常式開始工作。
- 系統偵測到device移除,PnP Manager 送一些IRP給driver,然後呼叫driver的DriverUnload( )。完成後,系統將driver從memory中移出。
以上看來Driver要實做三類function:
- Basic
DriverEntry( ), AddDevice( ), DriverUnload( ) - I/O control
StartIo( ), AdapterControl( ), OnInterrupt( ), - Dispatch
DispatchPnP, DispatchPower, DispatchWmi
- PnP裝置:
PnP裝置必須要包含自己的id,大概是像PCI device中的Vender-function-type code,所以當PCI controller可以讀取pci card的這個id。 對照 Registry 和 INF 檔,找到對應的driver- 有PnP功能的bus有: PCI,USB,PCMCIA。
- 非PnP裝置:
非PnP裝置沒有id,所以需要user作加入device的動作( Add New Hardware Wizard)。 之後,系統由registry和INF檔找到driver。- 沒有PnP功能的bus有:ISA。
WDM 至少包含兩種driver 程式:function driver 和 bus driver。
- Function Driver : 處理device的function
- Bus Driver : 處理device hardware - bus相關的動作
這些driver的相依關係可以由IRP的傳遞過程來看,系統利用IRP和driver溝通
IRP -> UpperLevelFilter -> Function -> LowerLevel -> Bus把一開始的第一點: "系統偵測到裝置,把對應的driver load到memory"的動作說得更詳細一點:
- 系統的bus drver (PCI, USB, PCMCIA)偵測到有hardware 加入,呼叫系統的IoInvalidate DeviceRelation( ),這個function 會通知PnP Manager 硬體裝置有改變。
- PnP Manager知道硬體裝置有改變後,發送一個IRP給bus driver,取得更新後的裝置PDO (Physical Device Object)序列。PnP可以對照序列中有哪一個PDO是新增加的。
- PnP Manager傳送另一個IRP給bus driver,詢問某個新增加的PDO他的device identifier是甚麼。
- device driver讀取該硬體的id,轉成device identifier傳給PnP Manager
device identifier 是一個像這樣的字串: "PCI\VEN_100C&DEV_001E&SUBSYS_000001" - PnP Manager將device_identifier的hardware_key(VEN_..以下)放到registry中 (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\...busname..)。
沒有留言:
張貼留言