实验3Windows虚拟内存.docx

上传人:李司机 文档编号:5863785 上传时间:2023-08-28 格式:DOCX 页数:34 大小:82.87KB
返回 下载 相关 举报
实验3Windows虚拟内存.docx_第1页
第1页 / 共34页
实验3Windows虚拟内存.docx_第2页
第2页 / 共34页
实验3Windows虚拟内存.docx_第3页
第3页 / 共34页
实验3Windows虚拟内存.docx_第4页
第4页 / 共34页
实验3Windows虚拟内存.docx_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《实验3Windows虚拟内存.docx》由会员分享,可在线阅读,更多相关《实验3Windows虚拟内存.docx(34页珍藏版)》请在三一办公上搜索。

1、实验3Windows虚拟内存(一)、虚拟内存1背景知识在Windows环境下,32位Windows系统中2=4GB的虚拟地址空间被划分成两个部分:低端2GB提供给进程使用,高端2GB提供给系统使用。这意味着用户的应用程序代码,包含DLL与进程使用的各类数据等,都装在用户进程地址空间内(低端2GB)。用户过程的虚拟地址空间也被分成三部分:1)虚拟内存的已调配区(COmmitted):具有备用的物理内存,根据该区域设定的访问权限,用户能够进行写、读或者在其中执行程序等操作。2)虚拟内存的保留区(reserved):没有备用的物理内存,但有一定的访问权限o3)虚拟内存的自由区(free):不限定其用

2、途,有相应的PAGE_NOACCESS权限。与虚拟内存区有关的访问权限告知系统进程可在内存中进行何种类型的操作。比如,用户不能在只有PAGE-READONLY权限的区域上进行写操作或者执行程序:也不能在只有PAGE_EXECUTE权限的区域里进行读、写操作。而具有PAGE_NOACCESS权限的特殊区域,则意味着不同意进程对其地址进行任何操作。在进程装入之前,整个虚拟内存的地址空间都被设置为只有PAGE-NOACCESS权限的自由区域。当系统装入进程代码与数据后,才将内存地址的空间标记为已调配区或者保留区,并将诸如EXECUTE、READWRITE与READONLY的权限与这些区域有关联。如表

3、1所示,给出了MEMORY_BASICJNFORMATION的结构,此数据描述了进程虚拟内存空间中一组虚拟内存页面的当前状态,其中State项说明这些区域是否为自由区、己调配区或者保留区;Protect项则包含了Windows系统为这些区域添加了何种访问保护;Type项则说明这些区域是可执行图像、内存映射文件还是简单的私有内存CVirtualQueryEXOAPI能让用户在指定的进程中,对虚拟内存地址的大小与属性进行检测。Windows还提供了一整套能使用户精确操纵应用程序的虚拟地址空间的虚拟内存APk一些用于虚拟内存操作及检测的API如表2所示。表1MEMORY.BASICJNFORMATI

4、ON结构的成员成员名称目的PVOIDBaseAddress虚拟内存区域开始处的指针PVOIDAllocationBase假如这个特定的区域为子分配区的话,则为虚拟内存外面区域的指针:否则,此值与BaSeAddreSS相同DWORDAllocationProtect虚拟内存最初分配区域的保护属性。其可能值包含:PAGE_NOACCESS,PAGE_READONLY,PAGE_READWRITE与PAGE_EXECUTE_READDWORDRegionSize虚拟内存区域的字节数DWORDState区域的当前分配状态。其可能值为MEMCOMMIT,MEM_FREE与MEM-RESERVEDW()R

5、DProtect虚拟内存当前区域的保护属性。可能值与AllOCationProteCt成员的相同DWORDType虚拟内存区域中出现的页面类型。可能值为MEMMAGE,MEM_MAPPED与MEM.PRIVATE表2虚拟内存的APlAPl名称描述VirtualQueryExO通过填充MEMoRY_BASICNFoRMATloN结构检测进程内虚拟内存的区域VirtuaAllocO保留或者调配进程的部分虚拟内存,设置分配与保护标志VirtualFreeO释放或者收回应用程序使用的部分虚拟地址VirtualProtectO改变虚拟内存区域保护规范VirtualLockO防止系统将虚拟内存区域通过系统

