什么是Mappable和Non-mappable Memeory

时间:2015-10-25 17:07:36

标签: c++ directx directx-11 memory-mapping

我正在浏览一些示例代码并且我遇到了一个函数(ID3D11DeviceContext::UpdateSubresource),“CPU将数据从内存复制到在 不可映射的内存中创建的子资源 “。

在物理上和/或逻辑上,可映射内存的简化定义是什么?

同样,不可映射内存的简化定义是什么?

我发现了许多关于内存映射主题的详细信息(从初学者的角度来看),我已将其添加到我的阅读列表中。我已经阅读了一些基本信息,解释了内存映射的内容和原因。正如一个网站所说的那样,“计算机内存中文件的排列保存在一个称为内存映射的虚拟文件中。”

我无法将这些定义和概念与术语mappable / non-mappable memory连接起来。

我在朋友的帮助下过得很快。

3 个答案:

答案 0 :(得分:2)

可映射内存是您可以通过虚拟内存映射直接从程序访问的内容。

如果你的显卡的内存没有内存映射,你需要以某种方式给卡片命令将它从你的地址空间加载到它的地址空间。这涉及复制。

如果卡的内存已共享或映射,CPU可以直接写入共享内存,从而避免不必要的复制。

答案 1 :(得分:1)

对于图形,基本上有四种内存:

  • 专用视频内存:这是只能由图形卡使用的内存,因为它实际上位于图形部件本身。 GPU可以访问它,CPU不能。值DXGI_ADAPTER_DESC.DedicatedVideoMemory是此类内存的数量。

  • 专用系统内存:对于集成图形部件,主系统内存的一部分在启动时拍摄,以供专用图形使用。 CPU被阻止访问它,它仅由GPU使用。 DXGI_ADAPTER_DESC.DedicatedSystemMemory是这种记忆的数量。

  • 共享系统内存:这是普通的主内存,处于GPU和CPU都可以访问的模式。通常,这是通过类似PCIe存储器孔径的方式实现的。 DXGI_ADAPTER_DESC.SharedSystemMemory是这种记忆的数量。

  • GPU无法访问系统内存的剩余部分,只能访问CPU。 GPU在这三种类型之间的总内存通常不能超过4 GB。

因此,对于独立图形部分,DedicatedVideoMemory类似于1 GB,SharedSystemMemory类似于256 MB或更大,DedicatedSystemMemory为0。

对于集成部分,DedicatedVideoMemory是一些小数字(16 MB或32 MB)甚至0,DedicatedSystemMemory是256 MB或512 MB,SharedSystemMemory是256 MB或大。

还有“统一内存架构”系统,例如Xbox One,其中有少量DedicatedVideoMemory,基本上所有主内存也都是SharedSystemMemory

“Mappable”内存指的是共享系统内存。如果关联的资源是DEFAULT,那么您无法映射它,因为它允许驻留在专用视频内存中。 DYNAMIC资源放入共享系统内存。 STAGING资源分配在“系统内存的剩余部分”中。

请参阅DirectX Video Memory示例。

答案 2 :(得分:0)

内存映射是指将内存地址分配给某些内容的术语。有些东西可以是USB接口的硬件寄存器或文件中的位置。

内存映射文件是一个可以被访问的文件,就像它在内存中一样,就像一个巨大的数组。某些操作系统为此提供了功能,在其他平台上,程序员必须对此行为进行建模。

请注意,RTOS通常控制对内存位置的访问,包括内存映射的内存位置。仅仅因为某些是内存映射的(如I2C端口),并不意味着您的用户空间程序可以直接访问它。