日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows内存管理学习笔记(三)—— 无处不在的缺页异常

發(fā)布時間:2025/3/21 windows 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows内存管理学习笔记(三)—— 无处不在的缺页异常 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Windows內(nèi)存管理學習筆記(三)—— 無處不在的缺頁異常

    • 缺頁異常
      • 實驗一:設置虛擬內(nèi)存
    • 無處不在的缺頁
      • 位于頁面文件
      • 保留與提交的誤區(qū)
      • 實驗二:理解缺頁異常
      • EXECUTE_WRITECOPY

缺頁異常

描述

  • 例:當CPU訪問一個地址,其PTE的P位(頁面有效位)為0,此時會產(chǎn)生缺頁異常
  • 在windows中,缺頁異常是時刻在發(fā)生的
  • PTE結構(10-10-12分頁)

    假設:當我們的物理內(nèi)存大小只有2MB時,當我們需要用到某個物理頁的時候,將對應物理頁的P位置1,當我們不再需要使用該物理頁時,再將其P位置0,這樣的內(nèi)存使用效率是非常低的,因此windows不是這樣設計的——只有正在使用的線性地址,才會被掛上物理頁,當物理頁在一段時間內(nèi)不被使用或不夠用的情況下,操作系統(tǒng)會將當前物理頁中的數(shù)據(jù)拷貝至硬盤中,然后將當前物理頁供給“別人”使用,當需要再次用到該物理頁的數(shù)據(jù)時,則將“別人”的數(shù)據(jù)再拷貝出來,將“自己"的數(shù)據(jù)從硬盤中拷回,被拷至硬盤中的物理頁數(shù)據(jù)會被寫入到一個文件中,也就是我們平時常說的虛擬內(nèi)存

    實驗一:設置虛擬內(nèi)存

    1)右鍵”我的電腦“-屬性-高級-”性能“設置-高級
    2)將虛擬內(nèi)存大小設置為780MB

    3)查看c:\pagefile.sys文件屬性(需設置文件夾選項-顯示隱藏文件)

    當物理頁占用情況較為緊張時,這個文件用于存放物理頁的臨時數(shù)據(jù)作為備份

    無處不在的缺頁

    描述:當線性地址對應的物理頁被存儲到文件中時,PTE結構被拓展為以下四種情形

    位于頁面文件

    描述

  • 當物理頁被放入頁面文件時,PTE結構如圖a所示
  • 當該進程再次讀取該物理頁對應的線性地址時,由于P位為0,因此會觸發(fā)缺頁異常處理程序
  • windows xp中,缺頁異常處理程序位于IDT[0xE]
  • 此時,缺頁異常處理程序會再次查詢當前PTE的屬性,若1-4位,5-9位,12-31位都有值,說明當前PTE是有效的,但是物理頁被存放到了頁面文件中
  • 然后,缺頁異常處理程序根據(jù)PTE中得到的值去查詢pagefile.sys,將原來的物理頁的內(nèi)容掛入新的物理頁,然后將P位置1,再將新的物理頁的物理地址掛入PTE的第12-31位
  • 在用戶看來,兩次讀取同一個線性地址,中間這一系列復雜過程是透明的,而只能觀察到兩次都成功讀取了同一個值
  • 保留與提交的誤區(qū)

    我們對于VirtualAlloc的傳統(tǒng)概念

    LPVOID VirtualAlloc{LPVOID lpAddress,DWORD dwSize,DWORD flAllocationType, // 分配的類型// MEM_RESERVE:只保留線性地址,不分配物理頁// MEM_COMMIT:既保留線性地址,又分配物理頁DWORD flProtect };

    思考:如果設置flAllocationType成員的值為MEM_COMMIT,當函數(shù)執(zhí)行結束之后,馬上就會為當前線性地址分配物理頁嗎?
    答案:不會,只有當線性地址真正被使用時,才會分配物理頁

    實驗二:理解缺頁異常

    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)繼續(xù)運行程序,再次查看PTE


    此時線性地址被掛上物理頁(PTE有值)

    5)觀察VadRoot

    標紅行的8指的是最多可以為這塊線性地址分配8個物理頁(0-7),但不是每塊線性地址都已被掛上有效的物理頁,只有當對應線性地址塊被使用時,才會真正被掛上物理頁

    6)觀察_MMVAD結構體

    當訪問一個未被掛上物理頁的線性地址時,會觸發(fā)缺頁異常,缺頁異常處理程序會去查找VadRoot,若當前線性地址已被分配,則會將其掛上物理頁,否則會觸發(fā)內(nèi)存訪問錯誤

    總結:缺頁異常使得物理頁的使用更加高效

    EXECUTE_WRITECOPY

    描述:當程序正常加載一個EXE或者DLL時,其VadRoot中的內(nèi)存屬性為Mapped EXE,權限為EXECUTE_WRITECOPY,當試圖對其某一內(nèi)容進行修改時,無法對其它進程中的同一個模塊產(chǎn)生影響

    原理

  • 當試圖對其某一內(nèi)容進行修改時,系統(tǒng)會檢查其線性地址對應的物理頁的PTE屬性,若R/W屬性為0時,觸發(fā)缺頁異常
  • 缺頁異常處理程序檢查VadRoot中對應線性地址所在空間的MMVAD_FLAGS中的Protection成員,若值位0x111時,表示權限為EXECUTE_WRITECOPY
  • 此時,缺頁異常處理程序將當前線性地址對應的物理頁內(nèi)容進行拷貝,將其寫入一個新的物理頁,然后將當前進程需要修改的線性地址掛入新的物理頁上,然后對需要修改的內(nèi)容進行寫入
  • 解決方法:可通過編寫驅動程序先將需要修改的線性地址對應的物理頁的PTER/W位置為1,再對需要修改的地方進行修改

    總結

    以上是生活随笔為你收集整理的Windows内存管理学习笔记(三)—— 无处不在的缺页异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。