Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
ВнизСтранный регион Найти похожие ветки
← →
alpet © (2005-05-08 11:34) [0]Сталкиваюсь иногда в своем редакторе памяти при сканировании АП другого процесса с регионами памяти доступ к которым очень медленный (порядка 6 мб/сек). Причем как правило эти регионы бывают очень крупные (32мб и 128мб), и чаще всего встречаются в играх DirectX. Вот недавно заметил такой регион в VisualStudio.NET, в нем он приводит к страшным тормозам при сохранении (проц на 100% загружается при чтении из этого региона, записывать в него нельзя). Сегодня даже пришлось снять задачу с нее - начал сохранять файл (9кб) и не смог прекратить.
Может быть такое из-за сбойной памяти ? У моих знакомых такие регионы проявлялись из-за сбойных видеокарт ATI, но у меня сейчас NVDIA GeForce2 MX440 довольно нормальная. Проблема стала проявлятся вроде после установки VMWare, которую я сейчас снес. Буду ось реинсталлить...
← →
alpet © (2005-05-08 11:59) [1]Вот на чем застревает VisualStudio при загрузке:
MSVCR71.dll!memmove+0x1b4
Проект грузился почти минуту (обычно около 3 секунд).
Регион имеет аттрибуты [MEM_MAPPED, PAGE_READWRITE], размер 31.8 мб. С файлами на жестком диске вроде не связан (hdd молчит), как и сетевое соединение.
← →
alpet © (2005-05-11 11:18) [2]Этот регион обнаружился (в VS) и на другой машине, но с такой же видеокартой. В приниципе после переустановки проблема с сохранением перестала проявлятся, а странный регион пока так и остался непонятным явлением...
← →
Deka © (2005-05-11 11:58) [3]Для старых компьютеров можно было предположить, что этот регион относится к видеопамяти, так как память видеокарты отображалась физически в адресное пространство обычной памяти. Отображалась даже вся, а только частично (постранично). А так как физически она была на борту видеокарты и с ней постоянно работала DAC, который ее сканировал для вывода изображения, доступ к ней осуществлялся по специальной схеме через регистры. Это существенно тормозило операции обмена. Особенно операции записи. Как сейчас все устроено - точно не знаю...
← →
Sapersky (2005-05-11 12:39) [4]Как сейчас все устроено - точно не знаю...
Сейчас тоже есть нечто подобное - т.н. AGP-память, или нелокальная (non-local) видеопамять. Т.е. фрагмент системной памяти, который резервируется для обмена с видеокартой. В драйверах NVidia (для GF2MX, во всяком случае) устанавливается в размере 1/2 от объёма видеопамяти. DirectX на запрос кол-ва видеопамяти иногда выдаёт сумму настоящей и нелокальной - например, 96 (64 + 32).
← →
alpet © (2005-05-11 16:04) [5]Уходит примерно ~200 тактов на выполнение пересыки из этой. Сомнительно что видеопамять может быть такой тормозной (как угодно но не 6-15мб/сек). Потом этот регион не определен как PAGE_NOCACHE что должно быть с страницами видеопамяти, содержимое его довольно статично и изменению не поддается. У меня есть предположение что это проекция драйвера (типа "con") устройства, хотя не понятно зачем драйвер VStudio. Такое вообще может быть ?
← →
Sapersky (2005-05-11 18:52) [6]Не знаю, что там в VS, но в играх наверняка AGP-память.
Тормоза, насколько я понимаю, получаются из-за того, что видеокарта работает с этой памятью через DMA - тут уж если процесс пошёл, то пошёл, и всякие посторонние хакеры сидят и ждут, пока он закончится. А едва он закончился, основная программа (игра) вцепляется в этот кусок мёртвой хваткой (в DX есть такое понятие - блокировка ресурсов) - посторонний хакер опять сидит и ждёт... :)
В любом случае, хранятся там текстуры и модели, а никак не кол-во здоровья-патронов. Так что если определить, что это именно AGP-память - можно смело пропускать.
В свойствах устройства (видеокарты) в Windows выдаётся какой-то диапазон памяти - возможно, именно этот?
← →
alpet © (2005-05-11 19:51) [7]Выдается но в 32 мб. Причем в DirectX играх на обоих компах этого региона нет.
Намечается просвет. Я установил что по размеру регион сей очень похож на то что в ProcessExlorer показывается как .NET CLR Memory.
Вот наблюдения:
Размер самого региона: 0x1FD0000 или 33357824 байт
.NET CLR Memory (в Process Explorer)
# Total reserved Bytes 33546160 (0x1FFDFB0) байт
Разница в 0x2DFB0 ~= 184 KiB, а таких регионов в процессе 6 штук, что впрочем ни о чем не говорит.
В качестве подтверждения того что этот регион принадлежит драйверу .NET CLR, надо будет мне создать программку ее использующую. В итоге если получится что проецируется сам драйвер , окажется что вместо DeviceIoControl, ReadFile, WriteFile к его файлу можно использовать его проекцию... Впрочем скорее всего это лишь то что используется непосредственно управляемым кодом и большая загрузка процессора может обьяснятся множеством возникающих прерываний (правда они обычно возникают на страницах с аттрибутами PAGE_GUARD или PAGE_WRITECOPY).
Сейчас больше занимает вопрос - как получить имя файла проецируемого в память, по адресу проекции. Есть ли для это API фукнция, или нужен перехват функций CreateFileMapping/OpenFileMapping ?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c