您的位置:首页 > 产品设计 > UI/UE

用VMQuery查询虚拟地址空间(虚拟内存)的使用情况

2010-09-13 01:36 337 查看
        虚拟地址空间,是指进程的可编程地址空间。对于32位系统,这个空间是4G。默认情况下,用户可以使用低地址的2G,高地址的2G是操作系统使用。虚拟地址空间也可以叫虚拟内存,但不能和系统设置中的设置虚拟内存(也叫页交换文件)大小,搞混了。有些名词在出现在不同的地方,其含义是完全不同,最好是用有区分的叫法。

      虚拟地址空间的使用,需要两个步骤。第一,预留。第二,提交。预留会预定一块虚拟地址空间,当并不分配物理存储器。提交时才会真正分配物理存储器。通过VirtualAlloc函数实现这两个操作。预留虚拟地址空间时,起始地址必须是分配粒度(64Kb)的整数倍,大小必须是页面大小(4kb)的整数倍。

      通过VirtualQueryEx函数可以查询虚拟内存的状态。其中有一个“块”的概念,块是指具有相同属性的相邻的页面。VirtualQueryEx返回的结构体 MEMORY_BASIC_INFORMATION,成员含义如下:

      BaseAddress 这个地址是参数pvAddress(传递给VirtualQueryEx的参数,表示要查询的地址)向下取整得到的页面大小。我认为这个地址不一定是区域起始地址,也不一定是块的起始地址。

      AllocationBase 区域基地址。但是当块空间是Free型时,这个成员通常是0x0。也是合理的,既然是Free,就不能说是属于某个区域了。

      RegionSize 块大小。英文上叫区域大小,其实是块大小,而且从参考资料上看,这个大小是指从BaseAddress开始到块结束的大小,还不是严格意义上的块大小,因为上面说了,BaseAddress不一定就是块的起始地址。

      其余的几个成员,就没什么歧义了,直接看msdn或windows核心编程,解释的都很清楚了。从上面可以看出VirtualQueryEx是不能直接取到区域大小,甚至是严格意义上的块大小的。

      windows核心编程中的自定义VMQuery函数,计算区域大小啊,是从每个区域起始地址(这个地址是从0x0开始,不断加上来的)开始,用系统的VirtualQueryEx取每个块的大小,如果该块的区域基地址(AllocationBase成员)等于此区域起始地址,就加入区域的大小中。这样不断向高地址计算,才得出整个进程的虚拟地址空间使用情况的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows 编程 basic 存储