星期三, 8月 16, 2006

WDM : Driver's Life

IRP (I/O Request Packet) : 內含command, data的一組封包。系統和Driver溝通時使用。

  1. 系統偵測到device,將對應的driver load到memory,呼叫driver的DeviceEntry()。
  2. 系統的PnP Manager 呼叫driver的AddDevice( )。
  3. PnP將IRP 傳送給driver,讓driver處理。
  4. Application 開啟裝置,導致系統將一些IRP傳送給driver。
  5. Application 讀取裝置,系統將對應的IRP傳送給driver,driver把data備妥,放到message中傳回給系統。
  6. device有INT 發生時,driver的中斷服務常式開始工作。
  7. 系統偵測到device移除,PnP Manager 送一些IRP給driver,然後呼叫driver的DriverUnload( )。完成後,系統將driver從memory中移出。

以上看來Driver要實做三類function:
  1. Basic
    DriverEntry( ), AddDevice( ), DriverUnload( )
  2. I/O control
    StartIo( ), AdapterControl( ), OnInterrupt( ),
  3. Dispatch
    DispatchPnP, DispatchPower, DispatchWmi
系統偵測到裝置時,如何找倒對應的driver呢?
  • 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和以往NT, 95的VxD不一樣,WDM完全被動的由系統呼叫,VxD則要自己載入,自己偵測硬體。


WDM 至少包含兩種driver 程式:function driver 和 bus driver。
  • Function Driver : 處理device的function
  • Bus Driver : 處理device hardware - bus相關的動作
有些WDM還會有 Filter Driver: Upper-level Filter / Lower-Level Filter
這些driver的相依關係可以由IRP的傳遞過程來看,系統利用IRP和driver溝通
IRP -> UpperLevelFilter -> Function -> LowerLevel -> Bus
把一開始的第一點: "系統偵測到裝置,把對應的driver load到memory"的動作說得更詳細一點:
  1. 系統的bus drver (PCI, USB, PCMCIA)偵測到有hardware 加入,呼叫系統的IoInvalidate DeviceRelation( ),這個function 會通知PnP Manager 硬體裝置有改變。
  2. PnP Manager知道硬體裝置有改變後,發送一個IRP給bus driver,取得更新後的裝置PDO (Physical Device Object)序列。PnP可以對照序列中有哪一個PDO是新增加的。
  3. PnP Manager傳送另一個IRP給bus driver,詢問某個新增加的PDO他的device identifier是甚麼。
  4. device driver讀取該硬體的id,轉成device identifier傳給PnP Manager
    device identifier 是一個像這樣的字串: "PCI\VEN_100C&DEV_001E&SUBSYS_000001"
  5. PnP Manager將device_identifier的hardware_key(VEN_..以下)放到registry中 (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\...busname..)。

沒有留言:

網誌存檔