【问题标题】:Clarification needed on \Device\PhysicalMemory on WindowsWindows 上的 \Device\PhysicalMemory 需要说明
【发布时间】:2016-07-17 12:24:55
【问题描述】:

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

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

如果是前者,那么物理内存中的“漏洞”呢?例如,在启用 PAE 的系统上,系统地址空间下的物理内存实际上可能是“碎片化的”。如果我在将视图映射到 \Device\PhysicalMemory 部分对象后访问这些孔会发生什么?

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

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

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

请确保指向权威来源以获得您的答案。

【问题讨论】:

    标签: windows memory memory-management internals


    【解决方案1】:

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

    关于如何使用 \Device\PhysicalMemory 的权威信息很少,因为 Microsoft 认为您不需要这样做。事实上,在 Windows XP/2003 中没有完全删除它的情况下,他们尽可能难以使用该部分。

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

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

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

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

    【讨论】:

    • 感谢您提供详细信息。我真的对\Device\PhysicalMemory 最感兴趣,更多的是出于好奇而不是(ab)使用它。你能提供第一段中声明的任何来源吗?
    • 我没有资源可以给你。
    • 顺便说一句,我真的不想任何事情。我正在尝试了解似乎没有记录的内部结构。而且我认为在这里输入一个问题比启动 IDA 并筛选反汇编页面更明智:)
    猜你喜欢
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多