C DMA将RAM传输到RAM
我的一个朋友告诉我,在x86体系结构上,DMA控制器不能在两个不同的RAM位置之间传输。它只能在RAM和外围设备(如PCI总线)之间传输 这是真的吗C DMA将RAM传输到RAM,c,windows,x86,dma,C,Windows,X86,Dma,我的一个朋友告诉我,在x86体系结构上,DMA控制器不能在两个不同的RAM位置之间传输。它只能在RAM和外围设备(如PCI总线)之间传输 这是真的吗 因为AFAIK DMA控制器应该能够在位于总线上并具有地址的任意设备之间切换。特别是,如果源地址和目标地址都属于同一个物理设备,我认为没有问题。肯定有DMA引擎不能在两个ram地址之间传输,因此问题的第二部分已经基于一个不正确的前提。ISA(记住?;-)DMA芯片肯定有传输类型 然而,从以下方面: 嗨 正在签入“未记录的PC”, 他说内存对内存的D
因为AFAIK DMA控制器应该能够在位于总线上并具有地址的任意设备之间切换。特别是,如果源地址和目标地址都属于同一个物理设备,我认为没有问题。肯定有DMA引擎不能在两个ram地址之间传输,因此问题的第二部分已经基于一个不正确的前提。ISA(记住?;-)DMA芯片肯定有传输类型 然而,从以下方面: 嗨 正在签入“未记录的PC”, 他说内存对内存的DMA是 可能的他接着说 可能存在问题、限制, CPU可以进行复制 无论如何都比DMA硬件快 (386+上的MOVSD 所以这似乎是一个“是”,你可以, 但谁在乎呢,诸如此类的事 问候, 史蒂夫N
是的,对于80386系列,内存到内存的传输是可能的,我用“现代”x86尝试过:) 为源和目标指定RAM。您可能需要注意一级缓存的一致性,这取决于您正在编程的设备以及是否启用了缓存
您可能会在Linux内核中找到一些代码,用于刷新阴影内存中的视频RAM页面。这听起来很有道理。你说的“DMA引擎”是什么意思?基于x86的不同芯片组的DMA控制器规格会有所不同吗?我把你的第二段(或者第三段,如果你算上一行的话)解释为一般性的陈述。我不使用x86,但我确实遇到过powerpc dma控制器无法执行ram到ram的传输,这就是我为什么这么说的原因。哇!这很有趣。现在我明白了为什么这样的转移会有问题。这不可能在一个周期内完成。。。但是,现代的体系结构中有一个所谓的“双内存通道”。在这里,你可以在一个周期内读写,不是吗?无论如何,双周期传输可能会慢一些。然而,在这种传输过程中,CPU可能被用于其他用途。难道没有理由通过DMA进行这种传输吗?
在这里,你可以在一个周期内读写,不是吗?
我对此不是百分之百的肯定,但除了其他可行性陷阱,我认为只有在模块未更改的情况下,这一壮举才有可能实现,因此,它们提供独立的总线,源和目标区域位于两个独立的内存模块上。这将严重限制其可用性。是否有理由通过DMA进行此类传输?
好吧,最好避免完全复制。即使您不这样做,也值得注意的是,就目前的情况来看,CPU消耗数据的速度比内存子系统提供的速度快得多。由于内存控制器一直处于占用状态,因此节省的内存可能比您直观预期的要少。例如,当对I/OAT()进行基准测试时,它在接收时可以节省10%的CPU利用率,而在发送时则没有。我似乎从“未记录的PC”中回忆起,它涉及到使用保留用于内存刷新的旧x86 DMA通道,并在传输的一半时间内窃取该通道,而在写入部分使用1个正常可用的通道。这不是一个问题,因为使用它会导致刷新,但在需要刷新的旧硬件上,请不要忘记在移动后将其设置回默认值,否则您将很快遇到内存问题!:-)为什么要将RAM从一个位置复制到另一个位置?x86有一个内存分页系统,所以任何内存页都可以在任何地址的虚拟内存中看到。它与PCI/PCIex一起工作吗?如何“注意连贯性”?内存控制器芯片真的执行DMA吗?