2010-09-28 50 views
0

目前我所有的驅動程序代碼都是這樣做的,主要是因爲我曾與一位非常資深的驅動程序員一起工作了幾年,他曾經在Windows內核團隊工作了15年,並且他需要它。我養成了它的習慣,從來沒有真正問過「爲什麼?」這個問題。爲什麼我們從頁面緩衝池中分配並使用編譯指示來分配分頁功能?

我知道明顯的原因,如非分頁池稀缺相比,分頁,你不能對目標系統(像很多非分頁內存將如何可用)的假設。但是我們最近繼承了大量的Linux驅動程序員,他們開始使用我的驅動程序代碼(顯然Linux中沒有這樣的區別),當我告訴他們代碼/數據必須放入分頁池時可能。

那麼,是什麼真正原因我們做分頁/未分頁池分配?

回答

4

總之,Windows會嘗試通過分頁其內核分配以減少內存消耗。

加長版:任何非分頁分配必須保留在物理內存中,直到釋放。因此,這些分配消耗虛擬地址空間和物理內存。虛擬地址在32位系統中是非常有限的,因此驅動程序的分配是由稀缺的空間(因爲分配是全局的)完成的。在64位Windows系統上,有相當大的VA空間,所以這不是特別關心的問題。

然而,每一個分配仍然使用的物理內存。因此用戶不可用的內存可能很小(我的機器上當前大約爲2.5%)。在VM環境中運行時會引起更大的關注,因爲這些分配是累積的。因此,減少非分頁分配將允許更多虛擬機實例在物理機器上運行。

分頁分配可以分頁到磁盤,因此只能在PASSIVE和APC級別訪問,否則您可能會看到藍屏,因爲Windows無法在較高的IRQL上處理頁面錯誤。

出演:

  1. 如果司機在DPC或更高IRQL工作,然後確定你的代碼的合理分區/數據段需要這些水平,使他們NONPAGED。
  2. 如果駕駛員不改變的IRQL,也沒有采取中斷,然後進行分頁成爲一個好公民,並儘量減少你的物理內存使用所有分配。
+0

足夠的信息讓我從谷歌需要。謝謝。 – 2010-09-28 23:52:08