我有一个Windows Mobile 6.1应用程序,它不仅可以从32MB进程空间分配内存,还可以从大内存区域分配内存 - LMA(插槽60及以上)。
MEMORYSTATUS结构只给出了32MB进程槽的内存使用信息。有没有办法在使用LMA时计算应用程序从系统和分配堆中可用的总堆?
答案 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