6、交换到页面文件中VirtualUnlockO释放虚拟内存的锁定区域,必要时.,同意系统将其交换到页面文件中提供虚拟内存分配功能的是VinualAllocOAPL该API支持用户向系统要求新的虚拟内存或者改变已分配内存的当前状态。用户若想通过VimIaIAHoC()函数使用虚拟内存,能够使用两种方式通知系统:1)简单地将内存内容储存在地址空间内。2)请求系统返回带有物理存储区(RAM的空间或者换页文件)的部分地址空间。用户能够用flAllocationType参数(Commit与reserve)来定义这些方式,用户能够通知WindOWS按只读、读写、不可读写、执行或者特殊方式来处理新的虚拟内存。

7、与VimlalAnOC()函数对应的是VirtUalFree()函数,其作用是释放虚拟内存中的已调配页或者保留页。用户可利用dwFreeType参数将己调配页修改成保留页属性。VirtUaIPrOteCt()是VirtUalAnoC()的一个辅助函数,利用它能够改变虚拟内存区的保护规范。2实验目的1)通过实验熟悉WindoWS内存的使用,学习如何在应用程序中管理内存,体会WindOWS应用程序内存的简单性与自我防护能力。2)学习检查虚拟内存空间或者对其进行操作。3)熟悉Windows的内存结构与虚拟内存的管理,继而熟悉进程堆与Windows为使用内存而提供的一些扩展功能。3实验内容与步骤虚拟内

8、存的检测清单2所示的程序使用VirtUalQUeryEX()函数来检查虚拟内存空间。步骤1:在“开始”菜单中单击“程序、MicrosoftVisuaIStudio6.0”、wMicrosoftVisualC+6.0”,进入ViSUalC+窗口。步骤2:运行下列程序清单清单2检测进程的虚拟地址空间#include#inc1ude#include#include#pragmacomment(lib,shlwapi.lib)/以可读方式对用户显示保护的辅助方法。保护标记表示同意应用程序对内存进行访问的类型与操作系统强制访问的类型inlineboolTestSet(DWORDdwTarget,DWOR

9、DdwMask)(return(dwTarget&dwMask)=dwMask);)#defineSHoWMASK(dwTarget,type)if(TestSet(dwTarget,PAGE_#type)std:xout,type;JvoidShowProtection(DWORDdwTarget)(SHOWMASK(dwTarget,READONLY);SHOWMASK(dwTarget,GUARD);SHOWMASK(dwTarget,NOCACHE);SHOWMASK(dwTarget,READWRITE);SHOWMASK(dwTarget,WRITECOPY);SHOWMASK(d

