nginx学习二

一、网卡将数据写入内存后的处理过程。
1、数据由网卡通过DMA写入内存。
2、网卡通过硬中断告知CPU有数据写入内存。
3、CPU根据中断表,调用已经注册的中断函数,已注册的中断函数,调用网卡驱动中相应的程序。

4、驱动禁用网卡的硬中断。
5、驱动启用软中断。
6、内核ksoftirqd处理软中断,ksoftirqd调用网络模块net_rx_action函数。
7、net_rx_action函数调用网卡驱动的poll函数一个接一个的读取网卡写到内存中的数据包,内存中数据包的格式只有驱动知道。
8、网卡驱动程序将内存中的数据包转换成内核网络模块能识别的skb格式。
9、网卡驱动调用gro对数据包进行合并,判断是否开启了RPS。
9.1、如果开启RPS,调用enqueue_to_backlog,将数据包放入CPU的softnet_data结构体的input_pkt_queue中,调用__netif_receive_skb_core。(如果input_pkt_queue满了的话,该数据包将会被丢弃,queue的大小可以通过net.core.netdev_max_backlog来配置)。
9.2、如果没开启RPS,napi_gro_receive会直接调用__netif_receive_skb_core。
10.1、看是不是有AF_PACKET类型的socket(也就是我们常说的原始套接字),如果有的话,拷贝一份数据给它packet taps(AF_PACKET)。tcpdump抓包就是抓的这里的包。
10.2、调用协议栈相应的函数,将数据包交给协议栈处理。
11、待内存中的所有数据包被处理完成后(即poll函数执行完成),启用网卡的硬中断,这样下次网卡再收到数据的时候就会通知CPU。

在这里插入图片描述
注:1、ksoftirqd:进程专门负责软中断的处理
2、硬中断:硬件自己生成,具有随机性,硬中断被CPU接收后,触发执行中断处理程序。中断处理程序只会处理关键性的、短时间内可以处理完的工作,剩余耗时较长工作,会放到中断之后,由软中断来完成。硬中断也被称为上半部分。
3、软中断:由硬中断对应的中断处理程序生成,往往是预先在代码里实现好的,不具有随机性。

[参考]:https://www.jianshu.com/p/e6162bc984c8

猜你喜欢

转载自blog.csdn.net/weixin_45937255/article/details/115124846