windows虛擬記憶體機制

来源:http://www.cnblogs.com/kekec/archive/2017/09/03/7350993.html
-Advertisement-
Play Games

在windows系統中個,每個進程擁有自己獨立的虛擬地址空間(Virtual Address Space)。這一地址空間的大小與電腦硬體、操作系統以及應用程式都有關係。 對於32位程式來說,最多能使用2GB空間(0x00010000-0x7FFEFFFF)。為了獲得3GB的地址空間,在不同的win ...


在windows系統中個,每個進程擁有自己獨立的虛擬地址空間(Virtual Address Space)。這一地址空間的大小與電腦硬體、操作系統以及應用程式都有關係。

對於32位程式來說,最多能使用2GB空間(0x00010000-0x7FFEFFFF)。為了獲得3GB的地址空間,在不同的windows系統中可以按照如下方法來進行擴充。

1.操作系統方面

① 32位windowsXP

② 32位win7 -- 管理員許可權執行命令:bcdedit /set increaseuserva 3072來開啟

③ 64位win7 -- 對32位程式預設開啟3GB,無需額外設置

2.應用程式方面

無論是32位還是64位windows若要讓32位程式能使用3GB記憶體,必須在鏈接時加上參數: /LARGEADDRESSAWARE

 

進程地址空間區段

註:進程地址空間在低地址,操作系統內核在高地址

 

進程地址空間分佈(以2GB為例)

Windows系統在進程空間中專門划出一塊0x70000000 - 0x80000000(共256MB)區域,用於映射這些常用的系統DLL(如kernel32.dll、ntdll.dll等)

對系統DLL的預設基地址進行調整,防止載入時衝突,觸發ReBasing(重定基地址)

註:基地址必須對齊到分配粒度(64KB)

 

Win7下,exe在PE文件中基地址為0x400000,DllPrj.dll的基地址為0x10000000且該地址未被其他dll占用;但實際exe被映射到0xEC0000,DllPrj.dll被映射到0x535A0000

生成exe和dll模塊時,鏈接時使用了參數/DYNAMICBASE(啟用動態基地址)

註:地址空間佈局隨機化, Address space layout randomization (ASLR):防範惡意程式對已知地址進行攻擊

 

windows記憶體分配過程可細化為以下3個要點:

① 保留一段虛擬記憶體地址空間:從進程的4GB中保留一段地址空間。// 帶MEM_RESERVE參數的VirtualAlloc函數

    起始地址必須是系統分配粒度的整數倍(64KB),大小必須是系統頁面大小的整數倍(4KB)。

② 提交一段虛擬記憶體地址空間:將進程已保留的一段地址空間映射機器的虛擬記憶體上。// 帶MEM_COMMIT參數的VirtualAlloc函數

    起始地址和大小都必須是頁面大小的整數倍(4KB)。

③ 將虛擬記憶體地址空間映射到物理記憶體頁(RAM):在訪問進程提交的頁面被訪問時,通過缺頁中斷(又名頁缺失、頁面錯誤, PageFault)機制來真正分配物理記憶體頁,同時修改對應頁面的地址空間映射關係。

註1:在程式中所訪問的地址都必須是保留並提交的虛擬記憶體地址

註2:可以使用VirtualFree來釋放保留或提交的虛擬記憶體地址空間

 

記憶體指標概念

虛擬記憶體:

Private Bytes  // 進程Committed的虛擬記憶體位元組數    對應win7任務管理器中的【提交大小】,資源管理器中的【提交】

Peak Private Bytes  // 進程Committed的虛擬記憶體的最高峰位元組數

Virtual Size // 進程Reserved的虛擬地址空間位元組數

Page Faults  // 發生過的缺頁中斷次數    對應win7任務管理器中的【頁面錯誤】

物理記憶體:

Working Set = WS Private + WS Shareable  // 進程占用物理記憶體總位元組數  對應win7任務管理器中的【工作設置(記憶體)】,資源管理器中的【工作集】

     WS Private // 進程獨享的物理記憶體位元組數(如:堆記憶體+棧記憶體+cow機制創建的記憶體)   對應win7任務管理器中的【記憶體(專用工作集)】,資源管理器中的【專用】

     WS Shareable  // 進程可與其他進程共用的物理記憶體位元組數(如:exe及dll代碼段、數據段等)  對應win7資源管理器中的【可共用】

     WS Shared  // 進程已與其他進程共用的物理記憶體位元組數,WS Shared<=WS Shareable

                         // 若只啟動一個exe實例,那麼exe的代碼段、數據段等不會被共用,因而就不統計在WS Shared中

Peak Working Set // 物理記憶體的最高峰位元組數  對應win7任務管理器中的【峰值工作設置(記憶體)】

註:無論是虛擬記憶體還是物理記憶體下的各個指標,都是通過統計用戶態的那部分占用

 

頁交換文件

頁交換文件(Page File):一般被用作可寫物理記憶體頁的後備存儲器。Windows下該文件名為pagefile.sys,位於各盤的根目錄中。

                                      可以根據機器的軟硬體狀況來設置頁交換文件的大小,甚至關閉頁交換文件的使用。

 

頁出(Page Out):當物理記憶體不夠時,系統會將一些不經常使用且有後備的物理記憶體頁釋放,並將虛擬地址映射關係指向後備。

①以頁交換文件(如:堆、棧等)為後備:在頁交換文件中分配空間,並拷貝內容到其中後再釋放

②以記憶體映射文件(如:exe、dll等)為後備:直接釋放

