1.网络分层中,内核协议栈负责实现网络层和传输层
2.内核对用户进程提供socket接口用以调用
3.Linux内核包含链路层驱动用来驱动网络设备
4.内核网络层用来实现IP、ICMP以及IGMP
5.内核层传输层用来实现TCP和udp协议
6.内核源码中网络设备驱动对应的代码位于driver/net/ethernet目录下;
不同厂商的网卡驱动分配在不同的目录下:
7.内核和网络设备驱动是通过中断的方式处理的
8.网卡驱动硬中断:对cpu的相关引脚上触发一个电压变化,以通知CPU处理数据
9.中断处理下半部分的软中断:是通过给内存中的一个变量的二进制值通知软中断处理程序
ksoftirqd
10.内核网卡收包环节:
参考:Linux网络包接收过程_linux内核网络接收数据包_Yi Ian的博客-CSDN博客
10.1 数据网线到达服务器网卡
10.2 网卡将数据帧DMA(Direct Memory Access)到内存
DMA:零拷贝技术( DMA、PageCache)_dma 零拷贝_况祥彬的博客-CSDN博客
10.3 硬中断通知cpu
10.4 cpu响应硬中断简单处理后发出软中断
10.5 ksoftirqd进程处理软中断调用网卡驱动注册的poll函数开始收包
10.6 帧从ring buffer上摘下来保存为一个skb
skb :skb结构和相关操作函数_skb_shinfo_分享放大价值的博客-CSDN博客
10.7 协议层 开始处理网络帧,处理完后的data被放到socket队列
10.8 内核唤醒用户进程
-----------------------------------
11.ksoftirqd:内核软中断线程,不停的判断有没有软中断需要被处理
12.subsys_initcall 来初始化各个子系统,其中执行net_dev_init函数进行网络子系统的初始化
13.协议栈注册:内核时通过注册的方式实现
14.网卡驱动初始化:
内核:调用网卡驱动probe->网卡驱动获取mac地址
网卡驱动:DMA初始化,注册ethtool是实现函数,注册net_device_ops,netdev等变量
napi初始化,注册poll函数
15.启动网卡:内核调用net_device_ops中注册的open函数如igb_open->网卡驱动
分配RX,TX队列内存,注册新中断处理函数,打开硬中断,等待包进来
16.硬中断处理:网卡把帧DMA到内存的ringbuffer,并向cpu发出IRQ 中断,cpu调用驱动注册的硬中断处理函数,启动NAPI,发出软中断
当ringbuffer 满的时候,可以通过ethtool命令来加大环形队列的长度