twoView.java
是一个section对象,在Win32 API术语中是一个内存映射文件。鉴于其名称,它可能是由RAM支持的MMF 完全;是物理页面的一对一映射。
这就是我的问题:此部分对象是代表非分页物理内存还是非分页系统地址空间?
如果是前者,那么" hole"在物理记忆?例如,在启用PAE的系统上,系统地址空间下面的物理内存实际上可能是“碎片化的”#34;。如果我在将视图映射到\Device\PhysicalMemory
节对象后访问此类漏洞会发生什么?
我感到困惑的原因是因为\Device\PhysicalMemory
函数采用MmMapIoSpace
参数并将该物理地址映射到非分页系统地址空间。另请参阅其他内存管理器函数,如PHYSICAL_ADDRESS PhysicalAddress
。使实际的物理内存可用并假装可以以连续的方式访问它似乎非常危险。
很明显,在非分页物理内存和非分页系统地址空间之间,映射不一定是一对一的。
尝试在Windows Internals,第6版中找到上述和许多相关术语。没有得出任何明确的答案。第10章主要讨论WDK文档称为系统地址空间的内容。所以我在这里问。
请务必指向您的答案的权威来源。
答案 0 :(得分:3)
\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。