VirtualAlloc是一个Windows API函数,它包含在windows
系统文件Kernel32.dll中,编程时直接使用就可以了,不需要再下载。
该函数的功能是在调用进程的虚地址空间,预定或者提交一部分页
如果用于内存分配的话,并且分配类型未指定MEM_RESET,则系统将自动设置为0;
分配类型 也可以是下列值
访问类型
PAGE_READONLY 该区域为只读。如果应用程序试图访问区域中的页的时候,将会被拒绝访问PAGE_READWRITE 区域可被应用程序读写
PAGE_EXECUTE 区域包含可被系统执行的代码。试图读写该区域的操作将被拒绝。
PAGE_EXECUTE_READ 区域包含可执行代码,应用程序可以读该区域。
PAGE_EXECUTE_READWRITE 区域包含可执行代码,应用程序可以读写该区域。
PAGE_GUARD 区域第一次被访问时进入一个STATUS_GUARD_PAGE异常,这个标志要和其他保护标志合并使用,表明区域被第一次访问的权限
PAGE_NOACCESS 任何访问该区域的操作将被拒绝
PAGE_NOCACHE RAM中的页映射到该区域时将不会被微处理器缓存(cached)
注:PAGE_GUARD和PAGE_NOCHACHE标志可以和其他标志合并使用以进一步指定页的特征。PAGE_GUARD标志指定了一个防护页(guard page),即当一个页被提交时会因第一次被访问而产生一个one-shot异常,接着取得指定的访问权限。PAGE_NOCACHE防止当它映射到虚拟页的时候被微处理器缓存。这个标志方便
设备驱动使用直接内存访问方式(DMA)来共享内存块。
VC声明
LPVOID VirtualAlloc( LPVOID lpAddress, // region to reserve or commit SIZE_T dwSize, // size of region DWORD flAllocationType, // type of allocation DWORD flProtect // type of access protection );说明
该函数的功能是在调用进程的虚地址空间,预定或者提交一部分页如果用于内存分配的话,并且分配类型未指定MEM_RESET,则该内存自动被初始化为0; 参数表说明 LPVOID lpAddress, 分配内存区域的地址。当你使用VirtualAlloc来提交一块以前保留的内存块的时候,lpAddress参数可以用来识别以前保留的内存块。如果这个参数是NULL,系统将会决定分配内存区域的位置,并且按64-KB向上取整(roundup)。
SIZE_T dwSize, 要分配或者保留的区域的大小。这个参数以字节为单位,而不是页,系统会根据这个大小一直分配到下页的边界DWORD flAllocationType, 分配类型 ,你可以指定或者合并以下标志:MEM_COMMIT,MEM_RESERVE和MEM_TOP_DOWN。 DWORD flProtect 指定了被分配区域的访问保护方式 分配类型 功能可能的数值 | 含义 |
---|---|
MEM_COMMIT为0x1000 | 分配指定保留的内存页的物理存储在内存或磁盘上的分页文件。该函数的内存初始化为零。 保留并承诺在一个步骤的页面,调用VirtualAlloc 的MEM_COMMIT | MEM_RESERVE 。 该函数将失败,如果你尝试提交一个还没有被保留页。由此产生的错误代码是ERROR_INVALID_ADDRESS。 尝试提交一个已经提交的页面不会导致函数失败。这意味着你可以承诺不首先确定当前承诺在每一页的状态页面。 |
MEM_RESERVE0x2000 | 保留在没有任何实际的物理存储在内存或磁盘上的分页文件分配一个进程的虚拟地址空间的范围。 你可以提交保留页的后续调用 VirtualAlloc的功能。保留并承诺在一个步骤的页面,调用VirtualAlloc 的 MEM_COMMIT | MEM_RESERVE 。 内存分配的功能,如其他的malloc和 LocalAlloc,不能使用的内存保留的范围,直到它被释放 。 |
MEM_RESET0x80000 | 表示,在所指定的内存范围内的数据lpAddress的dwSize不再是利益。页面不应该被读出或写入到分页文件。然而,将再次使用的内存块后,所以它不应该decommitted的 。这个值不能使用任何其他的价值 。 使用这个值并不保证范围与经营MEM_RESET将包含零。如果你想的范围包含零,decommit内存,然后将它重新作出 。 当您指定MEM_RESET, VirtualAlloc函数忽略了价值flProtect。但是,您仍然必须设置flProtect有效的保护价值,比如,PAGE_NOACCESS。 VirtualAlloc的返回一个错误,如果你使用 MEM_RESET的内存范围映射到一个文件 。如果它被映射到分页文件共享视图是唯一可以接受的的 。 |
可能的数值 | 含义 |
---|---|
MEM_LARGE_PAGES0x20000000的 | 分配内存使用大页面支持。 大小和对齐必须是一个大页面的最低多个 。要获得这个值,使用 GetLargePageMinimum的功能 。 |
MEM_PHYSICAL0x400000 | 储备的地址范围,可用于地图地址窗口扩展(AWE)的网页。 此值必须使用MEM_RESERVE,并没有其他值。 |
MEM_TOP_DOWN0x100000 | 在尽可能高的地址分配内存。这可以比普通的拨款速度较慢,尤其是当有许多分配。 |
MEM_WRITE_WATCH0x200000 | 导致系统来跟踪分配的地区,都写在网页 。如果指定此值,则还必须指定MEM_RESERVE。 要检索的网页已写入,因为该地区被分配或写跟踪状态被重置地址,调用 GetWriteWatch功能。要重置写跟踪状态,调用GetWriteWatch或 ResetWriteWatch。写跟踪功能仍然启用,直到该地区被释放的内存区域。 |