Как узнать, сколько физического ОЗУ выделяет виртуальный диск - PullRequest
1 голос
/ 24 января 2011

В последнее время я использую imdisk http://www.ltr -data.se / opencode.html / # ImDisk Я создаю виртуальный диск объемом 1 ГБ с помощью этой команды: imdisk.exe -a -t vm -mV: -s 1024M -p "/ fs: NTFS / q / y / v: Name / c" Я хочу знать, сколько физического Рама занимает этот виртуальный диск.Но, похоже, это зависит от того, как виртуальный диск заполняется файлами.Он начинается с нескольких МБ, а затем увеличивается с каждым копируемым файлом.Если я затем удаляю эти файлы, количество физического ОЗУ, которое требуется, не уменьшается.Поэтому я не могу использовать GetDiskFreeSpaceEx, чтобы получить объем физического ОЗУ, потому что он не будет отображаться правильно.Также я не могу видеть драйвер программы как нормальную программу, поэтому я мог измерить его размер.

Я говорил с автором, и он говорит:

Хорошо, вы говорили офизическая память.Я говорил о адресном пространстве ядра.ImDisk выделяет всю память одновременно в одном адресном блоке для оперативных дисков, чтобы не было динамического выделения или чего-либо подобного.

Я думаю, что это единственный способ определить, сколько физической памяти использует это адресное пространство на одномконкретный момент был бы, если есть некоторый недокументированный API, который сообщает о фиксации / физических значениях для определенного блока памяти.Однако я не знаю ни одного такого API.

Но, возможно, кто-то знает способ ... Я имею в виду, чтобы получить это число в программе, а не только визуально.

1 Ответ

3 голосов
/ 24 января 2011

Просматривая исходный код, выясняется, что ImDisk выделяет память в контексте системного процесса.Взгляните на рабочий набор для системы (например, с помощью Process Explorer ) - в нем должно быть указано использование физической памяти ImDisk.

Мой оригинальный ответ, который я написал до того, как посмотрелисходный код (все еще может быть полезен, если мое предположение неверно):

Для процессов вы можете просто взглянуть на значения рабочего набора - они указывают использование физической памяти для этого процесса.Однако для кода режима ядра, не специфичного для какого-либо процесса, это немного сложнее.Вам нужно что-то вроде RAMMap .Я говорю «что-то вроде», потому что на вкладках «Количество использований» и «Физические страницы» будет почти невозможно определить, откуда на самом деле берутся страницы (кто их выделил).

Редактировать:

Извините, я не осознавал, что вы хотели сделать это программно.Если вы хотите получить размер рабочего набора процесса, вызовите GetProcessMemoryInfo .Так что просто откройте системный процесс (PID 4) и вызовите эту функцию.

Что я имел в виду под второй частью, так это то, что я не знаю ни о каком отслеживании / отслеживании, выполняемом ядром для какого-либо ядра.API выделения памяти в режиме, по крайней мере, для просмотра использования физической памяти конкретного драйвера.То, как ядро ​​управляет физическими страницами, не совсем то, о чем беспокоятся программисты в режиме пользователя или в режиме ядра.

Однако я кое-что здесь упустил, поскольку ImDisk не использует эти API - он использует ZwAllocateVirtualMemory.Если вам известен диапазон адресов блока, выделенного драйвером, вы можете вызвать QueryWorkingSet в системном процессе и выполнить некоторые вычисления, чтобы получить точный размер.

...