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 функции).
Может выбрать тоже, что и они ?


Сергей М.   (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 метров... Могу выложить к себе на сайт.

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


Страницы:   1 2

Наверх

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