10、wTarget,EXECUTE);SHOWMASK(dwTarget,EXECUTE-READ);SHOWMASK(dwTarget,EXECUTE-READWRITE);SHOWMASK(dwTarget,EXECUTE-WRITECOPY);SHOWMASK(dwTarget,NOACCESS);)遍历整个虚拟内存并对用户显示其属性的工作程序的方法voidWalkVM(HANDLEhProcess)(首先,获得系统信息Systemjnfosi;:ZeroMemory(&si,SiZeof(Si);:GetSyStemlnfb(&si);分配要存放信息的缓冲区MEMORY_BASICNFoR

11、MATIoNmbi;:ZeroMemory(&mbi,SiZeOf(nbi);循环整个应用程序地址空间1.PCVOIDpBlock=(LPVOID)si.lpMinimumApplicationAddress;while(pBlocksi.IpMaximumApplicationAddress)(获得下一个虚拟内存块的信息if(:VirtualQueryEx(hProcess,有关的进程Block,开始位置&mbi,/缓冲区sizeof(mbi)=sizeof(mbi)/大小的确认计算块的结尾及其大小1.PCVOIDPEnd=(PBYTE)PBlOCk+mbi.RegionSize;TCHAR

12、szSizeMAX.PATH;:StrFormatByteSize(mbi.RegionSize,szSize,MAX_PATH);显示块地址与大小std-cout.fll(,0,);std:CoUtstd:hexvstd:setw(8)(DWORD)pB1ock-std:hexstd:setw(8)(DWORD)pEnd(strlen(szSize)=77(,C,)szSize);显示块的状态switch(mbi.State)(caseMEM-COMMIT:std:CoUt,Commilted;break;caseMEM-FREE:std:COUt0)(除去路径并显示:PathStripPa

13、th(SzFiIename);std:cout,Module:szFilename;)std:coutstd:endl;/移动块指针以获得下一个块pBlock=pEnd;)1voidmain()(遍历当前进程的虚拟内存:WalkVM(:GetCurrentProcess();)清单2中显示一个WaIkVMo函数开始于某个进程可访问的最低端虚拟地址处,并在其中显示各块虚拟内存的特性。虚拟内存中的块由VirtualQueryExOAPl定义成连续块或者具有相同状态(自由区、已调配区等)的内存,并分配以一组统一的保护标志(只读、可执行等)。回答下列问题:1)分析运行结果committedreserv

14、ed、free分别表示什么含义?)虚拟内存的已调配区(COmmiHed):具有备用的物理内存,根据该区域设定的访问权限,用户能够进行写、读或者在其中执行程序等操作。2)虚拟内存的保留区(reserved):没有备用的物理内存,但有一定的访问权限。3)虚拟内存的自由区(free):不限定其用途,有相应的PAGE.NOACCESS权限。按Commitled、reserved、free等三种虚拟地址空间分别记录实验数据,其中“描述”是指对该组数据的简单描述,比如,对下列一组数据:00010000-00012000Committed,READWRITE,Private可描述为:具有readwrite权

15、限的已调配私有内存区。将系统当前的自由区(free)虚拟地址空间填入表1中。(表格能够白己画,通过把运行结果复制到word中文字转换成表格)表1实验记录00012000-00020000(56.0KB)FreeNOACCESS00021000-00030000(60FreeNOACCESS.0KB)00133000-00140000(52.0KB)FreeNOACCESS00276000-00280000(40.0KB)FreeNOACCESS002cl000-002d0000(60.0KB)FreeNOACCESS00311000-00320000(60.0KB)FreeNOACCESS00

16、326000-00330000(40.0KB)FreeNOACCESS00371000-00380000(60.0KB)FreeNOACCESS00391000-003a(X)00(60.0KB)FreeNOACCESSOO3alOOO-OO3bOOOO(6O.0KB)FreeNOACCESSOO3c3OOO-OO3dOOOO(52.0KB)FreeNOACCESS003e0000-00400000(128KB)FreeNOACCESS00485000-00490000(44.0KB)FreeNOACCESS00558000-00560000(32.0KB)FreeNOACCESS006630

17、00-00670000(52.0KB)FreeNOACCESS00970000-62c20000(l.53GB)FreeNOACCESS62c29000-73fa0000(275MB)FreeNOACCESS7400b000-76300000(34.9MB)FreeNOACCESS763ld000-77be0000(24.7MB)FreeNOACCESS77c38OOO-77d10000(864KB)FreeNOACCESS77e49000-77e50000(28.0KB)FreeNOACCESS77ee2000-77ef000(56.0KB)FreeNOACCESS77f39000-77f4

18、0000(28.0KB)FreeNOACCESS77fb6000-77fc0000(40.OKB)FreeNOACCESS77fdl000-7c800000(72.1MB)FreeNOACCESS7c91e000-7c920000(8.(X)KB)FreeNOACCESS7c9b3000-7f6fD000(45.2MB)FreeNOACCESS7f7tXX)OO-7ffaOOOO(7.68MB)FreeNOACCESS7ffd3000-7ffd7000(l6.0KB)FreeNOACCESS7ffd8000-7ffdfD00(28.0KB)FreeNOACCESS将系统当前的己调配区(COmm

19、itIed)虚拟地址空间填入表2中。表2实验记录00010000-00012000(8.00KB)CommittedREADWRITEPrivate00020000-00021000(4.00KB)CommittedREADWRITEPrivate0012c000-0012d000(4.(X)KB)CommittedGUARDREADWRITEPrivate0012d000-00130000(12.0KB)CommittedREADWRITEPrivate00130000-00133000(12.0KB)CommittedREADONLYMapped00140000-00145000(20.0

20、KB)CommittedREADWRITEPrivate00240000-00246000(24.0KB)CommittedREADWRITEPrivate00250000-00253000(12.0KB)CommittedREADWRITEMapped00260000-00276000(88.0KB)CommittedREADONLYMappedOO28OOOO-OO2c1000(260KB)CommittedREADONLYMapped002d0000-003II000(260KB)CommittedREADONLYM叩Ped00320000-00326000(24.0KB)Committ

21、edREADONLYM叩Ped00330000-00371000(260KB)CommittedREADONLYMapped00380000-00388000(32.0KB)CommittedREADWRITEPrivate00390000-00391000(4.00KB)CommittedREADWRITEPrivateOO3aOOOO-OO3a1000(4.(X)KB)CommittedREADWRITEPrivate003b0000-003b4000(16.0KB)CommittedREADWRITEPrivateOO3cOOOO-OO3c3OOO(12.0KB)CommittedREA

22、DONLYMapped003d0000-003d3000(12.0KB)CommittedREADWRITEPrivate00400000-00401000(4.00KB)CommittedREADONLYImageModuleillLexe00401000-00470000(444KB)CommittedEXECUTE_READImage00470000-00478000(32.0KB)CommittedREADONLYImage00478000-0047b000(12.0KB)CommittedREADWRITEImage0047b000-0047d000(8.00KB)Committed

23、WRITECOPYImage0047d000-00481000(16.0KB)CommittedREADWRITEImage00481000-00485000(16.0KB)CommittedREADONLYImage00490000-00496000(24.0KB)CommittedEXECUTE_READMapped00550000-00552000(8.00KB)CommittedEXECUTE_READMapped00560000-00663000(1.OlMB)CommittedREADONLYMapped00670000-006eR)00(508KB)CommittedEXECUT

