【linux】【网络】网卡驱动收发包过程

RX过程
初始化阶段(配置网卡多队列)
1,网卡驱动创建rx descriptor ring,将ring的总线地址写入网卡寄存器
2,网卡驱动为每个descriptor分配sk_buff和数据缓存区
数据接收阶段(处理首包和后续包的区别)
3,网卡接收数据包,将数据包写入RX FIFO(如何处理第一个数据包?)
4,DMA找到rx descriptor ring中下一个需要使用的descriptor
5,整个数据包写入RX FIFO后,DMA通过PCI总线将数据包复制到descriptor的数据缓存区
6,复制完后,网卡启动硬件中断通知CPU数据缓存区中已经有新的数据包,CPU执行硬中断函数(硬中断处理了啥?使用NAPI轮询,减少硬件中断,调用软中断)
7,ksoftirqd执行软中断函数(软中断处理了啥?会执行网卡驱动中的函数吗?)
8,网卡驱动通过netif_receive_skb将sk_buff上送协议栈
9,释放ring环中的descriptor和缓存

注意点:
1,ring环中存放descriptor,指向数据
2,DMA到内存中的数据,需要软中断中的驱动函数处理成skb

TX过程
初始化阶段(配置网卡多队列)
1,网卡驱动创建tx descriptor ring,将ring的总线地址写入网卡寄存器
2,网卡驱动为每个descriptor分配sk_buff和数据缓存区
数据发送阶段
3,协议栈通过dev_queue_xmit将sk_buff送至网卡驱动
4,网卡驱动将sk_buff放至tx descriptor ring,更新TDT(网卡驱动需要处理skb数据)
5,DMA感知到TDT变化,找到tx descriptor ring中下一个需要使用的descriptor
6,DMA通过PCI总线将数据包复制到TX FIFO
7,复制完成后,通过MAC芯片将数据包发送出去
8,发送完成后,网卡更新TDH,启动硬中断通知cpu释放数据缓存区中的数据包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值