初始化
- 注:初始化由网卡的驱动程序完成
- 在内存中为DMA开辟一段连续空间(这段内存也被称为DMA内存区),存储PD(Packet Descriptor)数组, PD数组是给网卡中的DMA Engine使用的,1个PD对应网卡接收或发送的1个数据包。注:不同的设备,PD结构不同,但是大致都有状态、长度和buffer pointer(指向数据包)3个成员。
- 初始化PD数组,状态为Empty,length为0
- DMA映射:在内存中再开辟多块内存(可以不连续)用来存放数据包,将这些内存块的物理地址赋值给PD的buffer pointer
接收数据包
- 当网卡NIC接收到数据包,放在网卡内部的Rx FIFO中
- 当一个数据包接收完成后,DMA Engine依次做以下事情:
- Fetch PD:遍历PD数组,直到找到当前PD状态为Empty为止
- Update PD:更新该PD状态为Ready;
- Move Data:把数据包从网卡的Rx FIFO中搬移到PD的buffer pointer指向的内存中;
- Generate Interrupt:数据搬移完成后,产生外部中断给指定的CPU Core;
- CPU Core处理外部中断,中断处理程序由网卡驱动程序实现。
- 此时数据包已经在该PD的buffer pointer指向的内存块中了,内核处理该数据包。
- 更新PD状态为Empty,重新进行DMA映射:再开辟一块内存,将这块内存的物理地址赋值给PD的buffer pointer