Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.15;
Скачать: CL | DM;

Вниз

Работа с памятью в Kernel-mode.   Найти похожие ветки 

 
Riply ©   (2008-09-12 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_ ©   (2008-09-12 14:50) [1]

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


 
Riply ©   (2008-09-12 16:12) [2]

> [1] Rouse_ ©   (12.09.08 14:50)
> А зачем выделять и освобождать? Выдели сразу необходимый кусок и работай с ним...

Эт, конечно верно...
Но очень бы хотелось понять: как поступают в таких случаях и почему,
да и иметь возможность самой поуправлять памятью в течении жизни драйвера, когда приспичит :)


 
Rouse_ ©   (2008-09-12 16:35) [3]


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

Для частого выделения-освобождения памяти обычно применяют Lookaside списки. См. ExInitializeNPagedLookasideList и все что с ним связано, а вообще найди книжку O`Reilly под названием "Building NT File System Drivers". Там много интересного есть.


 
Rouse_ ©   (2008-09-12 16:54) [4]

Вот тебе кстати хороший примерчик: http://www.wasm.ru/article.php?article=drvw2k16


 
Rouse_ ©   (2008-09-12 17:10) [5]

Опс... не завметил вот этого: > LookasideList не очень подходит :(


 
Riply ©   (2008-09-12 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_ ©   (2008-09-12 17:12) [7]


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

Вообще она у меня есть в оригинале 11 метров... Могу выложить к себе на сайт.


 
Rouse_ ©   (2008-09-12 17:14) [8]


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

Ну как-же...
http://msdn.microsoft.com/en-us/library/ms794740.aspx


 
Riply ©   (2008-09-12 17:18) [9]

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

Саш, была бы очень признательна :)


 
Riply ©   (2008-09-12 17:26) [10]

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

Нашла на www.podgoretsky.com :))
Правда она почему-то только 164 KB


 
Rouse_ ©   (2008-09-12 17:33) [11]

http://rouse.drkb.ru/books/wntfs.zip


 
Riply ©   (2008-09-12 18:36) [12]

> [11] Rouse_ ©   (12.09.08 17:33)
> http://rouse.drkb.ru/books/wntfs.zip

Спасибо большое.


 
Rouse_ ©   (2008-09-13 00:34) [13]

Тезка, тебе всегда пожалуйста :)


 
Германн ©   (2008-09-13 01:38) [14]


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

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


 
Rouse_ ©   (2008-09-13 01:48) [15]


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

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


 
Германн ©   (2008-09-13 02:12) [16]


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

И ты тоже читал то самое произведение Хайнлайна? И в том самом переводе?


 
Игорь Шевченко ©   (2008-09-16 13:34) [17]

ExAllocatePoolWithTag


 
Riply ©   (2008-09-16 17:28) [18]

> [17] Игорь Шевченко ©   (16.09.08 13:34)
> ExAllocatePoolWithTag

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

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


 
Игорь Шевченко ©   (2008-09-16 17:54) [19]

Riply ©   (16.09.08 17:28) [18]


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


ExAllocatePool, если мне память не изменяет


 
Riply ©   (2008-09-16 18:20) [20]

> [19] Игорь Шевченко ©   (16.09.08 17:54)
> ExAllocatePool, если мне память не изменяет

Эх. Существует единственный способ проверки.
Сегодня попробую... О количестве BSOD`ов будет доложено :)


 
Riply ©   (2008-09-17 19:09) [21]

