Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с памятью в Kernel-mode.


Страницы:   1 2

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]

А зачем выделять и освобождать? Выдели сразу необходимый кусок и работай с ним...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо