关于DMA的迷惑

由于我对硬件的一知半解,有个关于DMA的问题想问问各位大师。

QNX里对DMA的操作讲解很简单,先用mmap()拿到连续的物理地址,再用mem_offset64()拿到物理地址,再给DMA用。

问题是怎么个用法?下面怎么写程序我就不知道了。具体操作,DMA寄存器之类可以看文档,这个我也不大关心。我想知道:
如在X86下面,
1.我需要直接知道DMA芯片的物理地址并直接操作吗?如我的笔记本电脑,DMA地址是多少怎么知道?! 如果有几个进程同时直接操作,会不会同步方面的问题?
2. 还是说有一些函数调用。
3.又或者说有哪个DDK之类可以参考。
4.其它的架构如PPC,ARM等做法又是否一样呢?
谢谢!

硬件的知识我也不是很清楚,试试吧。

首先有 DMA 控制器,x86的话就是南桥吧。PCI上的设备要DMA,会同DMA控制器通讯,设定DMA通道,并把自己变成总线管理者(BUS Master)。

但这个过程是硬件完成的。从软件的角度来讲,把数据准备好,地址交给你的PCI设备后,只要在PCI设备的某个寄存器里打开DMA就行了。PCI设备会同DMA控制器协调完成DMA动作,最后发生个中断告诉你DMA结束了。

PCI设备的DMA应改是标准的,所以在PPC/ARM上做法是一样的。

有一些板子上,有非PCI设备的DMA,这进候,通常BSP里会有一个DMA资源管理器,这些设备的驱动会同这个DMA资源管理器通讯来完成一个DMA动作。