使用大内存区域时Windows Mobile上的总计和分配堆

时间:2010-02-11 05:13:38

标签: windows-mobile memory-management

我有一个Windows Mobile 6.1应用程序,它不仅可以从32MB进程空间分配内存,还可以从大内存区域分配内存 - LMA(插槽60及以上)。

MEMORYSTATUS结构只给出了32MB进程槽的内存使用信息。有没有办法在使用LMA时计算应用程序从系统和分配堆中可用的总堆?

1 个答案:

答案 0 :(得分:0)

使用VirtualQuery遍历LMA中的每个区块。如果块未标记为MEM_FREE,则将其大小添加到已使用的总数中。

为了计算特定进程使用的内存,我做了类似的事情:

MEMORY_BASIC_INFORMATION mbi = { 0 };

/// total free memory available to the process
DWORD free = 0;

/// base memory address for the given process index (2-33). 
DWORD slot_base_addr = process_index * 0x02000000;

/// look at each memory region for the process. 
for( DWORD offset = 0x10000; 
    offset < 0x02000000; 
    offset += mbi.RegionSize )
{
    ::VirtualQuery( ( void* )( slot_base_addr + offset ), 
        &mbi, 
        sizeof( MEMORY_BASIC_INFORMATION ) );

    if( mbi.State == MEM_FREE )
    {
        free += ( mbi.RegionSize - ( ( ~( DWORD )mbi.BaseAddress + 1 ) & 0xffff ) ) & 0xffff0000;
    }
}

只需将for - 循环中的地址调整为LMA,它就可以正常工作。

-PaulH