Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C DMA将RAM传输到RAM_C_Windows_X86_Dma - Fatal编程技术网

C DMA将RAM传输到RAM

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

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

这是真的吗


因为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吗?