第2526講windows虛擬內(nèi)存技術(shù)基礎_第1頁
第2526講windows虛擬內(nèi)存技術(shù)基礎_第2頁
第2526講windows虛擬內(nèi)存技術(shù)基礎_第3頁
第2526講windows虛擬內(nèi)存技術(shù)基礎_第4頁
第2526講windows虛擬內(nèi)存技術(shù)基礎_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

中科研CASoft軟件工程師培訓講義GameMaster游戲修改工具第25~26講Windows虛擬內(nèi)存技術(shù)基礎中科天地軟件人才培訓中心Createdby本講重點提要目錄¤

概述¤

系統(tǒng)信息¤

虛擬內(nèi)存狀態(tài)¤

確定地址空間的狀態(tài)概述¤

系統(tǒng)如何管理虛擬內(nèi)存,每個進程如何獲得它自己的私有地址空間,進程的地址空間是個什么樣子等內(nèi)容。Windows提供了一些API函數(shù),這些函數(shù)能夠提供關(guān)于系統(tǒng)內(nèi)存管理以及進程中的虛擬地址空間等信息。系統(tǒng)信息¤

許多操作系統(tǒng)的值是根據(jù)主機而定的,比如頁面的大小,分配粒度的大小等。這些值決不應該用硬編碼的形式放入你的源代碼。相反,你始終都應該在進程初始化的時候檢索這些值,并在你的源代碼中使用檢索到的值?!鐶etSystemInfo函數(shù)將用于檢索與主機相關(guān)的值,函數(shù)的參數(shù)必須傳遞SYSTEM_INFO結(jié)構(gòu)的地址給這個函數(shù)。這個函數(shù)將初始化所有的結(jié)構(gòu)成員然后回。VOIDGetSystemInfo(LPSYSTEM_INFOlpSystemInfo//systeminformation);系統(tǒng)信息¤

SYSTEM_INFO結(jié)構(gòu)如下圖所示:系統(tǒng)信息¤

當系統(tǒng)引導時,它要確定這些成員的值是什么。對于任何既定的系統(tǒng)來說,這些值總是相同的,因此決不需要為任何既定的進程多次調(diào)用該函數(shù)。由于有了

GetSystemInfo函數(shù),因此應用程序能夠在運行的時候查詢這些值?!?/p>

在該結(jié)構(gòu)的所有成員中,只有4個成員與

內(nèi)存有關(guān)。下表顯示了這4個成員的含義。系統(tǒng)信息系統(tǒng)信息¤

結(jié)構(gòu)的其它成員含義如下表所示:系統(tǒng)信息¤

實例編寫:SysInfo.exeSysInfo.exe是一個非常簡單的應用程序,它調(diào)用

GetSystemInfo函數(shù),顯示返回在SYSTEM_INFO結(jié)構(gòu)中的信息。運行情況如下圖所示:虛擬內(nèi)存狀態(tài)¤Windows函數(shù)GlobalMemoryStatus可用于檢索關(guān)于當前內(nèi)存狀態(tài)的動態(tài)信息,當調(diào)用這個函數(shù)時,必須傳遞一個MEMORYSTATUS結(jié)構(gòu)的地址?!?/p>

MEMORYSTATUS結(jié)構(gòu)如下圖所示:虛擬內(nèi)存狀態(tài)¤

在調(diào)用GlobalMemoryStatus之前,必須將

dwLength成員初始化為用字節(jié)表示的結(jié)構(gòu)的

大小,即一個MEMORYSTATUS結(jié)構(gòu)的大小。這個初始化操作使得Microsoft能夠?qū)⒊蓡T添加給將來的Windows版本中的這個結(jié)構(gòu),而不會破壞現(xiàn)有的應用程序。當調(diào)用

GlobalMemoryStatus時,它將對該結(jié)構(gòu)的其余成員進行初始化并返回。下一節(jié)中的VMStat

示例應用程序?qū)⒁枋龈鱾€成員及其含義。虛擬內(nèi)存狀態(tài)¤

如果希望應用程序在內(nèi)存大于4GB的計算機上運行,或者合計交換文件的大小大于4GB,那么可以使用新的GlobalMemoryStatusEx函數(shù):¤

