32位平台下,cpu的定址能力為4gb,pc中有些裝置(如顯示卡)都提供自己的裝置記憶體,這部分記憶體會對映到pc的物理記憶體上,也就是讀寫這段物理記憶體位址,其實是在讀寫裝置記憶體位址,而不會讀寫物理記憶體位址。雖然提供了4gb的定址能力,但是實際可能沒有這麼大的物理記憶體,這樣就引入了虛擬記憶體。windows的所有程式(包括ring3和ring0的程式)實際操作的都是虛擬記憶體。對虛擬記憶體的操作,最終都會變成對實際物理記憶體的操作。由於windwos是個多工作業系統,到此,我們碰到了幾個問題:一是,虛擬記憶體和真實的物理記憶體如何對應轉換?二是,同時執行的程序如何實現自己記憶體空間的保護,同時在必要是也能共享部分記憶體?三是,因為虛擬記憶體實際是使用了磁碟,那需要有個演算法在記憶體中來調入調出。我們來一一解釋上面的疑問。
在cpu中有個cr0的暫存器,這個32位的暫存器中的乙個位(pg位)是負責告訴系統是否分頁。windwos在啟動前將此位置1,即windows允許分頁。ddk中有個page_size巨集記錄分頁的大小,一般為4kb。這樣,虛擬記憶體會被分割成1m個分頁單元。其中部分單元會和物理記憶體對應起來。如虛擬記憶體中的第n個分頁單元對應著物理記憶體第m個分頁單元。這是多對一的對映,多個虛擬記憶體頁可以對映同乙個物理記憶體頁。還有一部分單元會以檔案的形式對映到磁碟上,並標記位髒(dirty)。讀取這段虛擬記憶體時,系統會發出異常,觸發異常處理函式,異常處理函式將這個頁的磁碟檔案讀入記憶體,並將其標記位不髒。還有一部分的單元什麼也不對應,即空的。有些物理既對映到程序1,也對映到程序2,這樣修改程序2的那段虛擬記憶體也就修改了程序1上的那段虛擬記憶體,這種方法達到了程序間的記憶體共享。
虛擬位址在0~0x7fffffff範圍內的虛擬記憶體,即低2gb的虛擬位址,是使用者模式位址,使用者態(ring3)程式只能訪問這段位址。而0x80000000~0xffffffff範圍的虛擬位址,即高2gb的虛擬位址,是核心模式位址。執行在核心態(ring0)的程式能訪問整個4gb的位址空間。windows的核心**和windows的驅動程式載入的位置都在高2gb的核心位址中。同時,windows作業系統在進行程序切換時,保持核心模式位址是完全相同的,只改變使用者模式位址的對映。
驅動程式可以看成是乙個特殊的dll檔案被應用程式載入到虛擬記憶體中,只不重載入位址是核心模式位址,而不是使用者模式位址。它能訪問的只是這個程序的虛擬記憶體,而不能是其他程序的虛擬位址空間。windows驅動程式裡的不同例程執行在不同的程序中。driverentry例程和adddevice例程是執行在系統(system)程序中的。而其他一些例程,如irp_mj_read等派遣函式會執行在某個程序環境中,所能訪問的虛擬位址是這個程序的虛擬位址。
Windows 記憶體管理
windows 2000 使用基於分頁機制的虛擬記憶體。每個程序有4gb的虛擬位址空間。基於分頁機制,這4gb位址空間的一些部分被映 物理記憶體,一些部分對映硬碟上的交換檔案,一些部分什麼也沒有對映。程式中使用的都是4gb位址空間中的虛擬位址。而訪問物理記憶體,需要使用實體地址。下面我們看看什麼是實...
Windows記憶體管理
虛擬位址空間 程序可用的虛擬位址範圍稱為該程序的 虛擬位址空間 每個使用者模式程序都有其各自的專用虛擬位址空間。對於 32 位程序,虛擬位址空間通常為 2 gb,範圍從 0x00000000 至 0x7fffffff。那麼什麼又是使用者模式?使用者模式與核心模式 這同樣是cpu的概念。cpu就有這兩...
windows記憶體管理
物理記憶體 硬體中真實存在的儲存空間。轉換操作,將程式中的虛擬位址轉換為硬碟中的真實位址 分頁和分段 api 1.堆管理 獲取 分配 1 handle heapcreate dword floptions,size t dwinitialsize,size t dwmaximumsize 為當前程序...