我的一个朋友告诉我,在 x86 架构上,DMA 控制器不能在两个不同的 RAM 位置之间传输。它只能在 RAM 和外围设备(如 PCI 总线)之间传输。
这是真的?
因为 AFAIK DMA 控制器应该能够在位于 BUS 上并具有地址的任意设备之间。特别是,如果源地址和目标地址都属于同一个物理设备,我认为没有问题。
ISA(还记得吗?;-) DMA 芯片肯定有Fetch-and-Deposit传输类型。
但是,来自MASM32 论坛:
你好,
检查“未记录的 PC”,他说内存到内存 DMA 是可能的。然后他继续说可能存在问题、限制,并且 CPU 可以比 DMA 硬件更快地进行复制(386+ 上的 MOVSD)。
所以这似乎是一个是的,你可以,但谁在乎,那种事情。
问候,
史蒂夫·N。
是的,内存到内存的传输可以达到我尝试过的“现代”x86 的 80386 系列 :)
为源和目标指定 RAM。您可能需要注意 L1 缓存的一致性,具体取决于您正在编程的设备以及是否启用了缓存。
您可能会在 Linux 内核中找到一些代码,用于刷新影子内存中的视频 RAM 页面。这敲响了警钟。
肯定有 DMA 引擎不能在 2 个 ram 地址之间传输,所以问题的第二部分已经基于一个不正确的前提。