实验六 Windows 2000虚拟内存

上传人:yx****d 文档编号:243370586 上传时间:2024-09-21 格式:PPT 页数:20 大小:48KB
返回 下载 相关 举报
实验六 Windows 2000虚拟内存_第1页
第1页 / 共20页
实验六 Windows 2000虚拟内存_第2页
第2页 / 共20页
实验六 Windows 2000虚拟内存_第3页
第3页 / 共20页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,实验六 Windows 2000虚拟内存,1,一、背景知识,在Windows 2000环境下,4GB的虚拟地址空间被划分成两个部分:低端2GB提供给进程使用,高端2GB提供给系统使用。这意味着用户的应用程序代码,包括DLL以及进程使用的各种数据等,都装在用户进程地址空间内 (低端2GB) 。,2,用户过程的虚拟地址空间也被分成三部分:,1) 虚拟内存的已调配区 (committed) :具有备用,的物理内存,根据该区域设定的访问权限,用户,可以进行写、读或在其中执行程序等操作。,2) 虚拟内存的保留区 (reserved) :没有备用的,物理内存,但有一定的访问权限。,3) 虚拟内存的自由区 (free) :不限定其用途,有,相应的PAGE_NOACCESS权限。,3,与虚拟内存区相关的访问权限告知系统进程可在内存中进行何种类型的操作。例如,用户不能在只有PAGE_READONLY权限的区域上进行写操作或执行程序;也不能在只有PAGE_EXECUTE权限的区域里进行读、写操作。而具有PAGE_ NOACCESS权限的特殊区域,则意味着不允许进程对其地址进行任何操作。,在进程装入之前,整个虚拟内存的地址空间都被设置为只有PAGE_NOACCESS权限的自由区域。当系统装入进程代码和数据后,才将内存地址的空间标记为已调配区或保留区,并将诸如EXECUTE、READWRITE和READONLY的权限与这些区域相关联。,4,表6-l的数据描述了进程虚拟内存空间中一组虚拟内存页面的当前状态。其中State项表明这些区域是否为自由区、已调配区或保留区;Protect项则包含了Windows系统为这些区域添加了何种访问保护;Type项则表明这些区域是可执行图像、内存映射文件还是简单的私有内存。VirtualQueryEX() API能让用户在指定的进程中,对虚拟内存地址的大小和属性进行检测。,5,Windows还提供了一整套能使用户精确控制应用程序的虚拟地址空间的虚拟内存API。,6,表6-1 MEMORY_BASIC_INFORMATION结构的成员,成员名称,目的,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_RESERVE,DWORD Protect,虚拟内存当前区域的保护属性。可能值与AllocationProtect成员的相同,DWORD Type,虚拟内存区域中出现的页面类型。可能值为MEM_IMAGE, MEM_MAPPED和MEM_PRIVATE,7,表6-2 虚拟内存的API,API名称,描述,VirtualQueryEx(),通过填充MEMORY_BASIC_INFORMATION结构检测进程内虚拟内存的区域,VirtualAlloc(),保留或调配进程的部分虚拟内存,设置分配和保护标志,VirtualFree(),释放或收回应用程序使用的部分虚拟地址,VirtualProtect(),改变虚拟内存区域保护规范,VirtualLock(),防止系统将虚拟内存区域通过系统交换到页面文件中,VirtualUnlock(),释放虚拟内存的锁定区域,必要时,允许系统将其交换到页面文件中,8,提供虚拟内存分配功能的是VirtualAlloc() API。该API支持用户向系统要求新的虚拟内存或改变已分配内存的当前状态。用户若想通过VirtualAlloc() 函数使用虚拟内存,可以采用两种方式通知系统:,9,1) 简单地将内存内容保存在地址空间内;,2) 请求系统返回带有物理存储区 (RAM的空间或换页文件) 的部分地址空间。,10,用户可以用flAllocation Type参数 (commit和reserve) 来定义这些方式,用户可以通知Windows按只读、读写、不可读写、执行或特殊方式来处理新的虚拟内存。,与VirtualAlloc() 函数对应的是VirtualFree() 函数,其作用是释放虚拟内存中的已调配页或保留页。用户可利用dwFree Type参数将已调配页修改成保留页属性。,VirtualProtect() 是VirtualAlloc() 的一个辅助函数,利用它可以改变虚拟内存区的保护规范。,11,二、实验目的,1) 通过实验了解Windows 2000内存的使用,,学习如何在应用程序中管理内存,体会Windows,应用程序内存的简单性和自我防护能力。,2) 学习检查虚拟内存空间或对其进行操作;,3) 了解Windows 2000的内存结构和虚拟内存,的管理,进而了解进程堆和Windows为使用内存,而提供的一些扩展功能。,12,三、实验内容与步骤,1、虚拟内存的检测,/ 工程vmwalker,# include ,# include ,# include ,# include ,# pragma comment(lib, Shl),/ 以可读方式对用户显示保护的辅助方法。,/ 保护标记表示允许应用程序对内存进行访问的类型,/ 以及操作系统强制访问的类型,inline bool TestSet(DWORD dwTarget, DWORD dwMask),return (dwTarget ,# define SHOWMASK(dwTarget, type) ,if (TestSet(dwTarget, PAGE_#type) ) ,std : cout , #type; ,void ShowProtection(DWORD dwTarget),SHOWMASK(dwTarget, READONLY) ;,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, NOACCESS) ;,13,/ 遍历整个虚拟内存并对用户显示其属性的工作程序的方法,void WalkVM(HANDLE hProcess),/ 首先,获得系统信息,SYSTEM_INFO si;,: ZeroMemory(,: GetSystemInfo(,/ 分配要存放信息的缓冲区,MEMORY_BASIC_INFORMATION mbi;,: ZeroMemory(,/ 循环整个应用程序地址空间,LPCVOID pBlock = (LPVOID) si.lpMinimumApplicationAddress;,while (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_PATH) ;,14,/ 显示块地址和大小,std : 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 Reserved ;,break;,/ 显示保护,if (mbi.Protect=0 & mbi.State!=MEM_FREE),mbi.Protect=PAGE_READONLY;,ShowProtection(mbi.Protect);,/ 显示类型,switch (mbi.Type),case MEM_IMAGE:,std : cout , Image ;,break;,case MEM_MAPPED:,std : cout , Mapped ;,break;,case MEM_PRIVATE:,std : cout 0) / 实际使用的缓冲区大小,/ 除去路径并显示,: PathStripPath(sz) ;,std : cout , Module: sz;,std : cout std : endl;,/ 移动块指针以获得下一下个块,pBlock = pEnd;,void main(),/ 遍历当前进程的虚拟内存,:WalkVM(:GetCurrentProcess();,16,运行程序,查看结果。,17,2、虚拟内存操作,/ 工程largealloc,# include ,# include ,/ 尝试以指定长度的零数字填充内存块的简便方法,void FillZero(LPVOID pBlock, DWORD dwSize),_try,BYTE* arFill = (BYTE *) pBlock;,for (DWORD dwFill = 0; dwFill dwSize; +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, c_dwMegabyte) ;,: free(pBlock) ;,18,/ 使用虚拟分配以获得物理1GB块,LPVOID pBlock = : VirtualAlloc(,NULL,/ 不指定起始地址,c_dwGigabyte,/ 要求1GB,MEM_COMMIT, / 调配物理存储,PAGE_READWRITE) ;/ 对此的读写操作,: FillZero(pBlock, c_dwMegabyte) ;,: VirtualFree(pBlock, 0, MEM_RELEASE) ;,/ 使用虚拟分配以获得虚拟1GB块,LPVOID pBlock = : VirtualAlloc(,NULL,/ 不指定起始地址,c_dwGigabyte,/ 要求1GB,MEM_RESERVE,/ 不调配物理存储,PAGE_READWRITE) ;/ 对此的读写操作,: FillZero(pBlock, c_dwMegabyte) ;,: VirtualFree(pBlock, 0, MEM_RELEASE) ;,/ 使用虚拟分配调配获得虚拟1GB块,再为其调配1MB物理存储,LPVOID pBlock = : VirtualAlloc(,NULL,/ 不指定起始地址,c_dwGigabyte,/ 要求1GB,MEM_RESERVE,/ 不调配物理存储,PAGE_READWRITE) ;/ 对此的读写操作,: VirtualAlloc(,pBlock,c_dwMegabyte,MEM_COMMIT,PAGE_READWRITE) ;,: FillZero(pBlock, c_dwMegabyte) ;,: VirtualFree(pBlock, 0, MEM_RELEASE) ;,19,利用VirtualLock() API,Windows可用来在自己的进程空间中控制虚拟内存的行为。这个函数与其成对的VirtualUnlock() 阻止或允许一块内存从物理RAM中换页和换页到页面文件中。这样就会通知系统有一段特定的内存区要求对用户作出强烈的响应,所以系统不应将其移出RAM。当然,如果要将整个虚拟内存空间锁定,系统就会停留于试图将系统中工作内存的每一小块换页到磁盘。,20,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!