2016-03-29 2 views
1

\Device\PhysicalMemory - объект раздела, то есть в терминах API Win32 - файл с отображением памяти. Учитывая его название, это может быть MMF полностью при поддержке RAM; будучи одним на одно отображение физических страниц.Требуется уточнение на Device PhysicalMemory в Windows

И это довольно много, на моем вопрос: делает этот раздел объект представляет невыгружаемый физической памяти или неподкачиваемой системы адресного пространство?

И если это первый, то как насчет «дыр» в физической памяти? Например, в системах с поддержкой PAE физическая память, лежащая в основе адресного пространства системы, может быть фактически «фрагментирована». Что произойдет, если я получаю доступ к таким отверстиям после сопоставления вида с объектом раздела \Device\PhysicalMemory?

Причина, по которой я запутался, заключается в том, что функция MmMapIoSpace принимает параметр PHYSICAL_ADDRESS PhysicalAddress и сопоставляет этот физический адрес с адресным пространством невыгружаемой системы. Также см. Другие функции диспетчера памяти, такие как MmAllocateContiguousMemory. Кажется довольно опасным сделать актуальной доступной физической памятью и притворяться, что к ней можно получить доступ беспрерывно.

Так ясно, что существует сопоставление, которое не обязательно одно между одноранговым физическим запоминающим устройством и невыгружаемым системным адресным пространством.

Пытается найти вышеуказанное и ряд связанных терминов в Windows Internals, 6-е изд. не дал определенного ответа. В главе 10 в основном рассматривается вопрос о том, что документация WDK вызывает системное адресное пространство. Поэтому я спрашиваю здесь.

Обязательно укажите достоверные источники для ответа.

ответ

3

\Device\PhysicalMemory - объект раздела, который напрямую поддерживается физической памятью. Смещение его представления представляет собой фактические физические адреса. Как таковой он не соприкасается и использовать его, вы должны знать, какие диапазоны действительны.

Существует небольшая авторитетная информация о том, как использовать \ Device \ PhysicalMemory, поскольку Microsoft предполагает, что это то, что вам не нужно делать. Фактически они максимально упростили использование этого раздела, не удалив его полностью в Windows XP/2003.

Что касается MmMapIoSpace: драйверы устройств, которым требуется сопоставленная память, запрашивают его через ресурсы во время их инициализации PnP. Windows назначает диапазоны страниц физической памяти для исключительного использования драйвером устройства и возвращает ресурсы CmResourceTypeMemory для описания назначенной памяти. Затем драйвер устройства использует MmMapIoSpace для получения доступного адреса режима ядра. Драйвер никогда не отображает случайный адрес. Это описано в MmMapIoSpace MSDN docs и других страницах, ссылающихся на эту страницу.

Обратите внимание, что при использовании этого раздела или MmMapIoSpace вы должны быть осторожны с тем, что любая сопоставимая память использует ту же семантику кэширования, что и другое сопоставление для одного и того же физического адреса. Если не произойдет коррупция - это особенно важно, если данные будут записаны с использованием сопоставления. Обычно это не проблема для MmMapIoSpace, если она используется по умолчанию Microsoft, поскольку драйвер устройства-владельца должен знать, как сопоставлять, используя последовательное кэширование. При использовании этого раздела вы не можете узнать, была ли карта памяти сопоставлена ​​несовместимым образом каким-либо другим кодом.

Драйвер-драйвер будет указывать на неспособность использовать согласованное отображение при использовании раздела или MmMapIoSpace и сообщать о них как о неисправности картера.В Windows 10 этот тип отчета встречается даже без верификатора драйвера, что очень затрудняет использование любого из этих методов без остановки ОС.

Вы не указали, что вы пытаетесь сделать, но я подозреваю, что вам может быть интересно посмотреть MmCopyMemory с помощью MM_COPY_MEMORY_PHYSICAL - см. MmCopyMemory MSDN docs.

+0

благодарит за детали. Меня действительно интересовали '\ Device \ PhysicalMemory' и больше из любопытства, чем (ab) его использовать. Можете ли вы дать какие-либо источники для претензии в первом абзаце? – 0xC0000022L

+0

У меня нет источника для вас. –

+0

Кстати, я не пытаюсь ничего делать, действительно. Я пытаюсь узнать о внутренностях, которые, как представляется, недокументированы. И я решил, что набрать вопрос здесь более разумно, чем запустить IDA и просеять страницы разборки :) – 0xC0000022L

Смежные вопросы