1. 程式人生 > >Win32之內存管理之虛擬內存跟物理內存

Win32之內存管理之虛擬內存跟物理內存

inf 讀寫 http 橘黃色 內存管理 使用命令 換算 例如 計算機

                   Win32之內存管理

一丶虛擬內存和物理內存

  我們知道每個應用程序都有自己獨立的4GB空間. 假設A進程的 地址123 存儲了10 那麽B進程的123地址 存儲了20

那麽它們兩個是互不影響的. 但是值是真實存在的. 而值是存儲在物理內存的.如下圖所示.

技術分享圖片

根據上圖所示. 我們可以分清虛擬內存跟物理內存. 如果我們更改了物理內存的值.那麽就會影響A進程或者B進程.

當然如果你學過內核驅動.就知道內核驅動讀寫就是你這個意思.我也有寫過一個簡單的內核驅動讀寫.詳情請看內核驅動目錄.

所以說虛擬內存是假的.當用的時候才會存儲在物理內存

二丶物理內存的管理.

  物理內存是使用4K的方式來管理的.也就是4096個字節.也成為一頁.所以以後我們使用API的時候. 大多數都會發現跟頁相關.這也是因為管理是頁方式管理的原因.

如下圖所示

  技術分享圖片

進程A 的數值放到物理頁中.

而我們進程傳統意義上說是由4GB 其實分為高低2G. 高兩G是給內核使用的.所以用戶只能使用低2G. 而低兩G也有高低64k不能使用的. (學過內核想使用自己構造即可)

如下圖所示:

技術分享圖片

用戶模式可以使用的內存就是橘黃色的位置.但是沒有對應的物理頁.當我們申請了內存才會有對應的物理頁

如果想看三環程序使用的物理頁.可以通過雙機調試. 調試我們的程序. 使用Windbg.

1.首先使用命令 !Process 遍歷出我們程序Exe的地址.

2.使用 dt EPROCESS 遍歷出的地址 得到這個應用程序的EPROCESS結構.

3. 得到EPROCESS + 11c (也就是成員)VadRoot的偏移. 使用!VAD 地址. (EPROCESS + 地址) 可以得出這個EXE使用的內存物理頁.

如果不會使用也無所謂. 觀看下圖:

技術分享圖片

這個圖說明了 我們的線性地址10開始 - 10結束. 因為物理頁是4K 存儲的.所以10 代表的就是1000 後面大小是1000 所以下一個位置是20開始也就是 2000線性地址.

三丶物理頁大小.  

  物理頁大小根據你的物理內存.大小來設置的.也就是說你的物理內存多大就可以換算出來.我們可以通過任務管理器查看你的物理頁總數.

例如下圖:

  技術分享圖片

我們換算一下. 1048048 / 4 轉換為16進制 則是可以有多少個物理頁. 例如我們例子則是 3FF7C 個物理頁.

我們也可以使用Windbg dd一下查看. 只需要DD這個變量即可.

技術分享圖片

如果我們的物理頁超過了.那麽操作系統還支持使用硬盤來當物理內存.

具體設置

計算機屬性 -> 高級系統設置 -> 高級 - > 性能設置 -> 高級 -> 虛擬內存更改.

技術分享圖片

而這快內存會在windows上保存著. 文件名是 pagefile.sys 一般是C盤的隱藏文件.我們可以通過

EveryThing搜索一下. 技術分享圖片

三丶操作系統可識別內存

  我們可用的內存就是 我們算出的物理頁的大小 + 虛擬內存的大小.但是操作系統可識別的不是這麽大的.

也就是說我們物理內存條加了好多好多.那是一點用沒有.

  32位系統下能識別64G內存. winxp只能識別4G內存. 具體知識需要學習Windows內核中的頁表 (PTE PDE) 頁目錄表 等才能清楚. 不多說.只需要了解即可.

Win32之內存管理之虛擬內存跟物理內存