DMA是一类操作的统称,搞嵌入式编程的可能比较熟悉。
假设有一个任务:
memcpy(dst=0x1000, src=0x0, size=0x1000);
这个操作用一般memcpy的实现,就是类似楼主那种方式,cpu从头忙到尾,忙完了就copy完了。
但是,这个操作本质很简单,很多外设并不需要cpu辅助也可以自己实现。cpu只要告诉外设src和dst的地址,然后知道多少个时钟之后完成就行了。在很多硬件平台上,这种操作的实现可能是:
============================================================
dma_req dst, src, size
mov ecx, 0x200 #具体等待时间要根据实际情况算,这里假设等1024个时钟周期
_wait:
dec ecx
jnz _wait
============================================================
从上面可以看出cpu大部分时候是闲着的,编译器或者程序员可以自行利用这段空闲时间干别的工作。
-- DMA可以内存到内存吗?
要根据具体CPU、总线、外设的种类来判断,大多数情况可以内存到内存,可以外设到内存,可以内存到外设。
-- dma比cpu快吗?
不一定,但是dma设计没有浪费的话,一般情况下都可以达到总线的最大传输速度(扣除协议损耗)。常用总线协议有x86的pci-e和arm的axi,还有ddr接口的标准,感兴趣可以搜下它们的拓扑图和传输速率。我提到dma其实也就是因为这是memcpy理论上能达到的最快速度。
-- 内存到内存不影响cpu吗?
会影响cpu的cache的正确性。程序员需要根据情况打开/关闭cache。
-- 允许用户态使用dma吗?
要看操作系统有没有放开这个口子。技术上没有大问题。
这些知识在芯片ISA设计时会用到,学电子工程的人会熟悉一点。写游戏机模拟器的时候也会遇到。
【 在 ilovecpp (cpp) 的大作中提到: 】
: dma这个真不太懂
: dma可以内存到内存吗?
: dma比cpu快吗?内存到内存不影响cpu吗?
: 允许用户态使用dma吗?
: 另外glibc留了个口子,对齐到页时可以操作页表作拷贝。如果内核有这个调用,那应该是大块拷贝最快的了。
--
修改:javaboy FROM 114.84.111.*
FROM 114.84.111.*