24、E_READM叩Ped62c20000-62c21000(4.00KB)CommittedREADONLYImageMOdUle:LPK.DLL62c21000-62c26000(20.0KB)CommittedEXECUTE.READImage62c26000-62c27000(4.00KB)CommittedREADWRITEImage62c27000-62c29000(8.00KB)CommittedREADONLYImage73faOOOO-73fa1000(4.0OKB)CommittedREADONLYImageModuIe:USPIO.dll73falOOO-73fe5OOO(2

25、72KB)CommittedEXECUTE_READImage73fe5000-73fef000(40.0KB)CommittedWRITECOPYImage73feiDOO-73ff1000(8.00KB)CommittedREADWRITEImage73ffl000-73ff4000(12.0KB)CommittedWRITECOPYImage73ff4000-73ff5000(4.00KB)CommittedREADWRITEImage73ff5000-7400b000(88.0KB)CommittedREADONLYImage76300000-76301000(4.00KB)Commi

26、ttedREADONLYImageModuIe:IMM32.DLL76301000-76316000(84.0KB)CommittedEXECUTE_READImage76316000-76317000(4.(X)KB)CommittedREADWRITEImage76317000-763ld000(24.0KB)CommittedREADONLYImage77be0000-77be1000(4.00KB)CommittedREADONLYImageModule:msvcrt.dll77bel000-77c2d000(304KB)CommittedEXECUTE_READImage77c2d0

27、00-77c2K)00(8.00KB)CommittedWRITECOPYImage77c2fD00-77c30000(4.0OKB)CommittedREADWRITEImage77c3OOOO-77c31000(4.00KB)CommittedWRITECOPYImage77c31000-77c34000(12.0KB)CommittedREADWRITEImage77c34000-77c38000(16.0KB)CommittedREADONLYImage77dl0000-77d11000(4.00KB)CommittedREADONLYImageModUle:USER32.dll77d

