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

Linux DMA和内存映射IO之间有什么区别?,linux,operating-system,linux-kernel,Linux,Operating System,Linux Kernel,DMA和内存映射IO之间有什么区别?它们看起来都很像我。内存映射I/O允许CPU通过读取和写入特定内存地址来控制硬件。通常,这将用于低带宽操作,例如更改控制位 DMA允许硬件在不涉及CPU的情况下直接读取和写入内存。通常,这将用于高带宽操作,如磁盘I/O或摄像头视频输入 本文对MMIO和DMA进行了全面的比较 内存映射IO意味着设备寄存器映射到机器的内存空间-当CPU读取或写入这些内存区域时,它是从设备读取或写入,而不是从实际内存读取或写入。要将数据从设备传输到实际内存缓冲区,CPU必须从内存映

DMA和内存映射IO之间有什么区别?它们看起来都很像我。

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

DMA允许硬件在不涉及CPU的情况下直接读取和写入内存。通常,这将用于高带宽操作,如磁盘I/O或摄像头视频输入

本文对MMIO和DMA进行了全面的比较


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


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

既然其他人已经回答了这个问题,我只想添加一点历史记录

回到过去,在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“位碰撞”模式。

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

另一方面,虚拟内存充当主内存和辅助内存之间的缓存。数据预先从辅助存储器(硬盘)提取到主存储器中,以便在需要时主存储器中已有数据可用。它允许我们在系统上运行比我们有足够物理内存支持的更多的应用程序


同样相关:;不过,首先阅读这里的答案对我帮助很大。在5000多个C文件中提到了Linux内核
DMA
,这可能就是为什么每个人都在谈论DMA的原因。所以它们基本上是一样的,但方向相反?不完全是这样。DMA是指两个不是CPU的设备使用内存总线进行通信(一个设备通常是主存,进程由CPU协调)。内存映射IO是CPU在内存总线上与非主内存的设备通信。为什么即使dma引擎在设备中也需要映射dma缓冲区?这是不正确的。您对内存映射I/O的假设实际上是编程I/O。内存映射I/O通常与端口映射I/O进行比较:CPU访问设备中数据的方式。