Linux操作系统原理—内核网络协议栈( 四 )
本文插图
sock_init 包含了内核协议栈的初始化工作:
sock_init:Initialize sk_buff SLAB cache , 注册 SOCKET 文件系统 。
net_inuse_init:为每个 CPU 分配缓存 。
proto_init:在 /proc/net 域下建立 protocols 文件 , 注册相关文件操作函数 。
net_dev_init:建立 netdevice 在 /proc/sys 相关的数据结构 , 并且开启网卡收发中断;为每个 CPU 初始化一个数据包接收队列(softnet_data) , 包接收的回调;注册本地回环操作 , 注册默认网络设备操作 。
inet_init:注册 INET 协议族的 SOCKET 创建方法 , 注册 TCP、UDP、ICMP、IGMP 接口基本的收包方法 。 为 IPv4 协议族创建 proc 文件 。 此函数为协议栈主要的注册函数:
rc = proto_register(&udp_prot, 1);:注册 INET 层 UDP 协议 , 为其分配快速缓存 。
(void)sock_register(&inet_family_ops);:向 static const struct net_proto_family *net_families[NPROTO] 结构体注册 INET 协议族的操作集合(主要是 INET socket 的创建操作) 。
inet_add_protocol(&udp_protocol, IPPROTO_UDP) < 0;:向 externconst struct net_protocol *inet_protos[MAX_INET_PROTOS] 结构体注册传输层 UDP 的操作集合 。
static struct list_head inetsw[SOCK_MAX]; for (r = &inetsw[0]; r < &inetsw[SOCK_MAX];++r) INIT_LIST_HEAD(r);:初始化 SOCKET 类型数组 , 其中保存了这是个链表数组 , 每个元素是一个链表 , 连接使用同种 SOCKET 类型的协议和操作集合 。
for (q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q):
inet_register_protosw(q);:向 sock 注册协议的的调用操作集合 。
arp_init;:启动 ARP 协议支持 。
ip_init;:启动 IP 协议支持 。
udp_init;:启动 UDP 协议支持 。
dev_add_pack(&ip_packet_type);:向 ptype_base[PTYPE_HASH_SIZE]; 注册 IP 协议的操作集合 。
socket.c 提供的系统调用接口 。
本文插图
本文插图
协议栈初始化完成后再执行 dev_init , 继续设备的初始化 。
Socket 创建流程
本文插图
协议栈收包流程概述
硬件层与设备无关层:硬件监听物理介质 , 进行数据的接收 , 当接收的数据填满了缓冲区 , 硬件就会产生中断 , 中断产生后 , 系统会转向中断服务子程序 。 在中断服务子程序中 , 数据会从硬件的缓冲区复制到内核的空间缓冲区 , 并包装成一个数据结构(sk_buff) , 然后调用对驱动层的接口函数 netif_rx 将数据包发送给设备无关层 。 该函数的实现在 net/inet/dev.c 中 , 采用了 bootom half 技术 , 该技术的原理是将中断处理程序人为的分为两部分 , 上半部分是实时性要求较高的任务 , 后半部分可以稍后完成 , 这样就可以节省中断程序的处理时间 , 整体提高了系统的性能 。
- Windows|New Windows 11操作系统壁纸灵感来源,新的视角,一个新的时代
- 操作系统|如何从一个静态库中访问当前模块的实例句柄
- Windows11|win11操作系统与win10:差距无法接受
- 操作系统|全新手机操作系统ocean遭曝光:支持应用小窗,采用双系统设计
- 核聚变|核聚变的原理是什么?一次可以产生多少能量、掌握后的前景有多大
- 抗衰老|干细胞美容防衰原理,中科西部细胞研究院
- 显卡|鸿蒙OS靠边站,中兴百分百自研操作系统,电脑和高铁都已经用上了
- 操作系统|新款笔记本电脑的操作系统“装不上”怎么回事?拿走不谢
- 操作系统|国内三大操作系统:UOS统一操作系统,银河麒麟,鸿蒙系统
- 操作系统|为什么说我们现在能做好操作系统
