Конференция "WinAPI" » Работа с памятью в Kernel-mode.
 
  • Riply © (12.09.08 14:43) [0]
    Здравствуйте !
    Допустим нам надо часто выделять/освобождать небольшие
    кусочки памяти разного размера в Kernel-mode.
    Какие функции работы с памятью лучше взять за основу ?
    Пока есть два кандидата: ExAllocatePoolWithTag и MmAllocateNonCachedMemory.
    (LookasideList не очень подходит, т.к. кусочки разного размера)
    С ними мне все не очень понятно. С одной стороны MSDN гласит:
    To allocate I/O buffer space, the best memory allocation routines to use are MmAllocateNonCachedMemory,
    MmAllocateContiguousMemorySpecifyCache, ... or ExAllocatePoolWithTag.

    С другой, в описании MmAllocateNonCachedMemory есть такие строки:
    A device driver that must use noncached memory should allocate only what it needs
    during driver initialization because nonpaged pool is likely to
    become fragmented as the system runs. Such a driver must deallocate the memory if it is unloaded.

    В совокупности я это поняла так: лучше использовать наших кандидатов, но однократно :)
    А как быть с кусочками памяти, необходимыми на короткое время в ходе работы ?
    Например, Rtl-функции, работающие со строками, что используют для работы с памятью в режиме ядра ?
    (В юзер моде они используют Rtl-Heap функции).
    Может выбрать тоже, что и они ?
  • Rouse_ © (12.09.08 14:50) [1]
    А зачем выделять и освобождать? Выдели сразу необходимый кусок и работай с ним...
  • Riply © (12.09.08 16:12) [2]
    > [1] Rouse_ ©   (12.09.08 14:50)
    > А зачем выделять и освобождать? Выдели сразу необходимый кусок и работай с ним...

    Эт, конечно верно...
    Но очень бы хотелось понять: как поступают в таких случаях и почему,
    да и иметь возможность самой поуправлять памятью в течении жизни драйвера, когда приспичит :)
  • Rouse_ © (12.09.08 16:35) [3]

    > Но очень бы хотелось понять: как поступают в таких случаях
    > и почему,

    Для частого выделения-освобождения памяти обычно применяют Lookaside списки. См. ExInitializeNPagedLookasideList и все что с ним связано, а вообще найди книжку O`Reilly под названием "Building NT File System Drivers". Там много интересного есть.
  • Rouse_ © (12.09.08 16:54) [4]
    Вот тебе кстати хороший примерчик: http://www.wasm.ru/article.php?article=drvw2k16
  • Rouse_ © (12.09.08 17:10) [5]
    Опс... не завметил вот этого: > LookasideList не очень подходит :(
  • Riply © (12.09.08 17:10) [6]
    >[3] Rouse_ ©   (12.09.08 16:35)
    > а вообще найди книжку O`Reilly под названием "Building NT File System Drivers". Там много интересного есть.

    Вот спасибо. Правда пока найти не удается (все ссылки битые), но надежду не теряю :)

    --------------------------------------------------------------------------------

    > [4] Rouse_ ©   (12.09.08 16:54)
    > Вот тебе кстати хороший примерчик: http://www.wasm.ru/article.php?article=drvw2k16

    :)
    Смотрела этот пример. И читала главы, относящиеся к работе с памятью.
    IMHO, автор рассказывает только механизмы работы (типа: так выделяем, а так освобождаем),
    а мне хотелось бы понять в каких случаях какой способ выбирать.
    Например, когда надо использовать Lookaside - понятно.
    А что надо использовать в такой же ситуации, но с кусочками разного размера ?
  • Rouse_ © (12.09.08 17:12) [7]

    > Правда пока найти не удается (все ссылки битые), но надежду
    > не теряю :)

    Вообще она у меня есть в оригинале 11 метров... Могу выложить к себе на сайт.
  • Rouse_ © (12.09.08 17:14) [8]

    > а мне хотелось бы понять в каких случаях какой способ выбирать.

    Ну как-же...
    http://msdn.microsoft.com/en-us/library/ms794740.aspx
  • Riply © (12.09.08 17:18) [9]
    > [7] Rouse_ ©   (12.09.08 17:12)
    > Вообще она у меня есть в оригинале 11 метров... Могу выложить к себе на сайт.

    Саш, была бы очень признательна :)
  • Riply © (12.09.08 17:26) [10]
    > [6] Riply ©   (12.09.08 17:10)
    > Правда пока найти не удается (все ссылки битые), но надежду не теряю :)

    Нашла на www.podgoretsky.com :))
    Правда она почему-то только 164 KB
  • Rouse_ © (12.09.08 17:33) [11]
  • Riply © (12.09.08 18:36) [12]
    > [11] Rouse_ ©   (12.09.08 17:33)
    > http://rouse.drkb.ru/books/wntfs.zip

    Спасибо большое.
  • Rouse_ © (13.09.08 00:34) [13]
    Тезка, тебе всегда пожалуйста :)
  • Германн © (13.09.08 01:38) [14]

    > Rouse_ ©   (13.09.08 00:34) [13]
    >
    > Тезка, тебе всегда пожалуйста :)
    >

    С Ч. согласовано сие заявление?
    :)
  • Rouse_ © (13.09.08 01:48) [15]

    > С Ч. согласовано сие заявление?

    Эмнь... Товаризчь Ч. спросонья кивнул в ответ на этот вопрос :)
  • Германн © (13.09.08 02:12) [16]

    > Эмнь... Товаризчь Ч. спросонья кивнул в ответ на этот вопрос
    > :)
    >

    И ты тоже читал то самое произведение Хайнлайна? И в том самом переводе?
  • Игорь Шевченко © (16.09.08 13:34) [17]
    ExAllocatePoolWithTag
  • Riply © (16.09.08 17:28) [18]
    > [17] Игорь Шевченко ©   (16.09.08 13:34)
    > ExAllocatePoolWithTag

    Вот спасибо.
    После тяжких раздумий, я на ней и остановилась. Значит не ошиблась. Приятно :)

    Игорь, мне еще хотелось бы знать что используют для выделения/освобождения
    памяти Rtl функции в kernel-mode, работающие со строками (типа RtlCreateUnicodeString) ?
    Хочу написать парочку своих функций для работы с UNICODE_STRING.
    Мне необходима их "совместимость" с стандатными.
  • Игорь Шевченко © (16.09.08 17:54) [19]
    Riply ©   (16.09.08 17:28) [18]


    > Игорь, мне еще хотелось бы знать что используют для выделения/освобождения
    > памяти Rtl функции в kernel-mode, работающие со строками
    > (типа RtlCreateUnicodeString) ?


    ExAllocatePool, если мне память не изменяет
 
Конференция "WinAPI" » Работа с памятью в Kernel-mode.
Есть новые Нет новых   [134435   +33][b:0][p:0.001]