




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精品文檔精品文檔實驗九 存儲管理1Windows Xp 內存結構背景知識Windows Xp 是 32 位的操作系統,它使計算機 CPU 可以用 32 位地址對 32 位內存塊進 行操作。內存中的每一個字節都可以用一個 32 位的指針來尋址。這樣,最大的存儲空間就 是 232 字節或 4000 兆字節 (4GB) 。這樣,在 Windows 下運行的每一個應用程序都認為能 獨占可能的 4GB 大小的空間而另一方面,實際上沒有幾臺機器的 RAM 能達到 4GB ,更不必說讓每個進程都獨享 4GB 內存了。 Windows 在幕后將虛擬內存 (virtual memory , VM) 地址映射到了
2、各進程的物 理內存地址上。而所謂物理內存是指計算機的 RAM 和由 Windows 分配到用戶驅動器根目 錄上的換頁文件。物理內存完全由系統管理。實驗目的1)通過實驗了解 windowsXp 內存的使用,學習如何在應用程序中管理內存、體會 Windows 應用程序內存的簡單性和自我防護能力。2)了解 windowsXp 的內存結構和虛擬內存的管理,進而了解進程堆和windows 為使用內存而提供的一些擴展功能。工具 /準備工作您需要做以下準備:一臺運行 Windows Xp Professional 操作系統的計算機 計算機中需安裝 Visual C+ 6.0 專業版或企業版實驗內容與步驟Wi
3、ndows 提供了一個 API 即 GetSystemInfo() ,以便用戶能檢查系統中虛擬內存的一些 特性。程序 5-1 顯示了如何調用該函數以及顯示系統中當前內存的參數。步驟 1:登錄進入 Windows Xp Professional 。步驟 2:在開始”菜單中單擊程序” -“Microsoft Visual Studio 6.0 ” Microsoft Visual C+ 6.0”命令,進入 Visual C+ 窗口。步驟 3:在工具欄單擊 “打開” 按鈕,在“打開” 對話框中找到并打開實驗源程序 5-1.cpp。 程序 5-1 :獲取有關系統的內存設置的信息/ 工程 vmeminf
4、o#include #include #include #include #pragma comment(lib, shlwapi.lib)void main()/ 首先,讓我們獲得系統信息 SYSTEM_INFO si;: ZeroMemory(&si, sizeof(si) ) ;: GetSystemInfo(&si) ;/使用外殼輔助程序對一些尺寸進行格式化TCHAR szPageSizeMAX_PATH;:StrFormatByteSize(si.dwPageSize, szPageSize, MAX_PATH);精品文檔精品文檔DWORD dwMemSize = (DWORD)si
5、.lpMaximumApplicatio nAddress - (DWORD) si.lpMi nimumApplicatio nAddress;TCHAR szMemSize MAX_PATH;:StrFormatByteSize(dwMemSize, szMemSize, MAX_PATH);/將內存信息顯示出來std : cout Virtual memory page size: szPageSize std : en dl;std : cout.fill (0);std : cout Minimum applicatio n address: 0 x std : hex std :
6、setw(8) (DWORD) si.lpMi nimumApplicatio nAddress std : en dl;std : cout Maximum applicati on address: 0 x std : hex std : setw(8) (DWORD) si.lpMaximumApplicatio nAddress std : en dl;std : cout Total available virtual memory: szMemSize std : endl ;步驟4:單擊Build ”菜單中的Compile 5-1.cpp ”命令,并單擊是”按鈕確認。系 統對5-
7、1.cpp進行編譯。步驟5:編譯完成后,單擊“ Build ”菜單中的“ Build 5-1.exe ”命令,建立5-1.exe可執 行文件。操作能否正常進行?如果不行,則可能的原因是什么?_不可以運行,#pragmacomment(lib,shlwapi.lib)指令錯誤,在 pragma與 comment 中間 應該有空格 _步驟6:在工具欄單擊Execute Program”(執行程序)按鈕,執行5-1.exe程序。運行結果(分行書寫。如果運行不成功,則可能的原因是什么?):1)虛擬內存每頁容量為:4.00KB2)最小應用地址:0*000100003)最大應用地址:0*7ffeffff4
8、)當前可供應用程序使用的內存空間為:2.00GB5)當前計算機的實際內存大小為:1.99GB1)虛擬內存每頁容量為: _2)最小應用地址: _3)最大應用地址為:4)當前可供應用程序使用的內存空間為: _5)當前計算機的實際內存大小為: _閱讀和分析程序5-1,請回答問題:1) _理論上每個 windows應用程序可以獨占的最大存儲空間是: _4GB_2)在程序5-1中,用于檢索系統中虛擬內存特性的API函數是:DWORD _提示:可供應用程序使用的內存空間實際上已經減去了開頭與結尾兩個64KB的保護區。虛擬內存空間中的64KB保護區是防止編程錯誤的一種Windows 方式。任何對內存中這一區
9、 域的訪問(讀、寫、執行)都將引發一個錯誤陷井,從而導致錯誤并終止程序的執行。也就精品文檔精品文檔是說,假如用戶有一個NULL指針(地址為0),但仍試圖在此之前很近的地址處使用另個指針,這將因為試圖從更低的保留區域讀寫數據,從而產生意外錯誤并終止程序的執行。2Windows Xp虛擬內存背景知識在Windows Xp環境下,4GB的虛擬地址空間被劃分成兩個部分:低端2GB提供給進程使用,高端2GB提供給系統使用。這意味著用戶的應用程序代碼,包括DLL以及進程使用的各種數據等,都裝在用戶進程地址空間內(低端2GB)。用戶過程的虛擬地址空間也被分成三部分:1) 虛擬內存的已調配區(committe
10、d):具有備用的物理內存,根據該區域設定的訪問 權限,用戶可以進行寫、讀或在其中執行程序等操作。2) 虛擬內存的保留區 (reserved):沒有備用的物理內存,但有一定的訪問權限。3) 虛擬內存的自由區 (free):不限定其用途,有相應的PAGE_NOACCESS權限。與虛擬內存區相關的訪問權限告知系統進程可在內存中進行何種類型的操作。例如,用 戶不能在只有 PAGE_READONL Y權限的區域上進行寫操作或執行程序;也不能在只有 PAGE_EXECUTE權限的區域里進行讀、寫操作。而具有PAGE_ NOACCESS權限的特殊區域,則意味著不允許進程對其地址進行任何操作。在進程裝入之前,
11、整個虛擬內存的地址空間都被設置為只有PAGE_NOACCESS權限的自由區域。當系統裝入進程代碼和數據后,才將內存地址的空間標記為已調配區或保留區, 并將諸如 EXECUTE、READWRITE 和READONLY 的權限與這些區域相關聯。如表3-2所示,給出了 MEMORY_BASIC_INFORMAITON的結構,此數據描述了進程虛擬內存空間中的一組虛擬內存頁面的當前狀態,期中State項表明這些區域是否為自由區、已調配區或保留區;Protect項則包含了 windows系統為這些區域添加了何種訪問保護;type項則表明這些區域是課執行圖像、內存映射文件還是簡單的私有內存。VirsualQ
12、ueryEX() API能讓用戶在指定的進程中,對虛擬內存地址的大小和屬性進行檢測。Windows還提供了一整套能使用戶精確控制應用程序的虛擬地址空間的虛擬內存API。一些用于虛擬內存操作及檢測的API如表3-2所示。表 3-1 MEMORY BASICNFORMAIT結構的成員成員名稱目的PVOID BaseAddress虛擬內存區域開始處的指針PVOID AllocationBase如果這個特定的區域為子分配區的話,則為虛擬內存外面區域的指針;否則此值與 BaseAddress相同DWORD AllocationProtect虛擬內存最初分配區域的保護屬性。其可能值包括:PAGE_NOAC
13、CESS,PAGE_READONLY ,PAGE_READWRITE和PAGE EXECUTE READDWORD RegionSize虛擬內存區域的字節數DWORD State區域的當前分配狀態。其可能值為MEM_COMMIT,MEM_PREE和 MEM_RESERVEDWORD Protect虛擬內存當前的保護屬性。可能值與AllocationProtect成員的相同虛擬內存區域中岀現的頁面類型。可能值為DWORD TypeMEM_IMAGE,MEM_MAPPED 和 MEM_PRIV ATE表3-2虛擬內存的 APIAPI名稱描述VisualQueryEX()通過填充MEMORY_BAS
14、IC_INFORMA TION結構檢測進程內虛擬內存的區域精品文檔精品文檔VisualAlloc()保留或調配進程的部分虛擬內存,設置分配和保護標志VirsualFree()釋放或收回應用程序使用的部分虛擬地址VirsualProtect()改變虛擬內存區域保護規范VirsualLock()防止系統將虛擬內存區域通過系統交換到頁面文件中VirsualUnlock()釋放虛擬內存的鎖定區域,必要時,允許系統將其交換到頁面文件中提供虛擬內存分配功能的是 VirtualAlloc() API。該API支持用戶向系統要求新的虛擬內 存或改變已分配內存的當前狀態。用戶若想通過VirtualAlloc()
15、函數使用虛擬內存,可以采用兩種方式通知系統:1)簡單地將內存內容保存在地址空間內2)請求系統返回帶有物理存儲區 (RAM的空間或換頁文件)的部分地址空間用戶可以用flAllocation Type參數(commit和reserve)來定義這些方式,用戶可以通知 Windows按只讀、讀寫、不可讀寫、執行或特殊方式來處理新的虛擬內存。與VirtualAlloc()函數對應的是 VirtualFree()函數,其作用是釋放虛擬內存中的已調配 頁或保留頁。用戶可利用dwFree Type參數將已調配頁修改成保留頁屬性。VirtualProtect()是VirtualAlloc() 的一個輔助函數,利
16、用它可以改變虛擬內存區的保護規 范。實驗目的1)通過實驗了解 Windows Xp內存的使用,學習如何在應用程序中管理內存,體會 Windows應用程序內存的簡單性和自我防護能力。2)學習檢查虛擬內存空間或對其進行操作。3) 了解 Windows Xp的內存結構和虛擬內存的管理,進而了解進程堆和Windows為使 用內存而提供的一些擴展功能。工具/準備工作在開始本實驗之前,請回顧教科書的相關內容。您需要做以下準備:1)一臺運行Windows Xp Professional操作系統的計算機。2)計算機中需安裝 Visual C+ 6.0專業版或企業版。實驗內容與步驟1.虛擬內存的檢測清單5-2所
17、示的程序使用 VirtualQueryEX()函數來檢查虛擬內存空間。步驟 1 :登錄進入 Windows Xp Professional 。步驟 2:在開始”菜單中單擊程序” -“Microsoft Visual Studio 6.0 ” -“Microsoft Visual C+ 6.0”命令,進入 Visual C+ 窗口。步驟 3:在工具欄單擊 “打開” 按鈕,在“打開” 對話框中找到并打開實驗源程序 5-2.cpp。清單 5-2 檢測進程的虛擬地址空間/ 工程 vmwalker#include #include #include 精品文檔精品文檔#include #pragma co
18、mment(lib, Shlwapi.lib)/ 以可讀方式對用戶顯示保護的輔助方法。/ 保護標記表示允許應用程序對內存進行訪問的類型/ 以及操作系統強制訪問的類型inline bool TestSet(DWORD dwTarget, DWORD dwMask)return (dwTarget &dwMask) = dwMask) ;# define SHOWMASK(dwTarget, type) if (TestSet(dwTarget, PAGE_#type) ) std : cout , #type; void ShowProtection(DWORD dwTarget)SHOWMAS
19、K(dwTarget, READONL Y) ;SHOWMASK(dwTarget, GUARD) ;SHOWMASK(dwTarget, NOCACHE) ;SHOWMASK(dwTarget, READWRITE) ;SHOWMASK(dwTarget, WRITECOPY) ;SHOWMASK(dwTarget, EXECUTE) ;SHOWMASK(dwTarget, EXECUTE_READ) ;SHOWMASK(dwTarget, EXECUTE_READWRITE) ;SHOWMASK(dwTarget, EXECUTE_WRITECOPY) ;SHOWMASK(dwTarget
20、, NOACCESS) ;/ 遍歷整個虛擬內存并對用戶顯示其屬性的工作程序的方法void WalkVM(HANDLE hProcess)/ 首先,獲得系統信息SYSTEM_INFO si;: ZeroMemory(&si, sizeof(si) ) ;: GetSystemInfo(&si) ;/ 分配要存放信息的緩沖區MEMORY_BASIC_INFORMATION mbi;: ZeroMemory(&mbi, sizeof(mbi) ) ;/ 循環整個應用程序地址空間LPCVOID pBlock = (LPVOID) si.lpMinimumApplicationAddress;while
21、 (pBlock si.lpMaximumApplicationAddress)/ 獲得下一個虛擬內存塊的信息if (: VirtualQueryEx(hProcess,/ 相關的進程pBlock,/ 開始位置&mbi, / 緩沖區 sizeof(mbi)=sizeof(mbi) ) / 大小的確認/ 計算塊的結尾及其大小 LPCVOID pEnd = (PBYTE) pBlock + mbi.RegionSize; TCHAR szSizeMAX_PATH;: StrFormatByteSize(mbi.RegionSize, szSize, MAX_PA TH) ;/ 顯示塊地址和大小st
22、d : cout.fill (0) ;std : cout std : hex std : setw(8) (DWORD) pBlock - std : hex std : setw(8) (DWORD) pEnd (: strlen(szSize)=7? ( : () szSize ) ;/ 顯示塊的狀態 switch(mbi.State)精品文檔精品文檔case MEM_COMMIT : std : cout Committed ; break;case MEM_FREE : std : cout Free ; break;case MEM_RESERVE : std : cout Res
23、erved ; break;/ 顯示保護 if(mbi.Protect=0 & mbi.State!=MEM_FREE) mbi.Protect=PAGE_READONL Y; ShowProtection(mbi.Protect);/ 顯示類型 switch(mbi.Type) case MEM_IMAGE : std : cout , Image ; break;case MEM_MAPPED: std : cout , Mapped; break;case MEM_PRIV ATE : std : cout 0)II實際使用的緩沖區大小II除去路徑并顯示:PathStripPath(sz
24、Filename); std : cout , Module: szFile name;std : cout std : en dl;/移動塊指針以獲得下一下個塊 pBlock = pEnd;void mai n()/遍歷當前進程的虛擬內存:WalkVM(:GetCurre ntProcess();清單5-2中顯示一個 walkVM()函數開始于某個進程可訪問的最低端虛擬地址處,并在 其中顯示各塊虛擬內存的特性。虛擬內存中的塊由VirsualQueryEX()API定義成連續快或具有相同狀態(自由區,已調配區等)的內存,并分配以一組統一的保護標志(只讀、可執行 等)。步驟4:單擊Build ”
25、菜單中的Compile 5-2.cpp ”命令,并單擊是”按鈕確認。系 統對5-2.cpp進行編譯。步驟5:編譯完成后,單擊“ Build ”菜單中的“ Build 5-2.exe ”命令,建立5-2.exe可執 行文件。操作能否正常進行?如果不行,則可能的原因是什么?能運行_步驟6:在工具欄單擊Execute Program” (執行程序)按鈕,執行5-2.exe程序。1)分析運行結果(如果運行不成功,則可能的原因是什么)按committed,reserved,free等三種虛擬地址空間分別記錄實驗數據,其中描述”是對 該組數據的簡單描述,例如,對下列一組數據:00010000-0001Xp
26、Committed,READWRITE,Private 可描述為:具有 READWRITE權限的已調配私有內存區。將系統當前的自由區(Free)虛擬地址空間填入表3-3中。地址大小虛擬地址空間類型訪問權限描述精品文檔精品文檔00010000-000120008.00KBfreeREADWRITE具有READWRITE權限的已調配私有內存區00012000-0002000056.0KBfreeNOACCESS沒有任何權限的已調配的共有內存區00020000-000210004.00KBfreeREADWRITE具有READWRITE權限的已調配私有內存區00021000-0003000060.0
27、KBfreeNOACCESS沒有任何權限的已調配的共有內存區00030000-0012c0000.98MBfreeREADONLY只具有READ權限的已調配私有內存區精品文檔精品文檔0012c000-0012d0004.00KBfreeREADWRITE具有 READWRITE已調配私有內存區權限的0012d000-0013000012.0KBfreeREADWRITE具有 READWRITE已調配私有內存區權限的00130000-0013300012.0KBfreeREADONLY只具有READ權限的已調 配內存區表3-3實驗記錄地址大小虛擬空間類型訪問權限描述freefreefreefre
28、efreefreefree將系統當前的已調配區(Committed )虛擬地址空間填入表3-4中。表3-4實驗記錄00010000-00020000 (64.0 KB) Committed, READWRITE, Map ped00020000-00030000 (64.0 KB) Committed, READWRITE, Map ped0012d000-0012e000 (4.00 KB) Committed, GUARD, READWRITE, Private0012(8.00 KB) Committed, READWRITE, Private00130000
29、-00134000 (16.0 KB) Committed, READONLY, Mapped00140000-001a7000 (412 KB) Committed, READONLY, Mapped001b0000-001b1000 (4.00 KB) Committed, READWRITE, Private001c0000-001c1000 (4.00 KB) Committed, READWRITE, Private001d0000-001d7000 (28.0 KB) Committed, READONLY, Mapped001e0000-001e2000 (8.00 KB) Co
30、mmitted, READWRITE, Map ped地址大小虛擬空間類型訪問權限描述CommittedCommittedCommittedCommittedCommittedCommittedCommitted將系統當前的保留區(Reserved)虛擬地址空間填入表3-5中。0022(844 KB) Reserved, READONLY, Private00306000-003c0000 (744 KB) Reserved, READONLY, Mapped精品文檔精品文檔003c3000-003c8000 (20.0 KB) Reserved, READONLY
31、, Mapped00673000-00680000 (52.0 KB) Reserved, READONLY, Private006f4000-01280000 (11.5 MB) Reserved, READONLY, Map ped01288000-01380000 (992 KB) Reserved, READONLY, Private01406000-01410000 (40.0 KB) Reserved, READONLY, Private表3-5實驗記錄地址大小虛擬空間類型訪問權限描述ReservedReservedReservedReservedReservedReservedR
32、eserved3)從上述輸出結果,對照分析清單5-2的程序,請簡單描述程序運行的流程:精品文檔精品文檔獲得系統觸分配要存放的忙息的緩沖恆循壞第個附用程序地址空間:獲得卜一個虛擬內存塊的門息 計算塊的結尾反其大小觀不班地址利大小顯牙塊的狀態顯木保護顯不類型檢査燈執行的總像際心蹄徑押顯示 榴動畏措怦叢獲得卜一個塊 遍歷嚴前邀程的處搖內存2.虛擬內存的分配與釋放能正確使用系統函數 GetMeoryStatus()和數據結構MEMORY_STATUS 了解系統內存和 虛擬存儲空間使用情況,會使用 VirsualAlloc ()函數和 VirsualFree ()函數分配和釋放虛 擬內存空間。/ Get
33、MemoryStatus.cpp : Defines the entry point for the con sole applicati on. /#include stdafx.h#include GetMemoryStatus.h#ifdef _DEBUG#defi ne new DEBUG_NEW#un def THIS_FILEstatic char THIS_FILE = _FILE. #en difvoid GetMemSta(void);/The one and only application objectCWinApp theApp;using namespace std;
34、int _tmain(int argc,TCHAR * argv,TCHAR * envp)int nRetCode=0;LPVOID BaseAddr;精品文檔精品文檔char *str;GetMemSta();printf(Now Allocate 32M Virsual Memory and 2M Physical Memorynn);BaseAddr=:VirtualAlloc(NULL,1024*1024*32,MEM_RESERVE|MEM_COMMIT,PA GE_READWRITE);/ 分配虛擬內存if (BaseAddr=NULL) printf(Virsual Allocate Fail.n);str=(char *)malloc(1024*1024*2);/分配內存GetMemSta();printf(Now Release 32M Virsual Memory and 2M Physical Memorynn);if (:VirtualFree
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 共同車位合同樣本
- 書櫥合同樣本
- 2024花藝師考試中的雅致體現試題及答案
- 廣州英模面試題目及答案
- 福建事業單位考試環境保護知識題及答案
- 2024年園藝師考試復習中的細節剖析試題及答案
- 農藝師考試新理念與思想分享試題及答案
- 2024年福建事業單位考試重難點解析試題及答案
- 買賣半掛車合同樣本
- 智鼎性格測試題及答案
- 古代漢語-形考任務1-3-國開-參考資料
- 鹽源縣縣屬國有企業招聘工作人員真題2024
- 工業廢水處理技術作業指導書
- 2025年中國航天日知識競賽考試題庫300題(含答案)
- 體檢中心質量控制指南
- 2024年四年級英語下冊 Unit 6 What's Anne doing第2課時教學實錄 湘少版
- T-CECC 029.1-2024 數據分類分級指南 第1部分:醫療健康
- 嚴守八項規定發言稿
- 2025-2030中國三相UPS系統行業市場發展趨勢與前景展望戰略分析研究報告
- 2025年湖南省低空經濟發展集團有限公司招聘11人筆試參考題庫附帶答案詳解
- 全國公開課一等獎四年級上冊數學人教版《角的度量》課件
評論
0/150
提交評論