必須給該函數(shù)傳遞新的MEMORYSTATUSEX結(jié)構(gòu)的地址:虛擬內(nèi)存狀態(tài)¤

這個結(jié)構(gòu)與原先的MEMORYSTATUS結(jié)構(gòu)基本相同,差別在于新結(jié)構(gòu)的所有成員的大小都是64位寬,因此它的值可以大于4GB。最后一個成員是

ullAvailExtendedVirtual,用于指明在調(diào)用進程的虛擬地址空間的極大內(nèi)存(VLM)部分中未保留內(nèi)存的大小。該VLM部分只適用于某些配置中的某些

CPU結(jié)構(gòu)。虛擬內(nèi)存狀態(tài)¤

虛擬內(nèi)存狀態(tài)示例應用程序VMStat應用程序顯示了一個簡單的對話框,用于列出調(diào)用GlobalMemoryStatus函數(shù)的結(jié)果。對話框中的信息每秒鐘更新一次,因此,你可以在對系統(tǒng)中的其他進程進行操作時,使應用程序繼續(xù)運行。虛擬內(nèi)存狀態(tài)¤dwMemoryLoad成員(圖中顯示為MemoryLoad)給出了內(nèi)存管理系統(tǒng)的大致繁忙程度。該數(shù)字的范圍是0至100。計算這個值時使用的具體算法在Windows98與Windows2000上是不同的。根據(jù)將來的操作系統(tǒng)版本的情況,該算法還會有所變化。實際上,該成員變量報告的值是沒有什么用處的?!?/p>

dwTotalPhys成員(圖中顯示為TotalPhys)用于指明存在的物理存儲器(EAM)的總字節(jié)數(shù)。在128MB的PentiumII計算機上,這個值是133677056,它只比

128MB少540672個字節(jié)。GlobalMemoryStatus之所以不報告全部的128MB,原因是在引導進程中,系統(tǒng)將一些內(nèi)存保留為非頁面內(nèi)存池。這些內(nèi)存甚至不能被內(nèi)核使用。虛擬內(nèi)存狀態(tài)¤dwAvailPhys成員(圖中顯示為AvailPyhs)用于指明可供分配的物理存儲器的總字節(jié)數(shù)。¤dwTotalPageFile成員(圖中顯示為TotalPageFile)用于指明你的硬盤上的頁文件中包含的最大字節(jié)數(shù)。雖然VMStat報告的頁文件當前是318574592字節(jié),但是系統(tǒng)可以根據(jù)需要對頁交換文件進行擴大和壓縮?!?/p>

dwAvailPageFile成員(圖中顯示為AvailPageFile)用于指明頁文件中有233046016字節(jié)尚未提交給任何進程,因此,如果一個進程決定提交任何私有內(nèi)存的話,目

前就可以使用這些字節(jié)。虛擬內(nèi)存狀態(tài)¤

dwTotalVirtual成員(圖中顯示為TotalVitual)用于指明每個進程的地址空間中私有的總字節(jié)數(shù)。它的值是2147352576,比準確的2GB少128KB。從0x00000000至0x0000FFFF以及從0x7FFF0000至0x7FFFFFFF的兩個分區(qū)是不能訪問的地址空間,這正好等于128KB這個差額。如果在Windows98下運行VMStat,你將看到dwTotalVirtual返回的值是2143289344,這比準確的2GB只少4MB。之所以差4MB,原因是系統(tǒng)決不允許應用程序訪問從0x00000000至0x003FFFFF之間的這個4MB分區(qū)。虛擬內(nèi)存狀態(tài)¤

最后一個成員dwAvailVirtual(圖中顯示為

AvailVirtual)是該結(jié)構(gòu)中專門用于調(diào)用

GlobalMemoryStatus的進程的唯一成員,所有其他成員在系統(tǒng)中的使用情況都是一樣的,而不管是哪個進程調(diào)用GlobalMemoryStatus。若要計算這個值,

GlobalMemoryStatus將調(diào)用進程的地址空間中的所有空閑區(qū)域相加。dwAvailVirtual的值2136846336表示可供VMStat隨意使用的空閑地址空間的數(shù)量。如果將

