Требуется уточнение по \Device\PhysicalMemory в Windows

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

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

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

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

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

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

Пожалуйста, не забудьте указать на авторитетные источники для вашего ответа.


person 0xC0000022L    schedule 29.03.2016    source источник


Ответы (1)


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

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

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

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

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

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

person Robin Caron    schedule 31.03.2016
comment
спасибо за подробности. Меня действительно в основном интересовал \Device\PhysicalMemory и больше из любопытства, чем для (ab) его использования. Можете ли вы указать какие-либо источники утверждения в первом абзаце? - person 0xC0000022L; 31.03.2016
comment
У меня нет источника, чтобы дать вам. - person Robin Caron; 01.04.2016
comment
Кстати, на самом деле я ничего не пытаюсь делать. Я пытаюсь узнать о внутренностях, которые кажутся недокументированными. И я подумал, что набирать здесь вопрос разумнее, чем запускать IDA и листать страницы дизассемблирования :) - person 0xC0000022L; 31.05.2016