頁入(Page In):當系統讀取某個虛擬記憶體地址,而該地址所在的頁不在物理記憶體頁中時,將產生一個缺頁中斷,

告訴系統從頁交換文件或者記憶體映射文件中取回包含該地址的虛擬記憶體頁(即:將內容拷回到物理記憶體頁,並建立新的虛擬地址映射到物理記憶體頁上,然後釋放頁交換文件中對應部分的空間) 。

 

寫時複製機制

寫時複製機制(copy on write, COW):當WRITECOPY屬性記憶體頁面被修改時,會觸發記憶體頁拷貝,以此來節省物理記憶體和頁交換文件的占用。

註:系統在映射exe或dll文件時會把數據頁指定為PAGE_WRITECOPY屬性,代碼頁指定為PAGE_EXECUTE_WRITECOPY屬性

具體過程:

① 當進程對記憶體頁執行修改操作時,系統會找一個閑置的物理記憶體頁,並拷貝所有內容到新頁上,然後標記新頁的後備存儲器為頁交換文件,最後將進程的虛擬記憶體頁指向新的物理記憶體頁。

② 經過上述步驟,進程就可以使用自己副本了,修改在新的物理頁上進行,而不對原來的記憶體頁產生任何影響。

 

重定基地址

重定基地址(Rebasing):模塊裝載時,如果目標地址被占用或基於安全考慮,系統會根據模塊的所需地址空間的大小為其分配一個新的基地址,並將模塊裝載到該基地址處。

問題:

①  一旦發生了Rebasing,當模塊映射時,要對重定位表中所有頁進行地址修正。

② 系統修正這些地址的頁面時,會觸發寫時複製機制。

 

地址空間佈局隨機化(Address space layout randomization,ASLR)

微軟在Vista系統中引入了名為ASLR的技術,模塊每次會被載入到隨機位置(偽隨機),防範惡意程式對已知地址進行攻擊。

ASLR不僅對模塊地址做了隨機處理,還對堆、棧、進程環境塊(Process Environment Block, PEB)、線程環境塊(Thread Environment Block, TEB)的地址也進行了隨機化。

ASLR技術將Rebasing放到內核中進行處理,意味著可以在系統範圍上(原來只能在進程範圍內),最大程度上減少Rebasing的發生,從而節省物理記憶體和頁交換文件的使用。

 

PE文件裝載

 

註:映射必須以頁面(4KB)為單位,並按照頁邊界進行對齊

執行完映射後,絕大部分指令和數據都還沒有被裝入物理記憶體中。裝載過程是隨著程式的執行動態進行的。

具體過程:cpu在訪問指令和數據時,發現該地址所在的頁不在物理記憶體頁中時,會觸發缺頁中斷,此時系統會找一個閑置的物理記憶體頁,並將內容從後備中(映像文件或頁交換文件中)載入到該物理記憶體頁中。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 卸載mysql流程:1、查找以前是否裝有mysql。命令: 可以看到mysql的包:2、刪除mysql。刪除命令: 3、刪除老版本mysql的開發頭文件和庫。命令: 註意:卸載後/var/lib/mysql中的數據及/etc/my.cnf不會刪除,如果確定沒用後就手工刪除 ...
  • 環境:ubuntu16.04 交叉編譯器版本號:4.8.3 在編譯之前要編譯以下其依賴的軟體或庫:freetype,libpng,libxml2,libtiff,libjpeg,zlib,graphviz zlib庫 1.tar xvf zlib-1.2.11.tar.xz 2.export CC= ...
  • 用途說明 在執行Linux命令時,我們可以把輸出重定向到文件中,比如 ls >a.txt,這時我們就不能看到輸出了,如果我們既想把輸出保存到文件中,又想在屏幕上看到輸出內容,就可以使用tee命令了。tee命令讀取標準輸入,把這些內容同時輸出到標準輸出和(多個)文件中。要註意的是:在使用管道線時,前一 ...
  • 本文就linux中的壓縮工具gzip、bzip2和xz以及打包工具tar做出介紹,基本上能夠滿足工作中的需求和日常的使用。 ...
  • 當在Windows刪除文件時出現找不到該項目或者顯示該文件不在磁碟中,可以嘗試以下方法: 在要刪除文件的同級目錄下 新建一文本文檔,將下列代碼複製到文檔中,將文檔保存為尾碼名為.bat的文檔(名字隨意), DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 把你想刪除的文件或文件 ...
  • Linux系統擴容方法彙總 相信很多朋友都有過這樣的經歷,本想裝個Ubantu玩玩,沒想到玩久了反而不習慣Windows了,然而開始裝系統的時候只分配了非常小的空間,那應該怎樣擴展我們的ubantu呢?下麵我為大家總結幾種方法(僅在ubantu下測試過) 一、通過系統整體遷移 首先:進入Window ...
  • Cobbler(補鞋匠)是通過將DHCP、TFTP、DNS、HTTP等服務進行集成,創建一個中央管理節點,其可以實現的功能有配置服務,創建存儲庫,解壓縮操作系統媒介,代理或集成一個配置管理系統,控制電源管理等。 Cobbler的最終目的是實現無需進行人工干預即可安裝機器。 pxe概述 預啟動執行環境 ...
  • boot分區是系統啟動中最重要的部分,如果伺服器由於病毒攻擊又或者被管理員誤刪除了boot分區。那麼就會存在潛在的風險。為什麼說是潛在的風險?因為boot分區被刪除後系統仍在繼續運行,看似無狀況但是在執行關機操作後就會無法啟動。 大致步驟 恢復過程 1.首先查看系統的磁碟情況,根目錄在邏輯捲,boo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...