DMA传输RAM到RAM

17

我的朋友告诉我,在x86架构中,DMA控制器无法在两个不同的内存位置之间传输。它只能在内存和外围设备(如PCI总线)之间传输。

这是真的吗?

因为据我所知,DMA控制器应该能够在总线上任意设备之间进行传输,并具有地址。特别是如果源地址和目标地址都属于同一物理设备,我看不出有什么问题。


为什么要将 RAM 从一个位置复制到另一个位置?x86 有一个内存分页系统,因此任何内存页都可以在虚拟内存的任何地址上可见。 - GJ.
请更新此问题,分享您此后的经验。 - Gábor
3个回答

14

ISA (还记得吗?;-) DMA芯片当然有一个Fetch-and-Deposit传输类型。

但是,从MASM32论坛中:

嗨,

在《未公开的PC》(The Undocumented PC)中查找, 他说内存到内存DMA是可能的。然后他继续说 可能会有问题,限制,并且CPU可以比DMA硬件更快地进行复制 (386+上的MOVSD)。

因此似乎是“是的,您可以”,但谁关心它的事情。

问候,

Steve N.


哇!这很有趣。现在我明白为什么这样的转移可能会出现问题了。它不能在单个周期内完成...但另一方面,现代架构中有所谓的“双内存通道”。在这里,您可以在单个周期中读取+写入,不是吗? - valdo
无论如何,双周期传输可能会更慢。但是在这样的传输期间,CPU 可以用于其他事情。难道没有理由通过 DMA 进行这样的传输吗? - valdo
在这里,您可以在单个周期内进行读写操作,不是吗?除了其他可行性陷阱之外,我不确定,但我想象这种功能只有在模块未绑定时才可能实现,因此它们提供单独的总线,并且源和目标区域位于两个单独的存储模块上。这将严重限制其可用性。 - Andras Vass
4
通过DMA进行这样的传输总有理由吧?不过最好是完全避免复制。即使你不避免,也值得注意的是,目前CPU可以比内存子系统提供更快的数据消耗速度。由于你保持了内存控制器的占用,可能比你直觉预期的节省更少。例如,当对I/OAT进行基准测试时,其在接收方面提供了10%的CPU利用率节约,在发送方面则没有任何节约。(http://www.linuxfoundation.org/collaborate/workgroups/networking/i/oat) - Andras Vass
我似乎记得从《未记录的个人电脑》中提到,这涉及到占用旧的x86 DMA通道来进行内存刷新,并将其窃取一半用于传输,同时使用通常空闲的1通道进行写入部分。这不是问题,因为它通过使用它来引起刷新,但在需要它执行刷新的旧硬件上,在移动后不要忘记将其设置回默认值,否则您将迅速遇到内存问题! :-) - Brian Knoblauch
如果我有两个带有2个QPI直接链接和1个通过总线的QPI间接链接的CPU,我能否同时使用DMA复制和memcpy复制来实现最终的带宽? - huseyin tugrul buyukisik

8

是的,内存到内存的传输在80386系列中是可行的,我已经尝试过“现代”x86 :)

指定源和目标的RAM。您可能需要注意设备的一致性,具体取决于您正在编程的设备以及是否启用了缓存。

您可能会在Linux内核中找到一些代码,用于在阴影内存中刷新视频RAM页面。这让人想起了什么。


1
它是否与PCI/PCIex兼容?如何“注意一致性”?内存控制器芯片是否实际执行DMA? - Pyjong

2

肯定有一些DMA引擎不能在两个RAM地址之间传输数据,因此问题的第二部分已经基于错误的前提。


“DMA引擎”是什么意思?基于x86的不同芯片组,DMA控制器规格是否有所不同? - valdo
2
我理解你的第二段(或者第三段,如果你算上那个一行的)是一个普遍性的陈述。虽然我不使用x86的控制器,但我确实遇到过不能执行RAM到RAM传输的PowerPC DMA控制器,这就是为什么我发表了那个声明。 - lijie

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