内存映射的IO与DMA?

问题描述 投票:0回答:2

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

DMA:

在进行第一个DMA之前,CPU必须设置RAM地址范围之类的内容,以供设备用于DMA。设置工作完成后,设备是否可以基本上拥有RAM的那一部分随意启动传输,还是在每次单次DMA传输之前仍必须再次从CPU获得某种许可?]

MMIO:

CPU通过mmio访问设备内存比CPU访问RAM贵,但是我可以在桌面上看到pci设备为mmio保留了数百兆字节,这是一个可以有效使用的示例(相对于使用DMA将数据复制回RAM,然后访问它们)?

io linux-kernel dma memory-mapping
2个回答
1
投票

CPU可以通过内存映射的IO来访问该内存,就好像它是DRAM。

您滥用术语。您应该使用术语“主内存”(也称为系统内存或RAM)来代替“ DRAM”。在现代计算机上,主/系统内存由某种类型的SDRAM(同步动态RAM)实现。将功能性术语(例如主内存)与硬件实现(例如DDR3 SDRAM)混为一谈似乎无害,但可能会导致错误的三段论,即"RAM is volatile"或其他误解。

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

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

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

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

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

您似乎在滥用术语。您可能需要学习this article on PCIe

是因为PCIe总线的随机访问速度很慢?

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

并且如果是这样,DMA基本上是一个转储,可以加快频繁的随机访问速度,而内存映射的IO是偶尔访问的?

您滥用术语。

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

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

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

有关DMA的某些信息,请参见Why driver need to map DMA buffers when dma-engine is in device?dma vs interrupt-driven i/o


0
投票

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

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

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

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

CPU根本不使用DMA。 DMA的全部目的是允许CPU在设备执行DMA时执行其他操作(或不执行任何操作)。最终结果是整个系统的显着性能提升-例如CPU做许多其他工作,而许多设备(硬盘驱动器控制器,视频卡,音频卡,网卡等)也使用DMA来传输数据。

© www.soinside.com 2019 - 2024. All rights reserved.