Непрерывный кусок памяти.

Тема в разделе "WASM.WIN32", создана пользователем asmfan, 8 май 2007.

  1. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Задача - выделить максимальный непрерывный кусок памяти юзермодного пространства.
    Очевидное решение:
    Код (Text):
    1.         sub     esp,sizeof.MEMORYSTATUS
    2.         mov     [esp+MEMORYSTATUS.dwiLength],sizeof.MEMORYSTATUS
    3.  
    4.         invoke  GlobalMemoryStatus,esp
    5.  
    6.         mov     esi,[esp+MEMORYSTATUS.dwAvailVirtual]
    7.         add     esp,sizeof.MEMORYSTATUS
    8. @@:
    9.         invoke  VirtualAlloc,ebx,esi,MEM_RESERVE OR MEM_COMMIT,PAGE_READWRITE
    10.         sub     esi,1024*1024 ;мегабайтная граница куска памяти
    11.         test    eax,eax
    12.         jz      @B
    13.  
    14.         add     esi,1024*1024
    15.         mov     [_size],esi
    16.         invoke  VirtualFree,eax,ebx,MEM_RELEASE
    Есть ли более элегантное решение?
    //аттач - грубая мерилка скорости (ПСП) памяти. (треба SSE/SSE2)
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    asmfan
    пробежатся по карте памяти, найти максимальные регион.
     
  3. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    В смысле VirtualQuery? Это тоже ж перебор, тока еще и сравнения там будут (сортировка).
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    asmfan
    ну дак сравнил, либо выделение памяти, либо запрос.
     
  5. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Суть в том, что заранее то база выделения неизвестна, а если слать запросы на свободную память - то придётся перебирать все возможные адреса размещения памяти и при этом смотреть размеры кусков. А VirtualAlloc сама базу ищет.
    [added]
    В принципе достаточно флага MEM_RESERVE в VirtualAlloc.