实验七Windows2000虚拟内存-2.docVIP

  • 59
  • 0
  • 约4.43千字
  • 约 6页
  • 2017-12-23 发布于天津
  • 举报
实验七Windows2000虚拟内存-2.doc

实验七 Windows 2000虚拟内存-2 一、背景知识 在windows2000环境下,4GB的虚拟地址空间被划分成两个部分:低端2GB提供给进程使用,高端2GB提供给系统使用。这意味着用户的应用程序代码,包括DLL以及进程使用的各种数据等,都装在用户进程地址空间内(低端2GB)。用户过程的虚拟地址空间也被分成三部分: (1)虚拟内存的已调配区(committed):具有备用的物理内存,根据该区域设定的访问权限,用户可以进行写、读或在其中执行程序等操作。 (2)虚拟内存的保留区(reserved):没有备用的物理内存,但有一定的访问权限。 (3)虚拟内存的自由区(free):不限定其用途,有相应的PAGE_NOACCESS权限。 与虚拟内存区相关的访问权限告知系统进程可在内存中进行何种类型的操作。例如,用户不能在只有PAGE_READONLY权限的区域上进行写操作或执行程序;也不能在只有PAGE_EXECUTE权限的区域里进行读、写操作。而具有PAGE_NOACCESS权限的特殊区域,则意味着不允许进程对其地址进行任何操作。 在进程装入之前,整个虚拟内存的地址空间都被设置为只有PAGE_NOACCESS权限的自由区域。当系统装入进程代码和数据后,才将内存地址的空间标记为已调配区或保留区,并将诸如EXECUTE、READWRITE和READONLY权限与这些区域相关联。 表7-1 MEMORY_BASCI_INFORMTION的结构成员 如表7-1所示,给出了MEMORY_BASCI_INFORMTION的结构,此数据描述了进程虚拟内存空间中一组虚拟内存页面的当前状态,其中State选项表明这些区域是否为自由区、已调配区或保留区;Protect项则包含了windows系统为这些区域添加了何种访问保护;Type项则表明这些区域是可执行图像、内存映射文件还是简单的私有内存。VirtualQueryEX() API能让用户在指定的进程中,对虚拟内存地址的大小和属性进行检测。 Windows还提供了一整套能使用户精确控制应用程序的虚拟地址空间的虚拟内存API。一些用于虚拟内存操作及检测的API如表7-2所示。 提供虚拟内存分配功能的是VirtualAlloc() API。该API支持用户向系统要求新的虚拟内存或改变已分配内存的当前状态。用户若想通过VirtualAlloc()函数使用虚拟内存,可以采用两种方式通知系统: (1)简单地将内存内容保存在地址空间内。 (2)请求系统返回带有物理存储区(RAM的空间或换页文件)的部分地址空间。 用户可以用flAllocation Type参数(commit和reserve)来定义这些方式,用户可以通知windows按只读、读写、不可读写、执行或特殊方式来处理新的虚拟内存。 与VirtualAlloc() 函数对应的是VirtualFree()函数,其作用是释放虚拟内存中的已调配页或保留页。用户可利用dwFree Type参数将已调配页修改成保留页属性。 表7-2 虚拟内存的API VirtualProtect()是VirtualAlloc()的一个辅助函数,利用它可以改变虚拟内存区的保护规范。 二、实验目的 通过实验了解windows 2000内存的使用,学习如何在应用程序中管理内存,体会windows应用程序内存的简单性和自我防护能力。 学习检查虚拟内存空间或对其进行操作。 了解windows 2000的内存结构和虚拟内存的管理,windows为使用内存而提供的一些扩展功能。 三、工具与准备工作 在开始本实验之前,请回顾教科书的相关内容。 需要做以下准备: (1)一台运行windows 2000 Professional操作系统的计算机。 (2)计算机中需安装Visual C++ 6.0专业版或企业版。 四、实验内容与步骤 清单7-2的示例显示如何分配一个大容量空间,将物理存储委托给其中的很小一部分(千分之一)并加以使用。 步骤1:在Visual C++窗口的工具栏中单击“打开”按钮,在“打开”对话框中找到并打开实验源程序7-2.cpp。 清单7-2 分配和使用大块内存 //工程largealloc #include stdio.h #include windows.h #include iostream.h //尝试以指定长度的零数字填充内存块的简便方法 void FillZero(LPVOID pBlock, DWORD dwsize){ _try{ BYTE * arFill=(BYTE *) pBlock; for(DWORD dwFill=0; dwFilldwsize; ++dwFill){ arFill[dwFill]=0;

文档评论(0)

1亿VIP精品文档

相关文档