Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1252385906
oxffff
2009-09-08 08:58
2009.11.15
Звенигород. 22-24 сентября. Honeywell.


15-1252764985
@!!ex
2009-09-12 18:16
2009.11.15
Как урезать установленную Windows XP?


4-1221659280
rand(256)
2008-09-17 17:48
2009.11.15
Дескрипторы компонентов окна


2-1254531792
сергей
2009-10-03 05:03
2009.11.15
Как определить размер Application.ExeName ??


1-1224835215
@!!ex
2008-10-24 12:00
2009.11.15
BMP выравнивание относительно чего?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский