Windows内存管理学习笔记(三)—— 无处不在的缺页异常
Windows內存管理學習筆記(三)—— 無處不在的缺頁異常
- 缺頁異常
- 實驗一:設置虛擬內存
- 無處不在的缺頁
- 位于頁面文件
- 保留與提交的誤區
- 實驗二:理解缺頁異常
- EXECUTE_WRITECOPY
缺頁異常
描述:
PTE結構(10-10-12分頁):
假設:當我們的物理內存大小只有2MB時,當我們需要用到某個物理頁的時候,將對應物理頁的P位置1,當我們不再需要使用該物理頁時,再將其P位置0,這樣的內存使用效率是非常低的,因此windows不是這樣設計的——只有正在使用的線性地址,才會被掛上物理頁,當物理頁在一段時間內不被使用或不夠用的情況下,操作系統會將當前物理頁中的數據拷貝至硬盤中,然后將當前物理頁供給“別人”使用,當需要再次用到該物理頁的數據時,則將“別人”的數據再拷貝出來,將“自己"的數據從硬盤中拷回,被拷至硬盤中的物理頁數據會被寫入到一個文件中,也就是我們平時常說的虛擬內存
實驗一:設置虛擬內存
1)右鍵”我的電腦“-屬性-高級-”性能“設置-高級
2)將虛擬內存大小設置為780MB
3)查看c:\pagefile.sys文件屬性(需設置文件夾選項-顯示隱藏文件)
當物理頁占用情況較為緊張時,這個文件用于存放物理頁的臨時數據作為備份
無處不在的缺頁
描述:當線性地址對應的物理頁被存儲到文件中時,PTE結構被拓展為以下四種情形
位于頁面文件
描述:
保留與提交的誤區
我們對于VirtualAlloc的傳統概念
LPVOID VirtualAlloc{LPVOID lpAddress,DWORD dwSize,DWORD flAllocationType, // 分配的類型// MEM_RESERVE:只保留線性地址,不分配物理頁// MEM_COMMIT:既保留線性地址,又分配物理頁DWORD flProtect };思考:如果設置flAllocationType成員的值為MEM_COMMIT,當函數執行結束之后,馬上就會為當前線性地址分配物理頁嗎?
答案:不會,只有當線性地址真正被使用時,才會分配物理頁
實驗二:理解缺頁異常
1)編譯并運行以下代碼
#include <stdio.h> #include <windows.h>int main() {LPVOID pAddr = VirtualAlloc(NULL, 0x1000*8, MEM_COMMIT, PAGE_READWRITE);printf("%p\n", pAddr);getchar();*(PDWORD)pAddr = 0x12345678;getchar();return 0; }2)運行結果
3)查看pAddr所在的線性地址是否存在物理頁
kd> !process 0 0
可以看到,此時并未被掛上具體物理頁(PTE為空)
備注:上述步驟也可以使用以下命令進行代替
4)繼續運行程序,再次查看PTE
此時線性地址被掛上物理頁(PTE有值)
5)觀察VadRoot
標紅行的8指的是最多可以為這塊線性地址分配8個物理頁(0-7),但不是每塊線性地址都已被掛上有效的物理頁,只有當對應線性地址塊被使用時,才會真正被掛上物理頁
6)觀察_MMVAD結構體
當訪問一個未被掛上物理頁的線性地址時,會觸發缺頁異常,缺頁異常處理程序會去查找VadRoot,若當前線性地址已被分配,則會將其掛上物理頁,否則會觸發內存訪問錯誤
總結:缺頁異常使得物理頁的使用更加高效
EXECUTE_WRITECOPY
描述:當程序正常加載一個EXE或者DLL時,其VadRoot中的內存屬性為Mapped EXE,權限為EXECUTE_WRITECOPY,當試圖對其某一內容進行修改時,無法對其它進程中的同一個模塊產生影響
原理:
解決方法:可通過編寫驅動程序先將需要修改的線性地址對應的物理頁的PTE的R/W位置為1,再對需要修改的地方進行修改
總結
以上是生活随笔為你收集整理的Windows内存管理学习笔记(三)—— 无处不在的缺页异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows内存管理学习笔记(二)——
- 下一篇: Windows消息机制学习笔记(一)——