本篇主要讲网卡的工作原理
最近在做一个网卡仿真程序。主要目的是用程序代替网卡去向内存中填充报文。
网卡与内存的交互方式
1. rx阶段
网卡通过DMA向内存中发送数据包。
在内存中主要有三个数据结构
① DMA环(rx_ring), 其中存储了DMA描述符, DMA描述符指向了实际物理地址(todo), NIC将根据DMA描述符内的address把收到的报文放到相应的地址中。并更改DMA的RX_USED
位, 让驱动程序知道NIC已经向这个槽里放置了报文。
② 软件环(sw_ring), 其中储存了报文池中的可用mbuf地址。
内存分布图:
pmd收包函数源代码分析, 以下代码只保留了重要部分
uint16_t recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
uint16_t nb_pkts)
{
struct macb_rx_queue *rxq;
unsigned int len;
unsigned int entry, next_entry;
struct macb_dma_desc *desc,