gpt4 book ai didi

windows - Windows 上的\Device\PhysicalMemory 需要说明

转载 作者:可可西里 更新时间:2023-11-01 11:25:57 32 4
gpt4 key购买 nike

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

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

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

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

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

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

请确保指出您的答案的权威来源。

最佳答案

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

关于如何使用\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 .

关于windows - Windows 上的\Device\PhysicalMemory 需要说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36292919/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com