dwTotalVirtual的值減去dwAvailVirtual的值,你會看到VMStat在它的虛擬地址空間中保留了10506240個字節(jié)。¤沒有一個成員能夠指明進程當前使用的物理存儲器的數(shù)量。確定地址空間的狀態(tài)¤Windows提供了一個函數(shù),可以用來查詢地址空間中內(nèi)存地址的某些信息(如大小,存儲器類型和保護屬性等)。這個函數(shù)稱為VirtualQuery,Windows還提供了另一個函數(shù),它使一個進程能夠查詢另一個進程的內(nèi)存信息?!?/p>

這兩個函數(shù)基本相同,差別在于使用VirtualQueryEx

時,可以傳遞想要查詢的地址空間信息的進程的句柄。調(diào)試程序和其他實用程序使用這個函數(shù)最多,幾乎所有的應用程序都只需要調(diào)用VirtualQuery函數(shù)。當調(diào)用VirtualQuery(Ex)函數(shù)時,pvAddress參數(shù)必須包含你想要查詢其信息的虛擬內(nèi)存地址。Pmbi參數(shù)是必須分配的MEMORY_BASIC_INFORMATION結(jié)構(gòu)的地址。確定地址空間的狀態(tài)¤

VMQuery函數(shù)雖然VirtualQuery和MEMORY_BASIC_INFORMATION結(jié)構(gòu)使你能夠深入了解許多關(guān)于內(nèi)存的情況,但是現(xiàn)在它們無法為你提供使你真正了解全部情況的足夠信息。問題是

MEMORY_BASIC_INFORMATION結(jié)構(gòu)無法返回系統(tǒng)已經(jīng)存放在內(nèi)部的所有信息。確定地址空間的狀態(tài)¤

如果你有一個內(nèi)存地址,想獲得關(guān)于該地址的某些簡單的信息,那么使用VirtualQuery函數(shù)的效果是相當不錯的。如果只是想知道是否給一個地址提交了物理存儲器,或者是否可以向一個內(nèi)存地址讀取或?qū)懭胄畔?,那?/p>

VirtualQuery函數(shù)的作用也很好。但是,如果想知道已保留的地址空間區(qū)域的合計大小,或者想要知道一個區(qū)域中的地址空間塊的數(shù)量,或者想知道一個區(qū)域是否包含線程堆棧,那么僅僅一次調(diào)用VirtualQuery將無法為你提供你想知道的信息。確定地址空間的狀態(tài)¤為了獲得完整的內(nèi)存信息,我們創(chuàng)建一個新的函數(shù),即VMQuery:BOOL

VMQuery

(HANDLE

hProcess,PVOID

pvAddress,PVMQUERY

pVMQ

);¤該函數(shù)與VirtualQueryEx有些類似,它擁有一個進程句柄(在hProcess中),一個內(nèi)存地址(在pvAddress中)和一個指向?qū)⒈惶畛涞慕Y(jié)構(gòu)的指針(由pVMQ設定)。該結(jié)構(gòu)是個VMQUERY結(jié)構(gòu),下面是結(jié)構(gòu)的定義:確定地址空間的狀態(tài)確定地址空間的狀態(tài)¤

只要簡單地看一眼就會發(fā)現(xiàn),

VMQUERY結(jié)構(gòu)比Windows的MEMORY_BASIC_INFORMATION結(jié)構(gòu)包含了多得多的信息。這個結(jié)構(gòu)分成

兩個不同的部分:一個是區(qū)域信息,另

一個是塊信息。區(qū)域信息部分用于描述

關(guān)于區(qū)域的信息,塊信息部分用于描述

關(guān)于包含用pvAddress參數(shù)設定的地址塊的信息。下表對所有的成員進行了說明。確定地址空間的狀態(tài)確定地址空間的狀態(tài)¤

毫無疑問,VMQuery函數(shù)必須執(zhí)行相當數(shù)量的處理操作,包括多次調(diào)用VirtualQueryEx,以便獲取所有的信息,這意味著它的運行速度要大大低于VirtualQueryEx函數(shù)。由于這個原因,在決定調(diào)用這兩個函數(shù)中的哪一個時,應該三思而后行。如果不需要通過

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論