实验六 Windows 2000虚拟内存

上传人:ji****72 文档编号:51450024 上传时间:2018-08-14 格式:PPT 页数:20 大小:104.50KB
返回 下载 相关 举报
实验六 Windows 2000虚拟内存_第1页
第1页 / 共20页
实验六 Windows 2000虚拟内存_第2页
第2页 / 共20页
实验六 Windows 2000虚拟内存_第3页
第3页 / 共20页
实验六 Windows 2000虚拟内存_第4页
第4页 / 共20页
实验六 Windows 2000虚拟内存_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《实验六 Windows 2000虚拟内存》由会员分享,可在线阅读,更多相关《实验六 Windows 2000虚拟内存(20页珍藏版)》请在金锄头文库上搜索。

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

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

3、RITE和READONLY的权限与这些区域相关 联。n表6-l的数据描述了进程虚拟内存空间中一组虚 拟内存页面的当前状态。其中State项表明这 些区域是否为自由区、已调配区或保留区; Protect项则包含了Windows系统为这些区域添 加了何种访问保护;Type项则表明这些区域 是可执行图像、内存映射文件还是简单的私有 内存。VirtualQueryEX() API能让用户在指定 的进程中,对虚拟内存地址的大小和属性进行 检测。 nWindows还提供了一整套能使用户精确控制应 用程序的虚拟地址空间的虚拟内存API。 表6-1 MEMORY_BASIC_INFORMATION结构的成员成

4、员名称目的PVOID BaseAddress虚拟内存区域开始处的指针PVOID AllocationBase如果这个特定的区域为子分配区的话,则 为虚拟内存外面区域的指针;否则此值与 BaseAddress相同 DWORD AllocationProtect虚拟内存最初分配区域的保护属性。其可 能值包括:PAGE_NOACCESS, PAGE_READONLY, PAGE_READWRITE和PAGE _EXECUTE_READ DWORD RegionSize虚拟内存区域的字节数DWORD State区域的当前分配状态。其可能值为 MEM_COMMIT,MEM_FREE和 MEM_RESER

5、VE DWORD Protect虚拟内存当前区域的保护属性。可能值与 AllocationProtect成员的相同DWORD Type虚拟内存区域中出现的页面类型。可能值 为MEM_IMAGE, MEM_MAPPED和 MEM_PRIVATE表6-2 虚拟内存的APIAPI名称描述VirtualQueryEx()通过填充 MEMORY_BASIC_INFORMATION结构检 测进 程内虚拟内存的区域 VirtualAlloc()保留或调配进程的部分虚拟内存,设置分配 和保护标 志VirtualFree()释放或收回应用程序使用的部分虚拟地址VirtualProtect()改变虚拟内存区域保护

6、规 范VirtualLock()防止系统将虚拟内存区域通过系统交换到 页面文件中VirtualUnlock()释放虚拟内存的锁定区域,必要时,允许系 统将其交换到页面文件中n提供虚拟内存分配功能的是VirtualAlloc() API 。该API支持用户向系统要求新的虚拟内存或 改变已分配内存的当前状态。用户若想通过 VirtualAlloc() 函数使用虚拟内存,可以采用两 种方式通知系统:1) 简单地将内存内容保存在地址空间内; 2) 请求系统返回带有物理存储区 (RAM的空间或 换页文件) 的部分地址空间。n用户可以用flAllocation Type参数 (commit和 reserv

7、e) 来定义这些方式,用户可以通知 Windows按只读、读写、不可读写、执行或特 殊方式来处理新的虚拟内存。n与VirtualAlloc() 函数对应的是VirtualFree() 函 数,其作用是释放虚拟内存中的已调配页或保 留页。用户可利用dwFree Type参数将已调配 页修改成保留页属性。nVirtualProtect() 是VirtualAlloc() 的一个辅助函 数,利用它可以改变虚拟内存区的保护规范。二、实验目的1) 通过实验了解Windows 2000内存的使用, 学习如何在应用程序中管理内存,体会Windows 应用程序内存的简单性和自我防护能力。 2) 学习检查虚拟内

8、存空间或对其进行操作; 3) 了解Windows 2000的内存结构和虚拟内存 的管理,进而了解进程堆和Windows为使用内存 而提供的一些扩展功能。三、实验内容与步骤1、虚拟内存的检测 / 工程vmwalker # include # include # include # include # pragma comment(lib, “Shlwapi.lib“)/ 以可读方式对用户显示保护的辅助方法。 / 保护标记表示允许应用程序对内存进行访问的类型 / 以及操作系统强制访问的类型 inline bool TestSet(DWORD dwTarget, DWORD dwMask) retu

9、rn (dwTarget # define SHOWMASK(dwTarget, type) if (TestSet(dwTarget, PAGE_#type) ) std : cout 0) / 实际使用的缓冲区大小/ 除去路径并显示: PathStripPath(szFilename) ;std : cout # include / 尝试以指定长度的零数字填充内存块的简便方法void FillZero(LPVOID pBlock, DWORD dwSize)_tryBYTE* arFill = (BYTE *) pBlock;for (DWORD dwFill = 0; dwFill dw

10、Size; +dwFill)arFill dwFill = 0; std : cout “Memory zeroed.” std : endl;_except(EXCEPTION_EXECUTE_HANDLER)std : cout “Could not zero memory. ” std : endl; void main() / 简单的常数DWORD c_dwGigabyte = 1 30;DWORD c_dwMegabyte = 1 20;/ 使用内存分配来获得1GB块LPVOID pBlock = : malloc(c_dwGigabyte) ;: FillZero (pBlock,

11、 c_dwMegabyte) ;: free(pBlock) ;/ 使用虚拟分配以获得物理1GB块LPVOID pBlock = : VirtualAlloc(NULL,/ 不指定起始地址c_dwGigabyte,/ 要求1GBMEM_COMMIT, / 调配物理存储PAGE_READWRITE) ; / 对此的读写操作: FillZero(pBlock, c_dwMegabyte) ;: VirtualFree(pBlock, 0, MEM_RELEASE) ;/ 使用虚拟分配以获得虚拟1GB块LPVOID pBlock = : VirtualAlloc(NULL,/ 不指定起始地址c_dw

12、Gigabyte,/ 要求1GBMEM_RESERVE,/ 不调配物理存储PAGE_READWRITE) ; / 对此的读写操作: FillZero(pBlock, c_dwMegabyte) ;: VirtualFree(pBlock, 0, MEM_RELEASE) ;/ 使用虚拟分配调配获得虚拟1GB块,再为其调配1MB物理存储LPVOID pBlock = : VirtualAlloc(NULL,/ 不指定起始地址c_dwGigabyte,/ 要求1GBMEM_RESERVE,/ 不调配物理存储PAGE_READWRITE) ; / 对此的读写操作: VirtualAlloc(pBlo

13、ck,c_dwMegabyte,MEM_COMMIT,PAGE_READWRITE) ;: FillZero(pBlock, c_dwMegabyte) ;: VirtualFree(pBlock, 0, MEM_RELEASE) ;n利用VirtualLock() API,Windows可用来在自 己的进程空间中控制虚拟内存的行为。这个函 数与其成对的VirtualUnlock() 阻止或允许一块 内存从物理RAM中换页和换页到页面文件中 。这样就会通知系统有一段特定的内存区要求 对用户作出强烈的响应,所以系统不应将其移 出RAM。当然,如果要将整个虚拟内存空间 锁定,系统就会停留于试图将系统中工作内存 的每一小块换页到磁盘。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号