1. Window提供了一下三种机制来对内存进行操控:
◆ 虚拟内存:最适合用来管理大型对象数组或大型结构数组
◆ 内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据
◆ 堆:最适合用来管理大量的小型对象
预定地址空间区域:
PVOID VirtualAlloc(
PVOID pvAddress,//内存地址(即我们需要使用那块内存,只需传入NULL即可)
SIZE_T dwSize, //以字节为单位的区域大小(CPU页面大小的整数倍)
DWORD fdwAllocationType,//预定区域或调拨物理存储器,前者为MEM_RESERVE
DWORD fdwProtect); //指定区域的保护属性
注意:可以使用MEM_TOP_DOWN标志来指定系统分配的空间是从顶部开始的.另外,我们传给pvAddress必须始终存在于用户模式分区中,否则函数会调用失败并返回NULL.
调拨物理内存:使得fdwAllocationType为MEM_COMMIT.如果同时存在MEM_COMMIT和MEM_RESERVE两个标志,则表示同时预定和调拨物理存储器
为系统使用大页面的整数倍空间:SIZE_T GetLargePageMinimum();//如果CPU不支持大页面,则返回0,同时使fdwProtect取值MEM_LAGE_PAGE标志,此外需要满足:
◆ 要分配的内存块的大小为GetLargeMinimum整数倍
◆ 在调用VirtualAlloc时,必须把MEM_RESERVE|MEM_COMMIT与fdwAllocationType参数按位或.
◆ 在用VirtualAlloc分配内存时必须传PAGE_READWRITE给fdwProtect.
撤销物理存储器及释放区域:
BOOL VirtualFree(
LPVOID pvAddress,
SIZE_T dwSize,//必须为0(撤销pvAddress标示的所有页面)
DWORD fdwFreeType);//必须为MEM_RELEASE
如果撤销部分区域则依次传:需撤销调拨第一个页面地址、释放区域的大小、MEM_DECOMMIT.
改变内存页面的保护属性:
BOOL VirtualProtect(
PVOID pvAddress,//需要改变的内存基址
SIZE_T dwSize,//内存大小
DWORD flNewProtect,//保护属性的区域大小(字节为单位)除PAGE_WRITECOPY和 //PAGE_EXECUTE_WRITECOPY之外的任何属性
PDWORD pflOldProtect)//_out:原来的属性
在使用VirtualAlloc重置(fdwAllocationType为MEM_RESET)时,系统为了确保所重置的页面不牵涉到有效数据,它将使得页面大小向下取整的块重置.另外MEM_RESET只能被单独使用它.
分配物理储存器:(也就是说,把应用和程序的某块地址一直放在内存中).
BOOL AllocateUserPhysicalPages(
HANDLE hProcess,
PULONG_PTR pulRAMPages,//分配内存页的数量(_in,_out)
PULONG_PTR aRAMPages);//页框号(对我们基本没什么用).
将内存块指定给地址窗口:(映射内存块)
BOOL MapUserPhysicalPages(
PVOID pvAddressWindow,//地址窗口的虚拟地址
ULONG_PTR ulRAMPages, //可使用的多少页面内存
PULONG_PTR aRAMPages);//
释放该窗口虚拟地址:
BOOL FreeUserPhysicalPages(
HANDLE hProcess,
PULONG_PTR pulRAMPages,
PULONG_PTR aRAMPages);