内存映射IO与DMA?

内存映射IO与DMA?,io,linux-kernel,dma,memory-mapping,Io,Linux Kernel,Dma,Memory Mapping,根据我从评论和答案中学到的知识(谢谢大家!),我对问题进行了编辑,使其更有针对性: DMA: 在第一次DMA之前,CPU必须设置RAM地址范围之类的内容,以便设备用于DMA。一旦设置工作完成,设备是否可以随意启动传输,基本上拥有该部分RAM,或者在每次sinlge DMA传输之前仍然必须再次获得CPU的某种许可 MMIO: 与CPU访问RAM相比,CPU通过mmio访问设备内存的成本更高,但我可以在我的桌面上看到,pci设备为mmio保留了数百兆字节,这是一个可以高效使用的示例(与使用DMA将数

根据我从评论和答案中学到的知识(谢谢大家!),我对问题进行了编辑,使其更有针对性:

DMA:

在第一次DMA之前,CPU必须设置RAM地址范围之类的内容,以便设备用于DMA。一旦设置工作完成,设备是否可以随意启动传输,基本上拥有该部分RAM,或者在每次sinlge DMA传输之前仍然必须再次获得CPU的某种许可

MMIO:


与CPU访问RAM相比,CPU通过mmio访问设备内存的成本更高,但我可以在我的桌面上看到,pci设备为mmio保留了数百兆字节,这是一个可以高效使用的示例(与使用DMA将数据复制回RAM然后访问它们相反)?从设备的角度来看。该设备可以:

  • 直接访问内存本身(使用DMA本身)

  • 等待CPU向其传输数据(通过提供内存映射IO供CPU使用)

所以问题是,如果CPU可以通过内存映射访问PCIe内存,为什么它必须执行DMA


CPU根本不使用DMA。DMA的整个要点是允许CPU在设备进行DMA时做其他事情(或什么也不做)。最终结果是整个系统的性能显著提高-例如,CPU/s做了大量其他工作,而许多设备(硬盘驱动器控制器、视频卡、声卡、网卡等)也在使用DMA传输数据。

从设备的角度来看。该设备可以:

  • 直接访问内存本身(使用DMA本身)

  • 等待CPU向其传输数据(通过提供内存映射IO供CPU使用)

所以问题是,如果CPU可以通过内存映射访问PCIe内存,为什么它必须执行DMA

CPU根本不使用DMA。DMA的整个要点是允许CPU在设备进行DMA时做其他事情(或什么也不做)。最终结果是整个系统的性能显著提高,例如CPU/s完成了大量其他工作,而许多设备(硬盘驱动器控制器、视频卡、声卡、网卡等)也在使用DMA传输数据

CPU可以通过内存映射IO访问该内存,就像它是DRAM一样

你误用了术语。
您应该使用术语“主内存”,即系统内存或RAM,而不是“DRAM”。
在现代计算机上,主/系统存储器由某种类型的SDRAM(同步动态RAM)实现。
将功能术语(如主存储器)与硬件实现(如DDR3 SDRAM)混为一谈似乎无害,但可能导致错误的三段论或其他误解

内存映射可以将PCIe设备的内存放在与主内存相同的地址空间中

CPU可以通过DMA将此PCIe设备内存中的数据块传输到实际物理内存中。这样CPU就可以自由地访问物理内存

“真实物理内存”是多余的。还有什么其他类型的“物理内存”? 没有“虚假的物理记忆”

您似乎将主存中缓冲区的使用称为“DMA”。
这是误导。
为了使用或将数据复制到主存中的缓冲区,不需要DMA

所以问题是,如果CPU可以通过内存映射访问PCIe内存,为什么它必须执行DMA

你似乎误用了术语。
你可能想学习

是因为PCIe总线随机访问速度慢吗

与主/系统内存相比,从PCIe设备访问数据的速度非常慢。
这与“随机访问”无关。
PCIe总线上的信息(例如数据检索)通过(高速)数据包完成(即使PCIe内存映射到处理器地址空间)

如果是这样的话,DMA基本上是一个单独的转储来加速频繁的随机访问,而内存映射IO是用来偶尔访问的

你误用了术语

如果软件写入效率低下或只需使用数据一次,则可能会访问PCIe内存

但如果软件要多次访问数据或认为“本地”拷贝更有效,则软件可以在主/系统内存中分配缓冲区,并使用PIO(CPU编程I/O)或DMA将数据从PCIe内存复制到主/系统内存(通过PCIe总线主机或系统DMA控制器直接访问内存)

计算机中广泛使用缓冲区。
“计算时间”的很大一部分用于缓冲、复制和移动数据。
I/O几乎总是在设备和主存中的缓冲区之间执行,即使可以直接进行设备到设备的传输。
不要将缓冲区的使用错误地标记为“DMA”

有关DMA的一些信息,请参见

CPU可以通过内存映射IO访问该内存,就像它是DRAM一样

你误用了术语。
您应该使用术语“主内存”,即系统内存或RAM,而不是“DRAM”。
在现代计算机上,主/系统存储器由某种类型的SDRAM(同步动态RAM)实现。
将功能术语(如主存储器)与硬件实现(如DDR3 SDRAM)混为一谈似乎无害,但可能导致错误的三段论或其他误解

内存映射可以将PCIe设备的内存放在与主内存相同的地址空间中

CPU可以通过DMA将此PCIe设备内存中的数据块传输到实际物理内存中。然后CPU可以自由访问物理内存

“真正的物理内存”是多余的。还有什么其他类型的“物理内存”? 没有“虚假的物理记忆”

您似乎将主存中缓冲区的使用称为“DMA”。
这是误导