DMA分为两种:
1 本地DMA(native DMA)
此种方式不要求IO外设具有DMA控制器件,只是使用主机自带的独立DMA控制器负责传输,连接到PC机PCI/ISA总线桥上8237DMA控制器就属于此类,外设通过申请DMA通道请求DMA传输。
8237有4个通道,PC机上以级联的方式存在两个8237控制器,在PC机上0号通道用于DRAM refresh,2号通道用于floppy disk,4号通道固定用于级联cascading。在PC机上8237不能实现PCI设备的DMA传输功能。
除了正常的memory to io和io to memory的方式8237仅使用1个通道外,memory to memory的方式8237是通过固定申请0号和1号通道来完成的。其中0号为读方式(from memory),1号为写方式(to memory),0号地址寄存器为源地址,1号为目的地址,1号通道的count寄存器为需要传输字节的计数器,DREQ请求信号通过写0号通道的软件请求寄存器的方式发出。详见8237datasheet
2 总线主控式DMA(bus-master)
大多数DMA方式均为总线主控式DMA,包括ARM和PPC。总线主控式DMA的意思是CPU配置完总线DMA控制器后,让出总线控制权给DMA控制器,其后的数据传输完全由DMA控制器负责,传输完毕后中断通知CPU,CPU接管总线控制权。这种方式主要是CPU配置DMA控制器需要传输的数据的源地址、目的地址、长度等寄存器,之后是能DMA控制器即可。
本地和总线主控式DMA两种方式使用的地址参数都是DMA总线地址,总线地址不同于物理地址和虚拟地址,但在x86体系结构中总线地址数值等于物理地址。两种方式都需要CPU首先申请用于DMA传输的缓冲区,至于申请一致性coherent还是流式streamingDMA缓冲区则因系统和用途而定。
阅读(1056) | 评论(0) | 转发(0) |