收报分析¶
基本流程¶
- 报文到达网卡
- 网卡硬件或网卡驱动根据MAC过滤报文
- 网卡通过DMA将报文存入RAM中,内核sk_buff形式
- 网卡将报文描述符存入环形接收队列,
- rx-usecs 指定网卡在收到第一个数据包后,等待多少微秒(usecs,微秒)再触发一次中断。如果在这段时间内有更多包到达,会一起处理,减少中断次数,提高性能。
- rx-frames 指定网卡在收到多少个数据包后,无论时间是否到达 rx-usecs,都立即触发中断。
- 网卡发起硬件中断,通知内核有报文
通过 /proc/interrupts查看硬件中断
-
CPU运行中断处理程序,即驱动代码
CPU处理网卡硬件中断时,首先会调用网卡驱动注册的中断处理函数(Interrupt Handler)。在Linux内核中,这通常是驱动通过request_irq()注册的回调函数,称为ISR(Interrupt Service Routine)。 简要流程如下: 硬件中断发生 内核中断子系统调度 调用网卡驱动的中断处理函数(如 e1000_intr(), igb_intr(), napi_poll() 等,具体函数名依网卡驱动而定) 中断处理函数负责读取网卡状态、收包、唤醒NAPI poll等操作
-
驱动触发收报软中断
ksoftirqd/cpu-number 收报 /proc/softirqs
-
NAPI 从接收队列读取报文 netdev_budget_usecs netdev_budget dev_weight
- linux申请sk_buff 填充原始数据,接口,移除eth
- 送完内核协议栈 netif_receive_skb