关闭

《Windows核心编程系列》谈谈在应用程序中使用虚拟内存

发表于:2013-1-08 09:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ithzhang    来源:51Testing软件测试网采编

  系统信息

  操作系统的许多值是由系统所运行的主机决定的,如页面大小和分配粒度。使用GetSystemInfo可以获得与主机有关的值:

VOID GetSystemInfo(LPSYSTEM_INFO psi);

SYSTEM_INFO结构定义如下:

typedef struct _SYSTEM_INFO{

    union{

                 struct  {

                              WORD wProcessorArchitecture;

                              WORD wReserved;

                           };
           };
    DWORD dwPageSize;

    LPVOID lpMinimumApplicationAddress;

    LPVOLID lpMaximumApplicationAddress;

    DWORD_PTR dwActiveProcessorMask;

    DWORD dwNumberOfProcessor;

    DWORD dwProcessorType;

    DWORD dwAllocationGranularity;

    WORD wProcessorLevel;

    WORD wProcessorRevision;

}SYSTEM_INFO,*LPSYSTEM_INFO;

  上述这么多成员只有四个与内存有关。

  dwPageSize表示cpu页面大小在x86和x64机器中,该值为4K。

  lpMinimumApplicationAddress给出进程中可用地址空间最小的内存地址。由于每个进程地址空间最开始的64K是闲置的,因此该值为64K。

  lpMaximumApplicationAddress给出每个进程私有地址空间中最大的

  可用内存地址。

  dwAllocationGranularity表示用于预定地址空间区域的分配粒度

  其他的成员稍微做下介绍:

  wReserved为今后拓展保留,不要使用。

  dwNumOfProcessor机器cpu的数量。

  dwActiveProcessorMask位掩码,用来表示哪些cpu处于活动状态。可以用来运行线程。

  dwProcessorType已经作废。不再使用。

  wProcessorArchitecture表示处理器的体系结构。如x86,x64;

  wProcessorLevel进一步细分处理器的体系结构,比如Intel奔腾2或奔腾4.

  wProcessorRevision进一步对wProcessLevel进行细分。

  //以下代码演示了可重置内存及以上介绍的各个函数的使用。

#include"windows.h"
#include<iostream>
#include"tchar.h"
TCHAR TextData[]=TEXT("c:\Users\yangyang\documents\visual studio 2010\Projects\MEM_RESET\MEM_RESET\main.cppc:\Users\yangyang\documents\visual studio 2010\Projects\MEM_RESET\MEM_RESET\main.cpp");
int main(int argc,char**argv)
{
 
 PTSTR pszData=(PTSTR)VirtualAlloc(NULL,1024,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
 if(pszData==NULL)
 {
  MessageBox(NULL,TEXT("分配失败"),TEXT(""),MB_OK);
 }
 _tcscpy_s(pszData,1024,TextData);
 int ret=MessageBox(NULL,TEXT("以后是否还要访问该段内存?"),TEXT(""),MB_YESNO);
 if(ret==IDNO)
 {
  MEMORY_BASIC_INFORMATION mbi;
  VirtualQuery(pszData,&mbi,sizeof(mbi));
  VirtualAlloc(pszData,mbi.RegionSize,MEM_RESET,PAGE_READWRITE);
 }

 MEMORYSTATUS mst;
 GlobalMemoryStatus(&mst);
 PVOID pvAddress=VirtualAlloc(NULL,mst.dwAvailVirtual,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
 if(pvAddress)
 {
  ZeroMemory(pvAddress,mst.dwAvailVirtual);
 }
 if(!_tcscmp(TextData,pszData))
 {
  MessageBox(NULL,TEXT("已经保存!"),TEXT(""),MB_YESNO);
 }
 else
 {
  MessageBox(NULL,TEXT("未保存!"),TEXT(""),MB_YESNO);
 }
 getchar();
 VirtualFree(pvAddress,0,MEM_RELEASE);
 VirtualFree(pszData,0,MEM_RELEASE);
 return 0;
}

相关链接:

《Windows核心编程系列》谈谈Windows钩子

《Windows核心编程系列》谈谈内核对象及句柄的本质

《Windows核心编程系列》谈谈基址重定位和模块绑定

《Windows核心编程系列》谈谈修改导入段拦截API

《Windows核心编程系列》谈谈进程的建立和终止

《Windows核心编程系列》谈谈内存映射文件

《Windows核心编程系列》谈谈用户模式下的线程同步

44/4<1234
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号