DMA和内存映射IO有什么区别?在我看来它们非常相似。
DMA和内存映射IO有什么区别?在我看来它们非常相似。
由于其他人已经回答了这个问题,我只想补充一点历史。
在早期的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“位劈”模式。
内存映射IO指的是将设备寄存器映射到计算机的内存空间中 - 当CPU读取或写入这些内存区域时,它读取或写入的是设备,而不是实际的内存。为了将数据从设备传输到实际内存缓冲区,CPU必须从内存映射的设备寄存器中读取数据并将其写入缓冲区(将数据传输到设备时也是相同的过程)。
DMA传输可以使设备直接将数据传输到或从真实的内存缓冲区中。 CPU告诉设备缓冲区的位置后,它可以在设备直接访问内存时执行其他工作。