Win32之內(nèi)存管理之虛擬內(nèi)存跟物理內(nèi)存

一、虛擬內(nèi)存與物理內(nèi)存

我們知道,每個應(yīng)用程序都擁有自己獨(dú)立的4GB空間。例如,假設(shè)A進(jìn)程在地址123處存儲了值10,而B進(jìn)程在地址123處存儲了值20,這兩個進(jìn)程互不影響。然而,這些值是真實(shí)存在的,并且存儲在物理內(nèi)存中。如下圖所示:

Win32之內(nèi)存管理之虛擬內(nèi)存跟物理內(nèi)存

根據(jù)上圖,我們可以區(qū)分虛擬內(nèi)存和物理內(nèi)存。如果我們修改了物理內(nèi)存的值,那么會影響A進(jìn)程或B進(jìn)程。

當(dāng)然,如果你學(xué)過內(nèi)核驅(qū)動開發(fā),就知道內(nèi)核驅(qū)動讀寫正是這種機(jī)制。我也曾編寫過一個簡單的內(nèi)核驅(qū)動讀寫程序,詳情請查看內(nèi)核驅(qū)動目錄。

因此,虛擬內(nèi)存是虛構(gòu)的,只有在使用時才會映射到物理內(nèi)存中。

二、物理內(nèi)存的管理

物理內(nèi)存是以4KB(即4096字節(jié))的方式進(jìn)行管理的,這一單位也稱為一頁。因此,在使用API時,我們經(jīng)常會看到與頁相關(guān)的操作,這是因?yàn)閮?nèi)存是以頁為單位進(jìn)行管理的。

如下圖所示:

Win32之內(nèi)存管理之虛擬內(nèi)存跟物理內(nèi)存

進(jìn)程A的值被放置在物理頁中。

傳統(tǒng)上,進(jìn)程擁有4GB的地址空間,但實(shí)際上分為高2GB和低2GB。高2GB由內(nèi)核使用,因此用戶只能使用低2GB。而低2GB中也有高低各64KB的部分是不可用的(如果學(xué)過內(nèi)核,可以通過構(gòu)造來使用)。

如下圖所示:

Win32之內(nèi)存管理之虛擬內(nèi)存跟物理內(nèi)存

用戶模式可以使用的內(nèi)存是橘黃色部分,但沒有對應(yīng)的物理頁。只有當(dāng)我們申請內(nèi)存時,才會有對應(yīng)的物理頁。

如果想查看三環(huán)程序使用的物理頁,可以通過雙機(jī)調(diào)試來調(diào)試我們的程序,使用Windbg進(jìn)行操作:

  1. 首先使用命令!Process遍歷出我們程序的EXE地址。
  2. 使用dt EPROCESS遍歷出的地址,得到這個應(yīng)用程序的EPROCESS結(jié)構(gòu)。
  3. 得到EPROCESS結(jié)構(gòu)中偏移11c(即成員VadRoot)的地址,使用!VAD地址(EPROCESS + 地址)可以得出這個EXE使用的內(nèi)存物理頁。

如果你不會使用也沒關(guān)系,觀看下圖:

Win32之內(nèi)存管理之虛擬內(nèi)存跟物理內(nèi)存

此圖說明了我們的線性地址從10開始到10結(jié)束。因?yàn)槲锢眄撌且?KB存儲的,所以10代表的是1000,后面的大小是1000,因此下一個位置從20開始,即2000線性地址。

三、物理頁大小

物理頁的大小根據(jù)你的物理內(nèi)存大小來設(shè)定。也就是說,你的物理內(nèi)存有多大,就可以換算出物理頁的數(shù)量。我們可以通過任務(wù)管理器查看物理頁的總數(shù)。

例如,如下圖所示:

Win32之內(nèi)存管理之虛擬內(nèi)存跟物理內(nèi)存

我們換算一下,1048048 / 4轉(zhuǎn)換為16進(jìn)制就是可以有多少個物理頁。例如,我們的例子中有3FF7C個物理頁。

我們也可以使用Windbg通過dd命令查看,只需DD這個變量即可。

Win32之內(nèi)存管理之虛擬內(nèi)存跟物理內(nèi)存

如果我們的物理頁超過了,那么操作系統(tǒng)還支持使用硬盤來作為物理內(nèi)存。

具體設(shè)置如下:

計(jì)算機(jī)屬性 -> 高級系統(tǒng)設(shè)置 -> 高級 -> 性能設(shè)置 -> 高級 -> 虛擬內(nèi)存更改。

Win32之內(nèi)存管理之虛擬內(nèi)存跟物理內(nèi)存

這塊內(nèi)存會在windows上保存,文件名為pagefile.sys,通常是c盤的隱藏文件。我們可以通過everything搜索找到它。

Win32之內(nèi)存管理之虛擬內(nèi)存跟物理內(nèi)存

三、操作系統(tǒng)可識別內(nèi)存

我們可用的內(nèi)存是我們計(jì)算出的物理頁大小加上虛擬內(nèi)存的大小。然而,操作系統(tǒng)可識別的內(nèi)存并不是這么大。

也就是說,即使我們增加了很多內(nèi)存條,也不會有任何效果。

32位系統(tǒng)下最多能識別64GB內(nèi)存,而WinXP只能識別4GB內(nèi)存。具體知識需要學(xué)習(xí)Windows內(nèi)核中的頁表(PTE、PDE)、頁目錄表等才能清楚,這里就不多說了,只需了解即可。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享