[TOC] ### **整体流程** - 网卡收到帧 - 网卡通过DMA机制把帧拷贝到环形队列(RingBuffer)中 - 网卡给CPU发送一个硬中断 - CPU根据中断类型执行网卡注册的硬中断处理函数 - 硬中断处理函数的主要功能是:(1)把网卡队列(napi_struct数据结构)加入到CPU的poll_list链表尾部(2)然后触发`NET_RX_SOFTIRQ`软中断 - CPU执行该软中断对应的处理函数`net_rx_action` - `net_rx_action`函数的主要功能是:(1)关闭CPU的硬中断(2)遍历CPU的poll_list链表(链表的每个节点可以看成是某个网卡的队列,可能有多个网卡),然后对于每个节点(其实就是每个网卡),调用该网卡注册的poll函数(轮询函数),把帧从RingBuffer中取出,组装成`sk_buff`数据结构,然后网卡的poll函数调用内核协议栈中的函数(比如`napi_gro_receive`)往内核协议栈进行传递 ### **FAQ** 1、关闭的是CPU的硬中断,还是网卡的硬中断? A:在`net_rx_action`函数中,一开始就调用了`local_irq_disable()`,猜测是关闭该CPU的硬中断。 2、硬中断什么时候开启? A:在`net_rx_action`函数中,有调用`local_irq_enable()`,需要看代码进一步确定什么时候开启硬中断