Windows \Device\PhysicalMemory 需要澄清

Clarification needed on \Device\PhysicalMemory on Windows

\Device\PhysicalMemory 是一个段对象,在 Win32 API 术语中是一个内存映射文件。鉴于其名称,它可能是一个由 RAM 支持的 MMF fully;是物理页面的一对一映射。

这几乎就是我的问题:这个部分对象代表非分页 物理内存 还是非分页 系统地址 space?

而如果是前者,物理内存中的"holes"呢?例如,在支持 PAE 的系统上,系统地址 space 下的物理内存实际上可能是 "fragmented"。如果我在将视图映射到 \Device\PhysicalMemory 部分对象后访问这些漏洞会怎样?

我感到困惑的原因是因为 MmMapIoSpace 函数采用 PHYSICAL_ADDRESS PhysicalAddress 参数并将该物理地址映射到非分页系统地址 space。另请参阅其他内存管理器函数,如 MmAllocateContiguousMemory。使 实际 物理内存可用并假装可以以连续方式访问它似乎很危险。

很明显,非分页物理内存和非分页系统地址之间存在不一定一对一的映射 space。

试图在 Windows Internals,第 6 版中找到上述内容和一些相关术语。没有给出任何确定的答案。第 10 章主要处理 WDK 文档中称为系统地址 space 的内容。所以我在这里问。

请务必指出您的答案的权威来源。

\Device\PhysicalMemory是直接由物理内存支持的section对象。它的视图偏移量代表实际的物理地址。因此它不是连续的,要使用它,您必须知道哪些范围是有效的。

关于如何使用 \Device\PhysicalMemory 的权威信息很少,因为 Microsoft 认为您不需要这样做。事实上,他们在 Windows XP/2003.

中没有完全删除它,因此尽可能地难以使用这一部分。

至于 MmMapIoSpace:需要映射内存的设备驱动程序在其 PnP 初始化期间通过资源请求它。 Windows 分配物理内存页范围供设备驱动程序独占使用,returns CmResourceTypeMemory 资源描述分配的内存。然后设备驱动程序使用 MmMapIoSpace 获取内核模式可访问地址。驱动程序从不提供要映射的随机地址。 MmMapIoSpace MSDN docs 和从此页面链接的其他页面中对此进行了描述。

请注意,当您使用此部分或 MmMapIoSpace 时,必须注意映射的任何内存都使用与同一物理地址的其他映射相同的缓存语义。否则可能会发生损坏——如果使用映射写入数据,这一点尤其重要。如果按 Microsoft 的预期使用,这对于 MmMapIoSpace 通常不是问题,因为拥有的设备驱动程序应该知道如何使用一致的缓存进行映射。使用该部分时,您无法知道内存是否已被其他代码以不兼容的方式映射。

驱动程序验证程序将指示在使用节或 MmMapIoSpace 时未能使用一致的映射,并将它们报告为错误的映射器故障。在 Windows 10 中,即使没有驱动程序验证器也会出现这种类型的报告,因此很难在不导致 OS 停止的情况下使用任何一种方法。

您没有具体说明您要做什么,但我怀疑您可能有兴趣使用 MM_COPY_MEMORY_PHYSICAL 查看 MmCopyMemory —— 请参阅 MmCopyMemory MSDN docs