DMA和内存映射IO之间有什么区别?

42

DMA和内存映射IO有什么区别?在我看来它们非常相似。


还有相关的内容:Linux设备驱动程序第二版:第13章:mmap和DMA; 不过,先在这里阅读答案对我帮助很大。 - sdaau
5个回答

54
内存映射I/O允许CPU通过读写特定的内存地址来控制硬件。通常,这用于低带宽操作,如更改控制位。
DMA允许硬件直接读写内存,而不涉及CPU。通常,这用于高带宽操作,如磁盘I/O或摄像头视频输入。
这里有一篇论文对MMIO和DMA进行了详细比较。 《高性能RDMA系统设计指南》

所以它们基本上是相同的东西,只是方向相反? - Jacquelyn.Marquardt
2
并不完全正确。DMA是指两个不是CPU的设备使用内存总线进行通信(其中一个设备通常是主存储器,并由CPU协调该过程)。而内存映射IO是CPU与在内存总线上的设备进行通信,但该设备不是主存储器。 - jdizzle
即使DMA引擎在设备中,为什么仍需要映射DMA缓冲区? - ransh
1
这不是正确的。你所假设的内存映射I/O实际上是编程I/O。内存映射I/O通常与端口映射I/O进行比较:CPU访问设备中的数据的方式。 - Han XIAO

34

由于其他人已经回答了这个问题,我只想补充一点历史。

在早期的x86(PC)硬件上,只有I/O空间和内存空间。这是两个不同的地址空间,使用不同的总线协议和不同的CPU指令进行访问,但能够通过同一个插入卡槽进行通信。

大多数设备都使用I/O空间来控制接口和大容量数据传输接口。访问数据的简单方法是执行大量的CPU指令,逐个字从I/O地址传输数据到内存地址(有时称为“位劈”)。

为了使设备能够自主地将数据从设备移动到主机内存,ISA总线协议中没有支持设备发起传输的功能。一种妥协的解决方案被发明出来:DMA控制器。这是一种硬件设备,位于CPU附近,启动传输以将数据从设备的I/O地址移动到内存或反之亦然。由于I/O地址相同,DMA控制器执行的操作与CPU相同,但效率更高,并允许一些自由度在后台运行(尽管可能无法长时间运行,因为它无法与内存通信)。

快进到PCI时代,总线协议变得更加智能:任何设备都可以发起传输。因此,例如RAID控制器卡可以随时将其喜欢的任何数据移动到或从主机中。这被称为“总线主控”模式,但出于没有特定原因的考虑,人们继续将此模式称为“DMA”,即使旧的DMA控制器早已消失。与旧的DMA传输不同,通常根本没有相应的I/O地址,并且总线主控模式通常是设备上唯一的接口,没有CPU“位劈”模式。


8
在Linux内核中,超过5000个C文件都提到了“DMA”,这可能是为什么每个人仍在谈论DMA的原因。 - JohnnyFromBF
理论上,PCI总线主控是PCI设备的“直接内存访问”,它变成了一个像现在很多东西一样的广义概念。例如,“内存”不仅仅是RAM/VRAM,还可以是磁盘上的虚拟内存。对于移动电话,“内存”甚至可能意味着“存储”,这在一开始我并不习惯。 - crazii

30

内存映射IO指的是将设备寄存器映射到计算机的内存空间中 - 当CPU读取或写入这些内存区域时,它读取或写入的是设备,而不是实际的内存。为了将数据从设备传输到实际内存缓冲区,CPU必须从内存映射的设备寄存器中读取数据并将其写入缓冲区(将数据传输到设备时也是相同的过程)。

DMA传输可以使设备直接将数据传输到或从真实的内存缓冲区中。 CPU告诉设备缓冲区的位置后,它可以在设备直接访问内存时执行其他工作。


3

直接内存访问(DMA)是一种技术,可以在不需要CPU干预的情况下将数据从I/O传输到内存,以及从内存传输到I/O。为此,使用一个名为DMA控制器的专用芯片来控制所有活动和数据同步。因此,与其他数据传输技术相比,DMA更快。

另一方面,虚拟内存充当主内存和辅助存储器之间的缓存。提前将数据从辅助存储器(硬盘)中获取到主内存中,以便在需要时数据已经可用于主内存中。它使我们能够在系统上运行更多的应用程序,而不需要足够的物理内存来支持。

enter image description here


0
答案忽略了一个事实,即DMA可以被CPU用来与I/O设备进行读写,而无需不断检查或被单个字符中断(编程I/O vs 中断驱动I/O vs DMA主题)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接