linux DMA与内存MapIO之间有何区别?

5cg8jx4n  于 2023-08-03  发布在  Linux
关注(0)|答案(5)|浏览(164)

DMA与内存MapIO之间有何区别?他们两个看起来都和我很像。

l0oc07j2

l0oc07j21#

内存MapI/O允许CPU通过阅读和写入特定的内存地址来控制硬件。通常,这将用于低带宽操作,例如改变控制位。
DMA允许硬件直接读取和写入内存 *,而 * 不涉及CPU。通常,这将用于高带宽操作,如磁盘I/O或摄像机视频输入。
本文对MMIO和DMA进行了比较。
Design Guidelines for High Performance RDMA Systems

xyhw6mcr

xyhw6mcr2#

既然其他人已经回答了这个问题,我就再补充一点历史。
回到过去,在x86(PC)硬件上,只有I/O空间和内存空间。这是两个不同的地址空间,用不同的总线协议和不同的CPU指令访问,但能够通过同一个插件卡插槽进行通信。
大多数设备都将I/O空间用于控制接口和批量数据传输接口。访问数据的简单方法是执行大量的CPU指令,一次一个字地将数据从I/O地址传输到内存地址(有时称为“位碰撞”)。
为了自主地将数据从设备移动到主机存储器,伊萨总线协议中不支持设备发起传输。一个折中的解决方案被发明出来:DMA控制器这是一个由CPU支持的硬件,它启动传输,将数据从设备的I/O地址移动到内存,反之亦然。由于I/O地址相同,DMA控制器执行与CPU完全相同的操作,但效率更高,并允许在后台运行一些自由(尽管可能不会很长时间,因为它不能与内存对话)。
快进到PCI时代,总线协议变得更加智能:任何设备都可以发起传输。因此,RAID控制器卡可以随时将任何数据移动到主机或从主机移动数据。这被称为“总线主控”模式,但没有特别的原因,人们继续将这种模式称为“DMA”,即使旧的DMA控制器早已不复存在。与旧的DMA传输不同,通常根本没有对应的I/O地址,总线主模式通常是设备上唯一的接口,根本没有CPU“位碰撞”模式。

9jyewag0

9jyewag03#

内存MapIO意味着设备寄存器被Map到机器的内存空间-当CPU读取或写入这些内存区域时,它是从设备阅读或写入,而不是真实的内存。为了将数据从设备传输到实际的存储器缓冲区,CPU必须从存储器Map的设备寄存器读取数据并将其写入缓冲区(并且将数据传输到设备的情况匡威)。
通过DMA传输,设备能够直接将数据传输到真实存储器缓冲区本身或从真实的存储器缓冲区本身传输数据。CPU告诉设备缓冲区的位置,然后可以在设备直接访问内存的同时执行其他工作。

ecbunoof

ecbunoof4#

直接存储器访问(DMA)是一种在没有CPU干预的情况下将数据从I/O传输到存储器以及从存储器传输到I/O的技术。为此,一个特殊的芯片,命名为DMA控制器,是用来控制所有的活动和同步的数据。因此,与其他数据传输技术相比,DMA要快得多。
另一方面,虚拟内存充当主存储器和辅助存储器之间的高速缓存。数据预先从辅助存储器(硬盘)取入主存储器中,使得数据在需要时已经在主存储器中可用。它允许我们在系统上运行比我们有足够的物理内存支持更多的应用程序。
x1c 0d1x的数据

uoifb46i

uoifb46i5#

答案忽略了这样一个事实,即DMA可以由CPU使用,以便写入/读取I/O设备,而无需不断检查/被单个字符中断(编程I/O vs中断驱动I/O vs DMA主题)

相关问题