Хранение малых размеров данных в нестраничной памяти, в ядре

Тема в разделе "WASM.A&O", создана пользователем SteelRat, 4 июл 2005.

  1. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Есть задача хранить данные, размером по 192 байта, которые приходят в драйвер (DeviceIoControl). Данные храняться в неподкачиваемом пуле. Естественно могу выделяить память (ExAllocatePool) но память выделяется размером в 1-у страницу (4 кб.) - не экономно, тем более в ядре. Сколько "кусков" придет в драйвер не известно. Есть мысли как правильно поступить и экономно расходовать память? Или какой-то алгоритм работы в данной ситуации ?
     
  2. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    А разве при выделении меньше страницы ExAllocatePool выделяет целую страницу?

    Из MSDN:


    Вроде как, система умудряется впихать несколько буферов в страницу...
     
  3. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Может свой минименеджер памяти написать. Например, пространство выделенной страницы, организуется как массив из 21 элементов по 192 байта, плюс массив из 21 однобайтных значений сигнализирующих какие элементы выделены. При фиксированном размере блока, имхо их лучше всегда выделять массивами - например если с помощью malloc попытаться выделить под переменную 4 байта, всего будет захвачено порядка 40-50 байт, из которых только 4 доступны.
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ядерная куча организована в виде нескольких ассоциативных списков разного размера, хранящихся в структуре KPCR:


    Код (Text):
    1. kd> !kdex2x86.strct KPCR
    2. struct   _KPCR (sizeof=2832)
    3. . . .
    4. +620    struct   _PP_LOOKASIDE_LIST PPLookasideList[16]
    5.            struct   _NPAGED_LOOKASIDE_LIST *P
    6.            struct   _NPAGED_LOOKASIDE_LIST *L
    7. +6a0    struct   _PP_LOOKASIDE_LIST PPNPagedLookasideList[8]
    8.            struct   _NPAGED_LOOKASIDE_LIST *P
    9.            struct   _NPAGED_LOOKASIDE_LIST *L
    10. +6e0    struct   _PP_LOOKASIDE_LIST PPPagedLookasideList[8]
    11.            struct   _NPAGED_LOOKASIDE_LIST *P
    12.            struct   _NPAGED_LOOKASIDE_LIST *L
    13. . . .
    14. kd>


    При вызове ExAllocatePoolXxx система смотрит запрашиваемый размер, если он подходит под один из списков, то оттуда и выделяется память (+небольшой оверхед на управляющую информацию). Если запрашиваемый размер больше самого большого из ассоциативных списков, то тогда уже выделение идет страницами.