以太网包的组成-docker部署python爬虫项目的方法步骤
10.6 DMA操作概述
DMA引擎利用存储器中的“接收描述符数组”和“发送描述符数组”来管理收发数据,与描述符对应的存储器缓冲区可以保存一个完整的以太网帧或其中的一部分。在发送以太网帧时,发送DMA引擎会利用“发送描述符”(一个或多个)将多个存储器片段中的数据“集中”起来,并按顺序发送出去。在接收以太网帧时,接收DMA引擎也根据所需要使用的“接收描述符”(一个或多个),将接收到的数据“分散”保存到多个存储器片段中。
描述符数组的基址寄存器,表示描述符数组入口数目的寄存器以及描述符数组输入/输出指针都包含在以太网模块中。描述符入口以及所有的发送包和接收包数据都存放在存储器中,它不是以太网模块的一部分。描述符入口告知相关的帧数据存放在存储器中的位置、数据如何处理,以及每个以太网处理结果的状态。
好奇DMA的具体工作原理吗?你可以参考这个详细的解释:DMA数据传输原理。而如果你想深入了解DMA控制器的操作,可以点击这里获取更多信息。
DMA引擎中的硬件控制了如何将以太网MAC的输入数据保存到存储器中,从而把与状态相关的片段保存起来,并针对输入的数据让硬件接收指针向前移动。驱动软件必须对接收到的数据的位置、描述符数据地址的更改进行处理(以避免不必要的数据移动),并让软件接收指针向前移动。这两个指针在描述符数组中创建了一个环形队列,它们允许DMA硬件和驱动软件知道在使用时哪个描述符(若有的话)是可用的,以及该描述符数组是为空还是为满。同样,驱动软件必须建立指向将被以太网MAC发送出去的数据的指针,给出每个数据片段的指令,并针对流出的数据让软件发送指针向前移动。DMA引擎中的硬件读取该信息并在可能的情况下将数据发送到以太网MAC接口,从而对状态进行更新并让硬件发送指针向前移动。
如果你对如何实现这些操作感兴趣,可以下载这个DMA控制器课件来了解更多技术细节。你还可以通过这个程序实际操作一下,看看DMA数据传输的效果。
10.7以太网包
图10.2描述了以太网包中的不同区域。
一个以太网包由一个导言、一个起始帧定界符和一个以太网帧组成。这个过程是否让你想起了一部电影的开场白?在深入了解以太网帧之前,不妨先浏览下以太网硬件,从硬件层面理解其工作原理会让你对整个流程有更清晰的认识!