《《Windowsxp虚拟内存》实验指导书(模板).pdf》由会员分享,可在线阅读,更多相关《《Windowsxp虚拟内存》实验指导书(模板).pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验 5 Windows xp 虚拟内存(实践估计时间:100 分钟)在 Windows xp 环境下,4GB 的虚拟址空间被划分成两个部分:低端 2GB 提供给进程使用,高端 2GB 提供给系统使用。这意味着用户的应用程序代码,包括 DLL 以及进程使用的各种数据等,都装在用户进程地址空间内(低端 2GB),用户过程的虚拟地址空间也被分成三个部分:1)虚拟内存的已调配区(committed):具有备用的物理内存,根据该区域设定的访问权限,用户可以进行写、读或在其中执行程序等操作。2)虚拟内存的保留区(researved):没有备用的物理内存,但有一定的访问权限。3)虚拟内存的自由区(free
2、):不限定其用途,有相应的 PAGE_NOAC_CESS 权限。与虚拟内存区相关的访问权限告知系弘进程可在内存中进行何种类型的操作。例如:用户不能在只有 PAGE_READONLY 权限的区域上进行写操作或执行程序:也不能在只有 PAGE_EXECUTE 权限的区域里进行读、写操作。而具有 PAGE_NOACESS 权限的特殊区域,则意味着不允许进程对其地址进行任何操作。在进程装入之前,整个虚拟内存的地址空间都被设置为只有 PAGE_NOACESS 权限的自由区域。当系统装入进程代码和数据后,才将内存地址的空间标记为已调配区或保留区,并将诸如 EXECUTE、READWRITE 和 READO
3、NLY 的权限与这些区域相关联。如表 5-1 所示,给出了 MEMORY_BASIC_INFORMATION 的结构,此数据描述了进程虚拟内存空间中一组虚拟内存页面的当前状态,其中 State 项表明这些区域是否为自由区、已调配区或保留区;Protect 项则包含了 Windows 系统为这些区域添加了何种访问保护;Type 项则表明这些区域是可执行图像、内存映射文件还是简单的私有内存,VirtualQueryEX()API 能让用户在指定的进程中,对虚拟内存地址的大小和属性进行检测。Windows 还提供了一整套能使用户精确控制应用程序的虚拟地址空间 API,一些用于虚拟内存操作及检测的 A
4、PI 如表 5-2 所示。表 5-1 MEMORY_BASIC_INFORMATION 结构的成员 成员名称 目的 PVOID BaseAddress 虚拟内存开始处的指针 PVOID AllocationBase 如果这个特定的区域为子分配区的话,则为虚拟内存外面区 域的指针;否则此值与 BaseAddress 相同 DWORD AllocationProtect 虚拟内存最初分配区域的保护属性。其可能值包括:PAGE_NOACESS,PAGE_READONLY,PAGE_READWRITTE 和 PAGE_EXECUTE_READ。DWORD RegionSize 虚拟内存区域的字节数 D
5、WORD State 区域的当前分配状态,其可能值为 MEM_COMMIT,MEM_FREE 和 MEM_RESERVE DWORD Protect 虚拟内存当前区域的保护属性,可能值与 AllocationProtect 成员相同 DWORD Type 虚拟内存区域中出现的页面类型,可能值为 MEM_IMAGE,MEM_MAPPED 和 MEM_PRIVATE 表 5-2 虚拟内存的 API API 名称 描 述 VirtualQueryEx()通过填充 MEMORY_BASIC_INFORMATION 结 构检测进程内虚拟内存的区域 VirtualAlloc()保留或调配进程的部分虚拟内存
6、,设置分配和保 护标志 VirtualFree()释放或收回应用程序使用的部分虚拟地址 VirtualProtect()改变虚拟内存区域保护规范 VirtualLock()防止系统将虚拟内存区域通过系统交换到页面文件中 VirtualUnlock()释放虚拟内存的锁定区域,必要时,允许系统将 其交换到页面文件中 提供虚拟内存分配功能的是 VirtualAlloc()API,该 API 支持用户向系统要求新的虚拟内存或改变已分配内存的当前状态,用户若想通过 VirtualAlloc()API 函数使用虚拟内存,可以采用两种方式能知系统:1)简单地将内存内容保存在地址空间内。2)请求系统返回带有物
7、理存储区(RAM 的空间或换页文件)的部分地址空间。用户可以用 flAllocation Type 参数(commit 和 reserve)来定义这些方式,用户可以通知 Windows 按只读、读写、不可读写、执行或特殊方式来处理 新的虚拟内存。与 VirtualAlloc()函数对应的是 VirtualFree()函数,其作用是释放虚拟内存中的已调配页或保留页。用户可利用 dwFree Type 参数将已调配页修改成保留页属性。VirtualProtect()是 VirtualAlloc()的一个辅助函数,利用它可以改变虚拟内存的保护规范。5.2 实践目的 1)通过实践了解 Windows
8、xp 内存的使用,学习如何在应用程序中管理内存、体会 Windows 应用程序内存的简单性和自我防护能力。2)学习检查虚拟内存空间或对其进行操作 3)了解 Windows xp 内存结构和虚拟内存的管理,进而了解进程堆和 Windows 为使用内存而提供的一些扩展功能。5.3 工具/准备工作 在开始本实践之前,请回顾教科书的相关内容。您需要做以下准备:1)一台运行 Windows xp Professional 操作系统的计算机。2)计算机中需安装 Visual C+6.0 专业版或企业版。5.4 实践内容与步骤 1.虚拟内存的检测 使用 VirtualQueryEX()函数来检查虚拟内存空间
9、。步骤 1:登录进入 Windows xp Professional。步骤 2:在“开始”菜单中单击“程序”、“Microsoft Visual Studio 6.0”“Microsoft Visual C+6.0”,进入 Visual C+窗口。步骤 3:在工具栏单击“新建”按钮,编写代码保存为 5-1.cpp。功能:检测进程的虚拟地址空间 参考头文件与函数:windows.h、iostream、shlwapi.h、iomanip、WalkVM()、ZeroMemory()、GetSystemInfo(&si)、StrFormatByteSize()、VirtualQueryEx()API
10、步骤 4:单击“Build”菜单中的“Compile 5-1.cpp”命令,单击“是”按钮确认,系统对 5-1.cpp 进行编译。步骤 5:编译完成后,单击“Build”菜单中的“Build 5-1.exe”命令,建立 5-1.exe 可执行文件。操作能否正常进行,如果不行,原因是什么?步骤 6:在工具栏单击“Execute program”按钮,执行 5-1.exe 程序。运行结果(如果运行不成功,原因是什么?):按 committed、reserved、free 等三种虚拟地址空间分别记录实践数据,其中“描述”是指对该组数据的简单描述,例如:对下列一组数据:00010000-0001xpC
11、ommitted,READWRITE,Private 可描述为:具有 READWRITE 权限的已调配私有内存区。将系统当前的自由区(free)虚拟地址空间填入表 5-3 中。表 5-3 实践记录 地址 大小 虚拟地址空 间 访问权限 描述 free free free free free free free free free free free free free free free free free free free free free free free free free 将系统当前的已调配区(committed)虚拟地址空间填入表 5-4 中 表 5-4 实践记录 地址 大小
12、虚拟地址空间 访问权限 描述 committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed committed 将系统当前的保留区(reserved)虚拟地址空间
13、填入表 5-8 中 表 5-5 实践记录 地址 大小 虚拟地址空 间 访问权限 描述 reserved reserved 地址 大小 虚拟地址空 间 访问权限 描述 reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved reserved 2
14、.虚拟内存操作 如何分配一个大容量空间,将物理存储委托给其中的很小一部分(千分之一)并加以使用。步骤 1:在工具栏单击“新建”按钮,编写代码并保存为 5-2.cpp。功能:分配和使用大块内存 参考头文件与函数:windows.h、iostream、FillZero()、malloc()、FillZero()、free()、VirtualAlloc()、VirtualFree()、;步骤 2:单击“Build”菜单中的“Compile5-2.cpp”命令,单击“是”按钮确认,系统对 5-2.cpp 进行编译。步骤 5:编译完成后,单击“Build”菜单中的“Build 5-2.exe”命令,建立 5-2.exe 可执行文件。操作能否正常进行,如果不行,原因是什么?步骤 6:在工具栏单击“Execute program”按钮,执行 5-2.exe 程序。运行结果(如果运行不成功,原因是什么?):5.5 撰写实验报告