![]() |
| ||
|
|
Новости |
Поиск |
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 функции).
Может выбрать тоже, что и они ?
Сергей М. (2008-09-19 09:35:00) [1]
> Riply
http://www.wasm.ru/print.php?article=drvw2k06
Riply (2008-09-19 00:49:00) [2]> [26] Игорь Шевченко © (19.09.08 00:20)
> Вкусностей, собственно говоря, никаких, все полезное, что можно сделать, можно сделать и в режиме пользователя
Как ответ, позволю себе привести цитату:
"Как ты понимаешь, и Руссиновичу и брату его во Христе Когсуэллу тоже интересно "как это там система работает", весьма вероятно, что было интересно даже больше, чем тебе. Следовательно, они пришли к выводу, что попытки получить такую информацию из пользовательского режима рано или поздно закончатся неудачей. Вот и Шрайбер тоже рекомендует для получения информации пользоваться драйвером - у него, у драйвера, возможностей больше - можно читать напрямую те же таблицы, из которых получается информация, возвращаемая NtQueryxxxxx, и главное, что в это время тебе никто не мешает." Игорь Шевченко (©) :))
Игорь Шевченко (2008-09-19 00:20:00) [3]
> Неа. Не странное. Сейчас я просто изучаю как можно работать
> в "режиме ядра"
точно так же как и в режиме "не ядра", только слегка поосторожнее, потому что сообщение "Программа выполнила допустимую операцию" отображается на синем фоне.
Вкусностей, собственно говоря, никаких, все полезное, что можно сделать, можно сделать и в режиме пользователя, кроме прямой работы с железом - но какой смысл работать с железом, если можно сделать драйвер, который будет работать с железом, и взаимодействовать с этим драйвером, опять же, из пользовательского режима.
Riply (2008-09-18 23:39:00) [4]> [24] Игорь Шевченко © (18.09.08 23:34)
> че-то ты на этот раз странное творишь. Мне так кажется
Неа. Не странное. Сейчас я просто изучаю как можно работать в "режиме ядра"
и какие вкусности можно получить от этого :)
И делаю это, между прочим, по совету некоторых старших товарищей (не будем тыкать пальцем).
:))
Игорь Шевченко (2008-09-18 23:34:00) [5]че-то ты на этот раз странное творишь. Мне так кажется
Riply (2008-09-18 23:12:00) [6]>[22] Игорь Шевченко © (18.09.08 17:21)
>Можно
Эт хорошо, когда нельзя, гораздо хуже :)
> Для проверки есть какая-то утилита (ну убей не помню, как называется, у Руссиновича с Соломоном она описана),
> которая при некоем значении GlobalFlags показывает, что в каком пуле выделено и с какими Tag-ами
Да, где-то и я сталкивалась с ее описанием. Попробую найти.
Спасибо.
Игорь Шевченко (2008-09-18 17:21:00) [7]
> А можно ли нам быть уверенными, что память в ExFreePool
> или RtlFreeUnicodeString
> действительно освобождается ?
Можно
Для проверки есть какая-то утилита (ну убей не помню, как называется, у Руссиновича с Соломоном она описана), которая при некоем значении GlobalFlags показывает, что в каком пуле выделено и с какими Tag-ами
Riply (2008-09-17 19:09:00) [8]> [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.
Попытку записать туда что-то и посмотреть
на реакцию не считаю надежной проверкой :)
Riply (2008-09-16 18:20:00) [9]> [19] Игорь Шевченко © (16.09.08 17:54)
> ExAllocatePool, если мне память не изменяет
Эх. Существует единственный способ проверки.
Сегодня попробую... О количестве BSOD`ов будет доложено :)
Игорь Шевченко (2008-09-16 17:54:00) [10]Riply © (16.09.08 17:28) [18]
> Игорь, мне еще хотелось бы знать что используют для выделения/освобождения
> памяти Rtl функции в kernel-mode, работающие со строками
> (типа RtlCreateUnicodeString) ?
ExAllocatePool, если мне память не изменяет
Riply (2008-09-16 17:28:00) [11]> [17] Игорь Шевченко © (16.09.08 13:34)
> ExAllocatePoolWithTag
Вот спасибо.
После тяжких раздумий, я на ней и остановилась. Значит не ошиблась. Приятно :)
Игорь, мне еще хотелось бы знать что используют для выделения/освобождения
памяти Rtl функции в kernel-mode, работающие со строками (типа RtlCreateUnicodeString) ?
Хочу написать парочку своих функций для работы с UNICODE_STRING.
Мне необходима их "совместимость" с стандатными.
Игорь Шевченко (2008-09-16 13:34:00) [12]ExAllocatePoolWithTag
Германн (2008-09-13 02:12:00) [13]
> Эмнь... Товаризчь Ч. спросонья кивнул в ответ на этот вопрос
> :)
>
И ты тоже читал то самое произведение Хайнлайна? И в том самом переводе?
Rouse_ (2008-09-13 01:48:00) [14]
> С Ч. согласовано сие заявление?
Эмнь... Товаризчь Ч. спросонья кивнул в ответ на этот вопрос :)
Германн (2008-09-13 01:38:00) [15]
> Rouse_ © (13.09.08 00:34) [13]
>
> Тезка, тебе всегда пожалуйста :)
>
С Ч. согласовано сие заявление?
:)
Rouse_ (2008-09-13 00:34:00) [16]Тезка, тебе всегда пожалуйста :)
Riply (2008-09-12 18:36:00) [17]> [11] Rouse_ © (12.09.08 17:33)
> http://rouse.drkb.ru/books/wntfs.zip
Спасибо большое.
Rouse_ (2008-09-12 17:33:00) [18]http://rouse.drkb.ru/books/wntfs.zip
Riply (2008-09-12 17:26:00) [19]> [6] Riply © (12.09.08 17:10)
> Правда пока найти не удается (все ссылки битые), но надежду не теряю :)
Нашла на www.podgoretsky.com :))
Правда она почему-то только 164 KB
Riply (2008-09-12 17:18:00) [20]> [7] Rouse_ © (12.09.08 17:12)
> Вообще она у меня есть в оригинале 11 метров... Могу выложить к себе на сайт.
Саш, была бы очень признательна :)