0

标题说几乎所有:有没有办法在Windows下获得最低空闲虚拟内存地址?我应该补充说,我对程序开始时的这些信息感兴趣(在动态内存分配完成之前)。在窗口中获取最低空闲虚拟内存地址

为什么我需要它:试图在Windows下构建一个malloc实现。如果这是不可能的,那么当给予NULL作为第一个参数时,我将不得不真的对VirtualAlloc()返回任何东西。虽然你会期望它做一些明智的事情,比如分配内存在可用的底部,但是没有保证。

+0

为什么malloc实现需要这些信息? – 2010-07-08 18:36:03

+0

如果在某个时候我必须做出非常大的分配,那么以前分配给地址空间的低端比在中间分配更好。另外,它可以最大化VirtualAlloc()调用获得的页面之后的页面也是免费的,并且可以通过将来对VirtualAlloc()的调用获得,从而有助于防止分段。 – Norswap 2010-07-08 19:27:51

回答

2

这可以通过使用VirtualQuery寻找标记为空闲的页面来实现。虽然这会比较慢。 (您还需要考虑与页面大小不同的分配粒度)。

我会说,除非需要连续的内存块,否则尝试将所有内容紧密放在一起几乎没有意义,因为如果两页虚拟内存可能在地址空间中彼此相邻,没有理由认为它们在物理内存中彼此接近。事实上,即使它们在某个时间点彼此靠近,如果这些页面移动到后台存储并且然后故障回到内存中,页面也不会出现到相同的物理地址页面。

0

操作系统使用更复杂的指标,而不仅仅是可用的“最低”内存地址。具体来说,VirtualAlloc分配内存页面,所以根据您要求的数量,至少有一页未使用的地址空间必须在起始地址可用。因此,即使您认为应该使用“较低”的地址,该地址也可能与您要求的操作不兼容。

+0

我知道这一切。实际上最低的空闲地址是最低的空闲页地址,但由于没有分配动态内存,下面的页面也应该是空闲的(DLL除外,但是这些页面往往是地址空间IIRC的顶部)。 – Norswap 2010-07-08 19:31:07