1. 网卡接收数据过程
1.1 网络包通过物理介质传到接收端的phy芯片
1.2 phy芯片通过协议传到MAC芯片rx queue中
1.3 MAC芯片通过专用DMA将网络包搬运到网卡驱动程序预先分配好的rx ringbuffer中,当一个网络包搬运完后,给CPU触发中断
1.4 CPU响应网卡中断,关DMA中断,执行网卡驱动程序的中断处理函数,触发NET_TX软中断
1.5 将rx ringbuffer中的数据搬运到网络协议栈中处理,取完后DMA中断
1.6 网络协议栈层层处理后,网络接口层到网络层到传输层,将数据放到socket接收缓冲区
1.7 用户通过read/recv系列接口从socket接收缓冲区中取走数据
2. 操作系统内核收包过程
2.1 数据从外部网络到达网卡
2.2 网卡驱动以DMA方式,将数据从网卡写到内存中(内核态)
2.3 网卡驱动发送硬中断给CPU
2.4 CPU响应硬中断,简单处理后,发出软中断
2.5 ksoftirqd进程被软中断唤醒后,检测到软中断请求到达,调用poll函数轮询收包
2.6 数据从Ring buffer上摘下来,保存为一个skb
2.7 数据包交由各级协议栈处理,最终放入socket接收队列中
2.8 内核唤醒用户进程,通过socket接口,从接收队列中读取数据