Общая и выделенная куча в Windows Mobile при использовании большой области памяти - PullRequest
2 голосов
/ 11 февраля 2010

У меня есть приложение для Windows Mobile 6.1, которое выделяет память не только из пространства процесса 32 МБ, но и из области большой памяти - LMA (слот 60 и выше).

Структура MEMORYSTATUS дает мне информацию об использовании памяти только 32 МБ слота процесса. Есть ли способ вычислить общую кучу, доступную из системы, и выделенную кучу приложением, когда используется LMA?

1 Ответ

0 голосов
/ 13 января 2011

Используйте 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...