\Device\PhysicalMemory
是一个节对象,即在Win32 API中表示一个内存映射文件。 考虑到它的名字,它可能是一个完全由RAM支持的MMF; 是一对一的物理页面映射。
这几乎是我的问题:这部分对象代表非分页物理内存还是非分页系统地址空间 ?
如果是前者,那么物理记忆中的“漏洞”呢? 例如,在支持PAE的系统上,系统地址空间下的物理内存可能实际上是“碎片化的”。 如果在将视图映射到\Device\PhysicalMemory
部分对象后访问这些洞,会发生什么情况?
我感到困惑的原因是因为MmMapIoSpace
函数采用PHYSICAL_ADDRESS PhysicalAddress
参数并将该物理地址映射到非分页的系统地址空间。 另请参阅MmAllocateContiguousMemory
等其他内存pipe理器function。 使实际的物理内存可用并假装可以以连续的方式访问似乎是非常危险的。
很显然,非分页物理内存和非分页系统地址空间之间的映射并不一定是一对一的。
试图find上述和一些相关的术语在Windows内部,第六版。 没有给出明确的答案。 第10章主要涉及WDK文档调用系统地址空间的内容。 所以我在这里问。
请确保指出权威来源为您的答案。
\Device\PhysicalMemory
是直接由物理内存支持的节对象。 其视图偏移表示实际的物理地址。 因此,它不是连续的,使用它你必须知道什么范围是有效的。
关于如何使用\ Device \ PhysicalMemory,微软认为这是你不应该做的事。 事实上,他们尽可能地使用这个部分,而不是在Windows XP / 2003中完全删除它。
至于MmMapIoSpace:需要映射内存的设备驱动程序在其PnP初始化期间通过资源请求它。 Windows为设备驱动程序独占使用的物理内存分配范围,并返回CmResourceTypeMemory资源来描述分配的内存。 设备驱动程序然后使用MmMapIoSpace来获取内核模式可访问地址。 驱动程序从不给随机地址映射。 这在MmMapIoSpace MSDN文档和从此页面链接的其他页面中进行了介绍。
请注意,当您使用此部分或MmMapIoSpace时,必须小心:映射的任何内存都使用与其他映射相同的缓存语义来使用相同的物理地址。 如果不会发生腐败 – 如果使用映射写入数据,这一点尤为重要。 如果按照Microsoft的预期使用,这通常不是MmMapIoSpace的问题,因为拥有的设备驱动程序应该知道如何使用一致的缓存进行映射。 当使用该部分时,您无法知道内存是否被其他代码以不兼容的方式映射。
驱动程序验证程序将指示在使用该部分或MmMapIoSpace时未能使用一致的映射,并将其报告为映射器故障。 在Windows 10中,即使没有驱动程序验证程序,也会发生这种类型的报告,这使得使用任何一种方法都很困难,而不会导致OS停止。
您不指定您正在尝试执行的操作,但是我怀疑您可能有兴趣使用MM_COPY_MEMORY_PHYSICAL查看MmCopyMemory – 请参阅MmCopyMemory MSDN文档 。