关于Windows API - VirtualAlloc

最近在从事Driver的相关工作,碰到一个Windows API - VirtualAlloc。以前看到这样的API,便匆匆扫过,知道大概功能后便不去深究。今晚突然兴致来了,准备好好看下这个API.

1. 函数功能:在调用进程的虚地址空间,预定或者提交一部分页
如果用于内存分配的话,并且分配类型未指定MEM_RESET,则系统将自动设置为0;

2. 函数声明:VirtualAlloc的声明是在WinBase.h文件中,

WINBASEAPI
__bcount_opt(dwSize)
LPVOID
WINAPI
VirtualAlloc(
    __in_opt LPVOID lpAddress,
    __in     SIZE_T dwSize,
    __in     DWORD flAllocationType,
    __in     DWORD flProtect
    );

 

3. 函数参数:

(1) LPVOID             lpAddress,      分配内存区域的地址。当你使用VirtualAlloc来提交一块以前保留的内存块的时候,lpAddress参数可以用来识别以前保留的内存块。如果这个参数是NULL,系统将会决定分配内存区域的位置,并且围绕64-KB的范围。
(2) SIZE_T               dwSize,           要分配或者保留的区域的大小。这个参数以字节为单位,而不是页,系统会根据这个大小一直分配到下页的边界。

(3) DWORD             flAllocationType,  分配类型 ,你可以指定或者合并以下标志:MEM_COMMIT,MEM_AUTO_COMMIT,MEM_RESERVE和MEM_TOP_DOWN。
(4) DWORD             flProtect          指定了被分配区域的访问保护方式。

关于参数(3)(4),说明下:

分配类型(参数3)意义
MEM_COMMIT 在内存或者指定的磁盘页文件(虚拟内存文件)中分配一物理存储区域 函数初始化这个区域为0
MEM_PHYSICAL 该类型必须和MEM_RESERVE一起使用 分配一块具有读写功能的物理内存区
MEM_RESERVE 保留虚拟地址空间以便以后提交
MEM_RESET 
MEM_TOP_DOWN告诉系统从最高可允许的虚拟地址开始映射应用程序
MEM_WRITE_WATCH 


访问类型(参数4)意义
PAGE_READONLY该区域为只读。如果应用程序试图访问区域中的页的时候,将会被拒绝访问
PAGE_READWRITE 区域可被应用程序读写
PAGE_EXECUTE区域包含可被系统执行的代码。试图读写该区域的操作将被拒绝
PAGE_EXECUTE_READ区域包含可执行代码,应用程序可以读该区域
PAGE_EXECUTE_READWRITE区域包含可执行代码,应用程序可以读写该区域
PAGE_GUARD区域第一次被访问时进入一个STATUS_GUARD_PAGE异常,这个标志要和其他保护标志合并使用,表明区域被第一次访问的权限
PAGE_NOACCESS任何访问该区域的操作将被拒绝
PAGE_NOCACHERAM中的页映射到该区域时将不会被微处理器缓存(cached)

注:PAGE_GUARD和PAGE_NOCHACHE标志可以和其他标志合并使用以进一步指定页的特征。PAGE_GUARD标志指定了一个防护页(guardpage),即当一个页被提交时会因第一次被访问而产生一个one-shot异常,接着取得指定的访问权限。PAGE_NOCACHE防止当它映射到虚拟页的时候被微处理器缓存。这个标志方便设备驱动使用直接内存访问方式(DMA)来共享内存块。

4. 函数返回值:

如果调用成功,返回分配的首地址,
调用失败,返回NULL  你可以通过GetLastError函数来获取错误信息

5. 拓展:

(1) VirtualAlloc可以通过并行多次调用提交一个区域的部分或全部来保留一个大的内存区域。多重调用提交同一块区域不会引起失败。这使得一个应用程序保留内存后可以随意提交将被写的页。当这种方式不在有效的时候,它会释放应用程序通过检测被保留页的状态看它是否在提交调用之前已经被提交.

(2) 虚拟内存分配可以作为程序里分配内存的主要方式,比如大量的数据缓冲区,动态分配内存的空间。

(3) 使用VirtualAlloc函数来分配内存的速度要比全局内存GlobalAlloc()要快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值