Windows的PNP和電源特性概述

轉載註明 >> 【作者:張佩】【鏡像http://www.yiiyee.cn/Blog/pnp/

這一節講述一般設備的PNP和電源特性。

PNP特性

PNP是Plug And Play的簡稱,代表和外部設備插拔有關事件的處理。PNP是現代操作系統必須支持的基本特性,其目的是希望操作系統能夠在軟硬件支援下,在基本無需用戶干預的情況下,即可很好地處理外部設備的接入和移除操作;當設備配置發生動態變更時,系統也能悄沒生息地處理好,並一切正常地使用它們。

stocking-station

有些筆記本是當成工作站來用的,這樣就需要很多外部接口。但一般的筆記本,侷限於物理空間,不能夠提供過多的外部接口,會使用接口塢來擴展見左圖例。大的接口塢上通常有十幾、數十個擴展接口,來滿足工作站的接口要求。其實,一些移動設備,如手機、平板電腦,也使用接口塢的方式實現擴展,不過接口少一些。接口塢接入主機的時候,系統如果有PNP支援,就能夠直接使用上面的接口了,不用重啓系統,一般也不用手動安裝設備驅動。

PNP特性,需要操作系統、驅動程序和硬件的三方支持。缺了某一方都不能實現。比如PCI設備,雖然可以在PCI驅動程序中實現某種程度的PNP支持,但因爲設備本身的電氣化特性,是不支持PNP的,所以我們仍不能熱插拔PCI設備。另外一種情況是,如果設備驅動寫得不好,未能正確地處理PNP請求,那麼即使設備本身是支持熱插拔的,也會有問題。比如現在很多定製的USB設備,如加密U盤、網銀密碼器等,如果驅動寫的不好,用戶往往會在插拔設備的時候遭遇藍屏。

概括地講,爲了很好地支援PNP特性,需要做到下面幾點:

  1. 運行時識別設備。不僅在系統初始化的時候,能識別並正確配置設備。在系統正常運行的過程中,如果有設備動態接入,也能夠正確識別並配置設備;如果設備動態移除,也能夠正確響應並回收系統資源。
  • 系統還需要爲設備動態加載設備驅動程序。設備的驅動信息保存在註冊表中,系統從註冊表中查找設備的驅動信息。如果註冊表中找不到相關記錄,系統會嘗試自動爲設備安裝驅動,否則就通過UI界面,要求用戶手動安裝驅動。
  1. 動態識別並配置設備。操作系統可以動態配置外部設備,而不應假設只有某些設備會接入系統,併爲它們靜態分配或保留系統資源。不能因爲新設備的動態接入而令系統陷入錯誤狀態,比如系統停止響應,系統崩潰等。操作系統要有爲設備動態分配系統資源的能力,這些系統資源包括:IO地址空間、物理內存映射、中斷、DMA等。設備驅動再根據它所動態獲取的資源來配置設備。比如一個支持硬件中斷的設備,它每次從系統處獲得的中斷號,都可能不同。那麼設備和驅動程序,就不能假定設備的中斷號是一個固定的值。
  1. PNP接口。操作系統中有一個PNP管理器模塊,包含用戶和內核兩個子模塊,所以它能夠對用戶程序和內核驅動分別提供PNP支持。它們和設備驅動、用戶程序之間,有一個定義良好的接口。這個接口用來互相通知PNP事件。簡略地講,它包含三個方面:
  • 1. 當PNP管理器檢測到PNP事件的時候,能夠把這些事件通知給設備驅動。包括設備接入、移除、異常移除等。
  • 2. 當設備驅動需要向系統報告子設備的時候,能把這個信息通知給系統。當用戶程序想動態移除指定設備的時候,也可能通過UI程序實現,這些UI程序實際上是調用了系統提供的PNP接口來實現的。比如我們在移除U盤設備的時候,一般不會直接拔除,而是先通過托盤欄中的彈出設備程序移除設備,以免破壞數據。
  • 3. 驅動或用戶程序,還可以通過註冊通知函數,來接收PNP通知。比如內核驅動可以通過調用IoRegisterPlugPlayNotification函數註冊一個通知函數,當感興趣的目標發生PNP事件時,PNP管理器就會調用它的通知函數,並通過參數告知它PNP事件的詳細信息。用戶程序也可以通過WM_DEVICECHANGE消息來接收設備PNP的通知。
  • 這套接口,主要由PNP管理器所提供的若干接口函數,若干類型爲IRP_MJ_PNP的IRP包,及驅動程序所提供的AddDevice回調來實現。

電源特性

電源操作的目的是類似的,也是爲了能夠在用戶儘量少介入的情況下,就能夠正確地配置和使用外部設備。現代計算機和操作系統,都實現了多個級別的系統和設備電源狀態。系統和設備可以在這些電源狀態之間進行切換,並達到正常情況下全力供電,空閒情況下儘量省電的目的

系統的電源狀態用S0-S5來標識。S0是正常狀態,S1-S3是休眠狀態,但休眠的深度有差別,S4是睡眠狀態,S5是軟關機狀態(Soft Off,不完全等同於斷電)。除了S0和S5這兩個必須支持的狀態外,系統還支持哪些電源狀態,是由系統BIOS決定的。一般來講,計算機系統都會支持S3和S4這兩個狀態。否則除了開機就是關機,電腦用起來會很麻煩。

設備的電源狀態用D0-D3來標識。D0是正常狀態,D1-D2是休眠狀態,但深度有差別,D3是斷電狀態。其中D3還分Hot和Cold兩種子狀態。

在D3Hot狀態下,設備的功能已喪失但仍有外部或總線供電,使得設備本身還能被系統檢測到。和設備相連的控制器設備認爲此設備還連接着,只要控制器上有設備連接着,控制器就要處於工作狀態。但在D3Cold狀態下,系統已檢測不到設備,這可能是由於設備的已經斷電了,或者系統本身已經處於休眠狀態而導致的。和設備連接的控制器,已經不認爲設備和自己連着,在其它條件滿足的情況下,控制器可以進入完全的休眠狀態。

設備電源狀態,需要由設備本身和設備驅動一起來實現。有些設備只支持正常和斷電兩種狀態(即D0和D3),而沒有休眠的功能。那麼設備驅動只需要處理D0和D3兩種狀態即可。有些設備則提供了休眠功能(即可進入D1或D2狀態),驅動程序在這種情況下,仍然可以決定支持或不支持設備的休眠狀態。在支持的情況下,當設備進入休眠狀態時,驅動程序負責關閉部分硬件模塊,讓其它模塊繼續工作。

系統中有一個電源管理器模塊,它負責系統範圍內的電源策略。當系統的電源狀態發生變化時,它負責把要進行的電源操作及電源狀態,通知給每個設備棧,讓它們來處理電源變化。設備驅動需正確地處理電源事件,有很多系統藍屏就發生在驅動程序處理電源事件的過程中。

物理設備的功能設備驅動,一般就是這個物理設備的電源策略制定者,功能設備驅動在設備初始化的時候,會把設備電源狀態映射到系統電源狀態,並把這個映射彙報給電源管理器。這樣電源管理器就可以根據系統電源狀態,發送相應的設備電源狀態給設備驅動。這個映射體現在設備管理器程序中的設備屬性界面中,我們可以通過它來觀察不同設備的電源狀態映射。下圖就是一個例子:

powerStateMap

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章