2010-02-11 47 views
2

我有一个Windows Mobile 6.1应用程序,它不仅从32MB进程空间分配内存,还从大内存区域LMA(插槽60及以上)分配内存。使用大内存区域时在Windows Mobile上的总计和分配的堆

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

回答

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 -loop到LMA,它应该工作。

-PaulH