Форум: "WinAPI";
Текущий архив: 2009.11.15;
Скачать: [xml.tar.bz2];
ВнизРабота с памятью в 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.11.15;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.005 c