![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с памятью в Kernel-mode.
Riply © (2008-09-12 14:43:00)Здравствуйте !
Допустим нам надо часто выделять/освобождать небольшие
кусочки памяти разного размера в 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_ (2008-09-12 17:14:00) [21]
> а мне хотелось бы понять в каких случаях какой способ выбирать.
Ну как-же...
http://msdn.microsoft.com/en-us/library/ms794740.aspx
Rouse_ (2008-09-12 17:12:00) [22]
> Правда пока найти не удается (все ссылки битые), но надежду
> не теряю :)
Вообще она у меня есть в оригинале 11 метров... Могу выложить к себе на сайт.
Riply (2008-09-12 17:10:00) [23]>[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_ (2008-09-12 17:10:00) [24]Опс... не завметил вот этого: > LookasideList не очень подходит:(
Rouse_ (2008-09-12 16:54:00) [25]Вот тебе кстати хороший примерчик: http://www.wasm.ru/article.php?article=drvw2k16
Rouse_ (2008-09-12 16:35:00) [26]
> Но очень бы хотелось понять: как поступают в таких случаях
> и почему,
Для частого выделения-освобождения памяти обычно применяют Lookaside списки. См. ExInitializeNPagedLookasideList и все что с ним связано, а вообще найди книжку O`Reilly под названием "Building NT File System Drivers". Там много интересного есть.
Riply (2008-09-12 16:12:00) [27]> [1] Rouse_ © (12.09.08 14:50)
> А зачем выделять и освобождать? Выдели сразу необходимый кусок и работай с ним...
Эт, конечно верно...
Но очень бы хотелось понять: как поступают в таких случаях и почему,
да и иметь возможность самой поуправлять памятью в течении жизни драйвера, когда приспичит :)
Rouse_ (2008-09-12 14:50:00) [28]А зачем выделять и освобождать? Выдели сразу необходимый кусок и работай с ним...