> [20] Riply ©   (16.09.08 18:20)
> Сегодня попробую... О количестве BSOD`ов будет доложено :)

Совместимость ExAllocatePool и Rtl-функций проверяла так (за тип пула взяла PagedPool):

if RtlCreateUnicodeString(@UsBuffer, pTmpBuffer) then
 begin
  Log_WriteMess("Try ExFreePool", STATUS_SUCCESS, 0, 0);
  ExFreePool(UsBuffer.Buffer);
  Log_WriteMess("Try ExAllocatePool", STATUS_SUCCESS, 0, 0);
  UsBuffer.Buffer := ExAllocatePool(PagedPool, 256);
  if UsBuffer.Buffer <> nil then
   begin
    Log_WriteMess("Try RtlFreeUnicodeString", STATUS_SUCCESS, 0, 0);
    RtlFreeUnicodeString(@UsBuffer);
   end;
 end;


Все работает, BSOD не наблюдается..., но моя душенька не довольна.
А можно ли нам быть уверенными, что память в ExFreePool или RtlFreeUnicodeString
действительно освобождается ? Они же процедуры и отчета нам не предоставляют :(
Может кто-то из них считает, что и освобождать то нечего.
Как бы отследить утечки памяти или хотя бы проверить, что память действительно освободилась ?
P.S.
Попытку записать туда что-то и посмотреть
на реакцию не считаю надежной проверкой :)


 
Игорь Шевченко ©   (2008-09-18 17:21) [22]


> А можно ли нам быть уверенными, что память в ExFreePool
> или RtlFreeUnicodeString
> действительно освобождается ?


Можно

Для проверки есть какая-то утилита (ну убей не помню, как называется, у Руссиновича с Соломоном она описана), которая при некоем значении GlobalFlags показывает, что в каком пуле выделено и с какими Tag-ами


 
Riply ©   (2008-09-18 23:12) [23]

>[22] Игорь Шевченко ©   (18.09.08 17:21)
>Можно

Эт хорошо, когда нельзя, гораздо хуже :)

> Для проверки есть какая-то утилита (ну убей не помню, как называется, у Руссиновича с Соломоном она описана),
> которая при некоем значении GlobalFlags показывает, что в каком пуле выделено и с какими Tag-ами

Да, где-то и я сталкивалась с ее описанием. Попробую найти.
Спасибо.


 
Игорь Шевченко ©   (2008-09-18 23:34) [24]

че-то ты на этот раз странное творишь. Мне так кажется


 
Riply ©   (2008-09-18 23:39) [25]

> [24] Игорь Шевченко ©   (18.09.08 23:34)
> че-то ты на этот раз странное творишь. Мне так кажется

Неа. Не странное. Сейчас я просто изучаю как можно работать в "режиме ядра"
и какие вкусности можно получить от этого :)
И делаю это, между прочим, по совету некоторых старших товарищей (не будем тыкать пальцем).
:))


 
Игорь Шевченко ©   (2008-09-19 00:20) [26]


> Неа. Не странное. Сейчас я просто изучаю как можно работать
> в "режиме ядра"


точно так же как и в режиме "не ядра", только слегка поосторожнее, потому что сообщение "Программа выполнила допустимую операцию" отображается на синем фоне.

Вкусностей, собственно говоря, никаких, все полезное, что можно сделать, можно сделать и в режиме пользователя, кроме прямой работы с железом - но какой смысл работать с железом, если можно сделать драйвер, который будет работать с железом, и взаимодействовать с этим драйвером, опять же, из пользовательского режима.


 
Riply ©   (2008-09-19 00:49) [27]

> [26] Игорь Шевченко ©   (19.09.08 00:20)
> Вкусностей, собственно говоря, никаких, все полезное, что можно сделать, можно сделать и в режиме пользователя

Как ответ, позволю себе привести цитату:

"Как ты понимаешь, и Руссиновичу и брату его во Христе Когсуэллу тоже интересно "как это там система работает", весьма вероятно, что было интересно даже больше, чем тебе. Следовательно, они пришли к выводу, что попытки получить такую информацию из пользовательского режима рано или поздно закончатся неудачей. Вот и Шрайбер тоже рекомендует для получения информации пользоваться драйвером - у него, у драйвера, возможностей больше - можно читать напрямую те же таблицы, из которых получается информация, возвращаемая NtQueryxxxxx, и главное, что в это время тебе никто не мешает."   Игорь Шевченко (©)   :))


 
Сергей М. ©   (2008-09-19 09:35) [28]


> Riply


http://www.wasm.ru/print.php?article=drvw2k06



Страницы: 1 вся ветка

Текущий архив: 2009.11.15;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.013 c
1-1223917702
просто так
2008-10-13 21:08
2009.11.15
object`ы в delphi 2009


4-1221320169
<>
2008-09-13 19:36
2009.11.15
Как добавить пункт к меню программы на панели задач?


15-1253198494
TUser
2009-09-17 18:41
2009.11.15
ММП


1-1224008956
DmitriyG.
2008-10-14 22:29
2009.11.15
Создание большого XML


2-1254463160
mfender
2009-10-02 09:59
2009.11.15
Какая-то чуднАя ошибка в Application.CreateForm