网卡,dma,内存关系

本文探讨了网卡如何通过DMA在RX阶段向内存发送数据包,并在TX阶段发送报文。在RX阶段,网卡使用DMA描述符将接收到的报文存入内存,更新USED位。在TX阶段,NIC处理TX_USED=1的槽位发送报文。模拟NIC的关键在于控制USED位和处理报文数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇主要讲网卡的工作原理

最近在做一个网卡仿真程序。主要目的是用程序代替网卡去向内存中填充报文。

网卡与内存的交互方式

1. rx阶段

网卡通过DMA向内存中发送数据包。
在内存中主要有三个数据结构
① DMA环(rx_ring), 其中存储了DMA描述符, DMA描述符指向了实际物理地址(todo), NIC将根据DMA描述符内的address把收到的报文放到相应的地址中。并更改DMA的RX_USED位, 让驱动程序知道NIC已经向这个槽里放置了报文。
② 软件环(sw_ring), 其中储存了报文池中的可用mbuf地址。

内存分布图:

image.png
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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值