28、ll000-77d71000(384KB)CommittedEXECUTE.READImage77d71000-77d72000(4.00KB)CommittedREADWRITEImage77d72000-77d73000(4.OOKB)CommittedWRITECOPYImage77d73OOO-77daOOOO(18OKB)CommittedREADONLYImage77da0000-77da1000(4.00KB)CommittedREADONLYImageModule:ADVAPI32.dll77dal000-77e16000(468KB)CommittedEXECUTE_READ

29、Image77el6000-77e17000(4.(X)KB)CommittedREADWRITEImage77el7000-77eIb000(16.0KB)CommittedWRITECOPYImage77elb000-77e49000(184KB)CommittedREADONLYImage77e50000-77e51000(4.00KB)CommittedREADONLYImageMOdUIe:RPCRT4.dll77e51OOO-77edbOOO(552KB)CommittedEXECUTE_READImage77edb000-77edc000(4.OOKB)CommittedREAD

30、WRITEImage77edc000-77ee2000(24.OKB)CommittedREADONLYImage77ef0000-77ef1000(4.0OKB)CommittedREADONLYImageModule:GDI32.dlI77ef1000-77134000(268KB)CommittedEXECUTE_READImage77f34000-77f36000(8.0OKB)CommittedREADWRITEImage77f36000-77f39000(12.0KB)CommittedREADONLYImage77f40000-77f41000(4.00KB)CommittedR

31、EADONLYImageModuleiSHLWAPLdl177f41000-77fad000(432KB)CommittedEXECUTE_READImage77fad000-77fae000(4.00KB)CommittedREADWRITEImage77fae000-77fb6000(32.0KB)CommittedREADONLYImage77fc0000-77fc1000(4.00KB)CommittedREADONLYImageModule:Secur32.dll77fcl000-77fce000(52.OKB)CommittedEXECUTE.READImage77fce000-7

32、7fcf000(4.0OKB)CommittedREADWRITEImage77fcfOOO-77fd1000(8.0OKB)CommittedREADONLYImage7c8OOOOO-7c801000(4.OOKB)CommittedREADONLYImageModuie:kemel32.dll7c801000-7c885000(528KB)CommittedEXECUTE_READImage7c885OOO-7c888OOO(12.0KB)CommittedREADWRITEImage7c888OOO-7c88aOOO(8.(X)KB)CommittedWRITECOPYImage7c8

33、8a000-7c91e000(592KB)CommittedREADONLYImage7c920000-7c921000(4.OOKB)CommittedREADONLYImageModuleintdlhdll7c921000-7c99b000(488KB)CommittedEXECUTE_READImage7c99b000-7c99e000(12.0KB)CommittedREADWRITEImage7c99e000-7c9a0000(8.0OKB)CommittedWRITECOPYImage7c9a0000-7c9b3000(76.0KB)CommittedREADONLYImage7f

34、6fOOOO-7f6f7OOO(28.0KB)CommittedEXECUTE_READMapped7ffa0000-7ffd3000(204KB)CommittedREADONLYMapped7ffd7000-7ffd8000(4.00KB)CommittedREADWRITEPrivate7ffdfD00-7ffe00(X)(4.00KB)CommittedREADWRITEPrivate7ffeOOOO-7ffe1000(4.00KB)CommittedREADONLYPrivate将系统当前的保留(reserved)虚拟地址空间填入表3中。表3实验记录00030000-0012cOOO

