【问题标题】:DMA transfer RAM-to-RAMDMA 传输 RAM 到 RAM
【发布时间】:2010-11-28 15:37:22
【问题描述】:

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

这是真的吗?

因为 AFAIK DMA 控制器应该能够在位于 BUS 上并具有地址的任意设备之间。特别是,如果源地址和目标地址属于同一个物理设备,我认为没有问题。

【问题讨论】:

  • 为什么要将 RAM 从一个位置复制到另一个位置? x86 有一个内存分页系统,因此任何内存页面都可以在虚拟内存中的任何地址可见。

标签: c windows x86 dma


【解决方案1】:

ISA(还记得吗?;-)DMA 芯片肯定有Fetch-and-Deposit 传输类型。

但是,来自MASM32 forums

嗨,

签入“无证电脑”, 他说内存到内存 DMA 是 可能的。然后他继续说 可能存在问题、限制、 并且 CPU 可以进行复制 无论如何都比 DMA 硬件快 (386+ 上的 MOVSD)。

所以看起来是的,你可以, 但谁在乎呢。

问候,

史蒂夫·N.

【讨论】:

  • 哇!这很有趣。现在我明白了为什么这种转移可能会出现问题。它不能在一个周期内完成......但是OTOH有现代架构,你有一个所谓的“双记忆通道”。在这里你可以在一个周期内读+写,不是吗?
  • 无论如何,双周期传输可能会更慢。然而,在这种传输过程中,CPU 可能会用于其他用途。难道没有理由通过 DMA 进行这样的传输吗?
  • Here you can read+write in a single cycle, can't you? 对此我不是百分百肯定,但除了其他可行性陷阱之外,我想这个壮举只有在模块未组合的情况下才有可能,因此它们提供单独的总线和源和目标区域位于两个独立的内存模块上。这将严重限制其可用性。
  • Isn't there a reason anyway to do such a transfer via DMA? 好吧,最好完全避免复制。即使您不这样做,也可能值得注意的是,就目前的情况而言,CPU 消耗数据的速度比内存子系统所能提供的快得多。由于您一直占用内存控制器,因此节省的费用可能比您直观预期的要少。例如。 I/OAT (linuxfoundation.org/collaborate/workgroups/networking/i/oat) 在进行基准测试时,在接收和发送时节省了 10% 的 CPU 使用率。
  • 我似乎从“The Undocumented PC”中回忆起,它涉及使用为内存刷新保留的旧 x86 DMA 通道并在传输的一半时窃取该通道,同时使用 1 个通常空闲的通道进行写入部分。这不是问题,因为它会通过使用它导致刷新,但是在需要它进行刷新的旧硬件上,不要忘记在移动后将其设置回默认值,否则您会很快遇到内存问题! :-)
【解决方案2】:

是的,内存到内存的传输是可能的,直到我用“现代”x86 尝试过的 80386 系列 :)

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

您可能会在 Linux 内核中找到一些代码,用于刷新影子内存中的视频 RAM 页面。这敲响了警钟。

【讨论】:

  • 它是否适用于 PCI/PCIex?如何“注意连贯性”?内存控制器芯片是否真的做 DMA?
【解决方案3】:

肯定有 DMA 引擎不能在 2 个 ram 地址之间传输,所以问题的第二部分已经基于一个不正确的前提。

【讨论】:

  • “DMA 引擎”是什么意思?基于 x86 的不同芯片组的 DMA 控制器规格是否有所不同?
  • 我将您的第二个(或第三个,如果您算上单行的话)段落解释为一般性陈述。我不使用 x86 的,但我肯定遇到过 powerpc dma 控制器无法执行 ram 到 ram 传输,这就是我发表此声明的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2020-10-07
  • 2018-05-03
  • 1970-01-01
相关资源
最近更新 更多