-
Здравствуйте !
Допустим нам надо часто выделять/освобождать небольшие
кусочки памяти разного размера в 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]А зачем выделять и освобождать? Выдели сразу необходимый кусок и работай с ним...
-
> [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 не очень подходит :(
-
>[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 -
> [7] Rouse_ © (12.09.08 17:12)
> Вообще она у меня есть в оригинале 11 метров... Могу выложить к себе на сайт.
Саш, была бы очень признательна :) -
> [6] Riply © (12.09.08 17:10)
> Правда пока найти не удается (все ссылки битые), но надежду не теряю :)
Нашла на www.podgoretsky.com :))
Правда она почему-то только 164 KB -
Rouse_ © (12.09.08 17:33) [11]
-
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
-
> [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, если мне память не изменяет