35、(O.98MB)ReservedREADONLYPrivate00145000-00240000(0.98MB)ReservedREADONLYPrivate00246000-00250000(40.0KB)ReservedREADONLYPrivate00253000-00260000(52.0KB)ReservedREADONLYMapped00388000-00390000(32.0KB)ReservedREADONLYPrivate003b4000-003c0000(48.0KB)ReservedREADONLYPrivateOO3d3OOO-OO3eOOOO(52ReservedRE

36、ADONLYPrivate.0KB)00496000-00550000(744KB)ReservedREADONLYMapped00552000-00558000(24.0KB)ReservedREADONLYMapped006et00-00970000(2.50MB)ReservedREADONLYMapped7f617000-7f7f0000(996KB)ReservedREADONLYMapped7ffel000-7ffK)000(60.0KB)ReservedNOACCESSPrivate2)从上述输出结果,参照分析程序,请简单描述程序运行的流程:从主程序开始,调用walkvm(han

37、dlehProcess),walkvm(handlehprocess)先获得系统信息,分配应用程序地址空间,进行循环程序:获得虚拟程序的内存信息,显示块的大小与位置及状态,显示保护方式与类型,检查可执行的影像,,除去文件名的路径并将文件名显示出来,,移动块指针获得下一块,循环3)实验总结(根据实验结果及自己查阅有关资料写出VimIaIAnoCo函数的作用,各个参数的可能值及含义。列出对虚拟内存的认识)通过本次实验体会学习检查虚拟内存空间或者对其进行操作,windows2000的内存使用,继而熟悉进程与windows为使用内存而提供的一些扩展功能。虚拟内存计算机系统内存管理的一种技术。它使得应用

38、成粗认为它拥有连续的可用的内存,而实际上,它通常是被隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。4)列出虚拟内存不足的原因及其解决方法;一、剪贴板占用了太多的内存实际上,剪贴板是内存中的一块临时区域,当你在程序中使用了“复制”或者“剪切”命令后,Windows将把复制或者剪切的内容及其格式等信息暂时存储在剪贴板上,以供“粘贴”使用。假如当前剪贴板中存放的是一幅图画,则剪贴板就占用了很多的内存。这时,请按下述步骤清除剪贴板中的内容,释放其占用的内存资源:1 .单击“开始”,指向“程序”或者“所有程序”,指向“附件”,指向“系统工具”,然后单击“剪贴板查看程序”

39、,打开“剪贴板查看程序”窗口。2 .在“编辑”菜单上,单击“删除”命令。3 .关闭“剪贴板查看程序”窗口。为了与MicrosoftOffice程序提供的多重剪贴板相区分,上述所说的剪贴板,常被我们称之系统剪贴板。假如你正在使用MiCroSoftoffiCe程序,而且使用了其多重剪贴板功能,那么你应清空Office剪贴板”上的项目,方法是:在“Office剪贴板”任务窗格(OffiCeXP)或者工具栏(OffiCe2000)上,单击“全部清空”或者“清空剪贴板当清空Office剪贴板”时,系统剪贴板也将同时被清空二、打开的程序太多假如同时打开的文档过多或者者运行的程序过多,就没有足够的内存运行其

40、他程序。这时,关于多文档界面(MDl)程序,如Word、EXCel等,请关闭当前文档外的所有文档,并退出当前未使用的程序,然后或者许你就能够继续执行因“内存不足”而被中断的任务。三、重新启动计算机假如只退出程序,并不重新启动计算机,程序可能无法将内存资源归还给系统。请重新启动计算机以释放系统资源,然后再次运行程序或者执行被中断的任务。四、自动运行的程序太多假如在启动Windows时自动运行的程序太多,那么,即使重新启动计算机,也没足够的内存用来运行其它程序。(一)确定设置为自动运行的程序是否太多1 .单击“开始”,然后单击“运行”。2 .在“打开”框中,键入uMsconfigw,单击“确定”按

41、钮,打开“系统配置有用程序”窗口。3 .单击“常规”选项卡,选中“选择性启动”复选钮,清除“处理Win.ini文件”复选框与“加载启动组项目”复选框。4 .单击“确定”按钮,当系统提示重新启动计算机时,请单击“是”按钮。重新启动电脑后,假如内存不足的问题已经解决,你就能够将计算机配置为启动时不打开任何程序。(二)配置计算机不自动打开任何程序1.恢复在MSCOnfig中所作的更换,方法是:在“系统配置有用程序”窗口,单击“常规”选项卡,选择“正常启动”,单击“确定”按钮,然后重新启动计算机。2 .删除“启动”文件夹中的所有快捷方式单击“开始”,指向“设置”,然后单击“任务栏与开始菜单”,系统弹出“任务栏属性”对话框。单击“开始菜单”选项卡,单击“自定义”,再单击“删除”按钮。单击“启动”文件夹旁的加号,以显示设置为自动运行的程序列

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号