在寫驅動的時候,經常要呼叫exallocatepoolwithtag函式分配記憶體,其中第乙個引數可以是如下幾個:
nonpagedpool
從非分頁記憶體池中分配記憶體
pagedpool
從分頁記憶體池中分配記憶體
nonpagedpoolmustsucceed
從非分頁記憶體池中分配記憶體,如果不能分配則產生bugcheck
nonpagedpoolcachealigned
從非分頁記憶體池中分配記憶體,並確保記憶體與cpu cache對齊
nonpagedpoolcachealignedmusts
與nonpagedpoolcachealigned類似,但如果不能分配則產生bugcheck
pagedpoolcachealigned
從分頁記憶體池中分配記憶體,並確保記憶體與cpu cache對齊
其中,主要的兩個區別就是分頁記憶體和非分頁記憶體。
分頁記憶體是低中斷級別的例程可以訪問的。
而非分頁記憶體則是各個中斷級別的例程都可以使用的。
區別在於:
分頁記憶體是虛擬記憶體,在物理上未必總是能得到。
作業系統實現虛擬記憶體的主要方法就是通過分頁機制。在win32中,實體地址空間,二維虛擬位址空間和實際記憶體位址是三個不同的概念。作業系統通過段選擇子構成二維虛擬位址空間,每個程序有乙個4g的位址空間,然後作業系統的記憶體管理器件把每個程序對映到一維實體地址空間的不同部分,但是因為我們實際機器上大都沒有4g記憶體,所以,實際記憶體空間是實體地址空間的子集。
分頁管理器把位址空間劃分成4k大小的頁面(非intel x86體系與之不同),當程序訪問某個頁面時,作業系統首先在cache中查詢頁面,如果該頁面不在記憶體中,則產生乙個缺頁中斷(page fault),程序就會被阻塞,直至要訪問的頁面從外存調入記憶體中。
我們知道,在處理低優先順序的中斷時,仍可以發生高優先順序的中斷。既然缺頁過程也是乙個中斷過程,那麼就產生乙個問題,即,缺頁中斷和其他中斷的優先順序的問題。如果在高於缺頁中斷的中斷優先順序上再發生缺頁中斷,核心就會崩潰。所以在dispatch_level級別以上,絕對不能使用分頁記憶體,一旦使用分頁記憶體,就有發生缺頁中斷的可能,前面說過,這樣會導致核心崩潰。
分頁記憶體,非分頁記憶體
分頁記憶體是低中斷級別的例程可以訪問的。而非分頁記憶體則是各個中斷級別的例程都可以使用的。區別在於 分頁記憶體是虛擬記憶體,在物理上未必總是能得到。作業系統實現虛擬記憶體的主要方法就是通過分頁機制。在win32中,實體地址空間,二維虛擬位址空間和實際記憶體位址是三個不同的概念。作業系統通過段選擇子構...
何謂可分頁和非分頁記憶體
何謂可分頁和非分頁記憶體 預設情況下,核心載入器會載入所有的 部分和全域性資料到非分頁記憶體中。而且,載入器是一次載入整個驅動的可執行檔案,包括相關的dll。載入後,核心載入器關閉驅動程式檔案,甚至你可以刪除當前正在執行的驅動檔案。但是,你可以告訴載入器你希望驅動的哪部分是可分頁,所謂可分頁,就是可...
中斷請求 分頁記憶體和非分頁記憶體
以下均為個人見解,如果有錯,希望大家指正,謝謝。最近在學習windows驅動,沒辦法,逃避不了對windows記憶體管理的學習,我向來對此比較感冒,看了好多回始終不得要領,拋磚引玉,希望仁者見仁 智者見智。1 在直接講述分頁與非分頁記憶體的相關知識前,還需要先了解點中斷的知識。irql 中斷請求級別...