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

bre*_*ett 24 linux operating-system linux-kernel

DMA和内存映射IO有什么区别?他们看起来都和我差不多.

Gre*_*ill 40

内存映射I/O允许CPU通过读写特定内存地址来控制硬件.通常这将用于低带宽操作,例如改变控制位.

DMA允许硬件直接读写内存而不涉及CPU.通常,这将用于高带宽操作,例如磁盘I/O或摄像机视频输入.

  • 不完全是。DMA 是指两个非 CPU 的设备使用内存总线进行通信(其中一个设备通常是主内存,并且进程由 CPU 编排)。内存映射 IO 是 CPU 与内存总线上的设备(而非主内存)进行通信。 (2认同)

Eri*_*nen 22

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

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

大多数设备都使用I/O空间来控制接口和批量数据传输接口.访问数据的简单方法是执行大量CPU指令,一次一个字地将数据从I/O地址传输到存储器地址(有时称为"bit-banging".)

为了自动地将数据从设备移动到主机存储器,ISA总线协议中不支持设备启动传输.发明了折衷解决方案:DMA控制器.这是一块由CPU占用的硬件并启动传输以将数据从设备的I/O地址移动到内存,反之亦然.因为I/O地址是相同的,所以DMA控制器正在执行与CPU相同的操作,但更高效一点,并允许一些自由在后台运行(尽管可能不会很长时间,因为它不能与记忆交谈).

快进到PCI的时代,总线协议变得更加智能:任何设备都可以启动传输.因此,例如,RAID控制器卡可以随时移动它喜欢的任何数据或从主机移动任何数据.这被称为"总线主控"模式,但是没有特别的原因,即使旧的DMA控制器早已消失,人们仍继续将此模式称为"DMA".与旧的DMA传输不同,通常根本没有相应的I/O地址,总线主模式通常是设备上唯一存在的接口,根本没有CPU"bit-banging"模式.

  • 在Linux内核中,超过5000个C文件中提到了"DMA",这可能是每个人都在谈论DMA的原因. (5认同)

caf*_*caf 14

内存映射IO意味着设备寄存器映射到机器的内存空间 - 当CPU读取或写入这些内存区域时,它正在读取或写入设备,而不是实际内存.要将数据从器件传输到实际的存储器缓冲区,CPU必须从存储器映射的器件寄存器中读取数据并将其写入缓冲区(反之,将数据传输到器件).

通过DMA传输,设备能够直接向实际内存缓冲区本身传输数据.CPU告诉设备缓冲区的位置,然后在设备直接访问内存时执行其他工作.