DMA及其映射

本文深入探讨了DMA(直接内存访问)的工作原理,包括DMA控制器如何管理总线控制权,以及DMA内存映射的三种类型:一致性映射、流式映射和分散/聚集映射。在Linux内核中,DMA层提供了标准接口以简化设备驱动程序的开发。硬件描述符是DMA传输的关键,包含了控制位、数据包地址、长度、环尾标和环链结等信息。文章还强调了DMA过程中cache一致性问题的解决策略,以及在不同架构上的一致性映射和流式映射的实现差异。
摘要由CSDN通过智能技术生成
1.DMA通道

DMA(Direct Memory Access)通道建立在设备和RAM之间,DMAC(DMA Controler)与设备I/O控制器相互作用共同实现数据传送。

在PC中,DMA控制器位于主板上负责管理I/O总线的南桥上。典型的PC架构的数据通道示意图如下:


DMAC(DMA Controller)一旦被CPU激活,就可以自行传送数据。在实现DMA传输时,由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。在DMA传输前,CPU要把总线控制权交给DMA控制器。在DMA传输后,DMAC发出一个中断请求,将总线控制权回交给CPU。DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。

需要明确的是,I/O设备内部一般自带缓存,即通常所说的设备内存。从数据传输的源宿角度分析,DMA通道的两端分别是RAM和设备内存。设备内存一般选用快速低功耗的SRAM材质,例如AR9331交换芯片PCU单元中有4KB的Tx FIFO和2KB的Rx FIFO,“The GE0 and GE1 support 2K transmit FIFO and 2K receive FIFO.”

使用DMAC最多的是磁盘驱动器和其他需要一次传送大量字节的慢速设备,例如PCI网卡(NIC)。

2.Linux中的DMA层

DMA操作的核心是DMA内存映射,包括一致性DMA映射、流式DMA映射和分散/聚集映射。以下是Linux内核DMA层的大体框架图:


从图中可以看出,Linux内核中的DMA层为设备驱动程序提供标准的DMA映射接口,例如一致性映射类型的dma_alloc_coherent和流式映射类型的dma_map_single。这些接口屏蔽了不同平台之间的差异,为设备驱动程序提供了良好的可移植性。

3.DMA描述符

SoC datasheet通常会提供DMA rx/tx的descriptor address和trigger control寄存器。在嵌入式软件开发中,DMA描述符数组是个很重要的概念。

DMA描述符数组(DMA Descriptor Array/Ring/Chain)是一个形如unsigned long* hw_desc[DESC_NUM]的指针数组,每个指针(hw_desc[i])指向一个描述符。这个描述符是由硬件定义的,其数据结构一般由datasheet或sdk定义。

3.1 硬件描述符(h/w descriptor)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值