分頁記憶體是低中斷級別的例程可以訪問的。
而非分頁記憶體則是各個中斷級別的例程都可以使用的。
區別在於:
分頁記憶體是虛擬記憶體,在物理上未必總是能得到。
作業系統實現虛擬記憶體的主要方法就是通過分頁機制。在win32中,實體地址空間,二維虛擬位址空間和實際記憶體位址是三個不同的概念。作業系統通過段選擇子構成二維虛擬位址空間,每個程序有乙個4g的位址空間,然後作業系統的記憶體管理器件把每個程序對映到一維實體地址空間的不同部分,但是因為我們實際機器上大都沒有4g記憶體,所以,實際記憶體空間是實體地址空間的子集。
分頁管理器把位址空間劃分成4k大小的頁面(非intel x86體系與之不同),當程序訪問某個頁面時,作業系統首先在cache中查詢頁面,如果該頁面不在記憶體中,則產生乙個缺頁中斷(page fault),程序就會被阻塞,直至要訪問的頁面從外存調入記憶體中。
我們知道,在處理低優先順序的中斷時,仍可以發生高優先順序的中斷。既然缺頁過程也是乙個中斷過程,那麼就產生乙個問題,即,缺頁中斷和其他中斷的優先順序的問題。如果在高於缺頁中斷的中斷優先順序上再發生缺頁中斷,核心就會崩潰。所以在dispatch_level級別以上,絕對不能使用分頁記憶體,一旦使用分頁記憶體,就有發生缺頁中斷的可能,前面說過,這樣會導致核心崩潰。
另一種解釋:
雖然可以定址4gb的記憶體,而在pc裡往往沒有如此多的真實物理記憶體。作業系統和硬體(這裡指的是cpu中的記憶體管理單元mmu)為使用者提供了虛擬記憶體的概念。windows的所有程式(包括ring0層和ring3層的程式)可以操作的都是虛擬記憶體。之所以稱為虛擬記憶體,是因為對它的所有操作,最終會變成一系列對真實物理記憶體的操作。在cpu中有乙個重要的暫存器cr0,它是32位的暫存器,其中的乙個位(pg位)是負責告訴系統是否分頁的。windows在啟動前會將它的pg位置1,即允許分頁。巨集page_size記錄分頁大小4kb,4gb的虛擬記憶體會被分割成1m個分頁單元。
有一部分單元會和物理記憶體對應起來,這種對應不是一一對應,而是多對一的對映,多個虛擬記憶體頁可以對映同乙個物理記憶體頁。還有一部分單元會被對映成磁碟上的檔案,並標記為臟的(dirty)。0~0x7fffffff範圍內的虛擬記憶體,即低於2gb的虛擬位址為使用者核心模式位址,而0x80000000~0xffffffff範圍內的虛擬記憶體,即高2gb的虛擬記憶體,為核心模式位址。windows的核心**和windows的驅動程式載入的位置都是在高2gb的核心位址裡,所以一般的應用程式是不能訪問到這些核心**和重要資料的。同時windows作業系統在程序切換時,保持核心模式位址是完全相同的。也就是說,所有程序的核心位址對映完全一致,程序切換的時候,只改變使用者模式位址的對映。
windows規定有些虛擬記憶體頁面是可以交換到檔案中的,這類記憶體被稱為分頁記憶體。而有些虛擬記憶體永遠不會交換到檔案中,這些記憶體被稱為非分頁記憶體。當程式的中斷請求級在dispatch_level之上(包括dispatch_level層),程式只能使用非分頁記憶體,否則將導致藍屏宕機。
分頁記憶體和非分頁記憶體區別
在寫驅動的時候,經常要呼叫exallocatepoolwithtag函式分配記憶體,其中第乙個引數可以是如下幾個 nonpagedpool 從非分頁記憶體池中分配記憶體 pagedpool 從分頁記憶體池中分配記憶體 nonpagedpoolmustsucceed 從非分頁記憶體池中分配記憶體,如果...
何謂可分頁和非分頁記憶體
何謂可分頁和非分頁記憶體 預設情況下,核心載入器會載入所有的 部分和全域性資料到非分頁記憶體中。而且,載入器是一次載入整個驅動的可執行檔案,包括相關的dll。載入後,核心載入器關閉驅動程式檔案,甚至你可以刪除當前正在執行的驅動檔案。但是,你可以告訴載入器你希望驅動的哪部分是可分頁,所謂可分頁,就是可...
中斷請求 分頁記憶體和非分頁記憶體
以下均為個人見解,如果有錯,希望大家指正,謝謝。最近在學習windows驅動,沒辦法,逃避不了對windows記憶體管理的學習,我向來對此比較感冒,看了好多回始終不得要領,拋磚引玉,希望仁者見仁 智者見智。1 在直接講述分頁與非分頁記憶體的相關知識前,還需要先了解點中斷的知識。irql 中斷請求級別...