每日一题--网络包如何唤醒WiFi路由器的CPU
记录时间2026年04月15日 星期三 21时30分一、问题你的 WiFi 路由器收到一个网络包后CPU 是被谁叫醒的这个问题听起来简单但它是理解WiFi 驱动开发、中断处理、内核调度的起点。二、核心结论硬中断负责通知软中断负责搬运队列负责中转。三、整体流程梳理3.1 基础要求该设备有 WiFi 模块且能够正常联网。3.2 大体流程概括版数据包 A 发向设备被 WiFi 模块拦截。WiFi 模块拦截后唤醒 CPU。CPU 唤醒后解析数据包。获得对应进程的端口号触发中断告知该进程。进程接收到对应数据进行处理。3.3 详细流程五步拆解第一步硬件敲门硬中断WiFi 模块收到完整数据包通过中断控制器向 CPU 发送硬件中断信号。CPU 执行网卡驱动中预先注册好的中断处理函数屏蔽网卡的中断表示已收到。通过 DMA 将数据包从网卡硬件缓冲区拷贝到内核sk_buff缓冲区。函数结束CPU 还给内核调度。第二步内核分拣软中断与 NAPI硬中断相当于给内核留下一张待办便条。内核在适当时机如系统调用返回、中断处理结束触发软中断NET_RX_SOFTIRQ。NAPI 机制驱动通过napi_schedule()把自己的 poll 函数挂到软中断处理队列中。第三步批量搬运驱动轮询软中断处理线程ksoftirqd被唤醒调用驱动的 poll 函数。poll 函数按内核预算循环从 Ring Buffer 取出数据包送往协议栈。第四步协议栈拆包与数据交付网络层解析 IP 头判断是发给本机还是转发。传输层解析 TCP/UDP 头根据端口号找到对应的struct sock。Socket 层数据被放入该 Socket 的接收队列。第五步应用取件唤醒进程进程调用read()或recv()等阻塞函数等待数据。数据进入接收队列后进程通过系统调用将内核态数据拷贝到用户态内存中。四、关键名词记录名词说明硬中断硬件控制器发出的信号需立即处理软中断OS 模拟的信号通过内核调度管理中断处理函数网卡驱动预先注册的处理函数DMA直接内存访问sk_buff内核中的数据包缓冲区结构NAPILinux 用于避免高流量下大量中断的机制struct sock内核中的套接字结构接收队列Socket 中存放接收数据的队列五、套接字结构struct sock的核心组成5.1 状态区协议规范sk_stateTCP 连接状态LISTEN / ESTABLISHED / CLOSE_WAIT 等。sk_prot函数指针表实现协议多态。TCP 执行tcp_sendmsg()复杂流量控制。UDP 执行udp_sendmsg()简单发包。5.2 队列区数据中转站sk_receive_queue接收队列链表头存放sk_buff。每个 Socket 有独立的struct sock只接收属于自己的数据。sk_write_queue发送队列数据发出前在此排队。5.3 资源管理区性能与限制sk_rcvbuf/sk_sndbuf接收/发送缓冲区大小限制。内核参数net.core.rmem_default即调整此值。sk_wq等待队列头。队列为空时调用recv的进程挂在此处休眠。数据到达后内核唤醒等待的进程。六、一个补充理解网卡硬件有其私有内存从硬件拷贝到内核态意味着数据从网卡硬件的私有内存搬运到内核程序可以访问和管理的内存区域。七、写在最后对我来说从软中断到应用获得数据包这一段流程最为重要硬件相关的细节可后续再深入。