10.6 DMA操作概述

DMA引擎利用存储器中的“接收描述符数组”和“发送描述符数组”来管理收发数据,与描述符对应的存储器缓冲区可以保存一个完整的以太网帧或其中的一部分。在发送以太网帧时,发送DMA引擎会利用“发送描述符”(一个或多个)将多个存储器片段中的数据“集中”起来,并按顺序发送出去。在接收以太网帧时,接收DMA引擎也根据所需要使用的“接收描述符”(一个或多个),将接收到的数据“分散”保存到多个存储器片段中。描述符数组的基址寄存器,表示描述符数组入口数目的寄存器以及描述符数组输入/输出指针都包含在以太网模块中。描述符入口以及所有的发送包和接收包数据都存放在存储器中,它不是以太网模块的一部分。描述符入口告知相关的帧数据存放在存储器中的位置、数据如何处理,以及每个以太网处理结果的状态。

你是否好奇DMA驱动的实现原理?可以参考DMA操作原理,那里有详细的解释。为了更深入地了解DMA驱动代码的具体实现,不妨看看DMA驱动代码的介绍。

DMA引擎中的硬件控制了如何将以太网MAC的输入数据保存到存储器中,从而把与状态相关的片段保存起来,并针对输入的数据让硬件接收指针向前移动。驱动软件必须对接收到的数据的位置、描述符数据地址的更改进行处理(以避免不必要的数据移动),并让软件接收指针向前移动。这两个指针在描述符数组中创建了一个环形队列,它们允许DMA硬件和驱动软件知道在使用时哪个描述符(若有的话)是可用的,以及该描述符数组是为空还是为满。同样,驱动软件必须建立指向将被以太网MAC发送出去的数据的指针,给出每个数据片段的指令,并针对流出的数据让软件发送指针向前移动。DMA引擎中的硬件读取该信息并在可能的情况下将数据发送到以太网MAC接口,从而对状态进行更新并让硬件发送指针向前移动。

关于DMA控制器的详细操作,可以查阅dma控制器操作。如果你对Linux DMA驱动的构架分析感兴趣,Linux DMA驱动构架分析是一篇不错的文章。

10.7 以太网包

图10.2描述了以太网包中的不同区域。图10.2以太网包的组成一个以太网包由一个导言、一个起始帧定界符和一个以太网帧组成。

这段内容真是让人对以太网包充满了好奇!想要更具体地理解?或许你会对详解linux dma驱动编写Linux设备驱动之DMA感兴趣。那里有更多的细节供你探索。