Linux操作系统原理—内核网络协议栈( 三 )
sk_buff:描述一个帧结构的属性 , 包含 socket、到达时间、到达设备、各层首部大小、下一站路由入口、帧长度、校验和等等 。
sk_buff_head:数据包队列结构 。
net_device:这个巨大的结构体描述一个网络设备的所有属性 , 数据等信息 。
inet_protosw:向 IP 层注册 socket 层的调用操作接口 。
inetsw_array:socket 层调用 IP 层操作接口都在这个数组中注册 。
sock_type:socket 类型 。
IPPROTO:传输层协议类型 ID 。
net_protocol:用于传输层协议向 IP 层注册收包的接口 。
packet_type:以太网数据帧的结构 , 包括了以太网帧类型、处理方法等 。
rtable:路由表结构 , 描述一个路由表的完整形态 。
rt_hash_bucket:路由表缓存 。
dst_entry:包的去向接口 , 描述了包的去留 , 下一跳等路由关键信息 。
napi_struct:NAPI 调度的结构 。 NAPI 是 Linux 上采用的一种提高网络处理效率的技术 , 它的核心概念就是不采用中断的方式读取数据 , 而代之以首先采用中断唤醒数据接收服务 , 然后采用 poll 的方法来轮询数据 。 NAPI 技术适用于高速率的短长度数据包的处理 。
网络协议栈初始化流程
这需要从内核启动流程说起 。 当内核完成自解压过程后进入内核启动流程 , 这一过程先在 arch/mips/kernel/head.S 程序中 , 这个程序负责数据区(BBS)、中断描述表(IDT)、段描述表(GDT)、页表和寄存器的初始化 , 程序中定义了内核的入口函数 kernel_entry、kernel_entry 函数是体系结构相关的汇编代码 , 它首先初始化内核堆栈段为创建系统中的第一过程进行准备 , 接着用一段循环将内核映像的未初始化的数据段清零 , 最后跳到 start_kernel 函数中初始化硬件相关的代码 , 完成 Linux Kernel 环境的建立 。
start_kenrel 定义在 init/main.c 中 , 真正的内核初始化过程就是从这里才开始 。 函数 start_kerenl 将会调用一系列的初始化函数 , 如:平台初始化 , 内存初始化 , 陷阱初始化 , 中断初始化 , 进程调度初始化 , 缓冲区初始化 , 完成内核本身的各方面设置 , 目的是最终建立起基本完整的 Linux 内核环境 。
start_kernel 中主要函数及调用关系如下:
本文插图
start_kernel 的过程中会执行 socket_init 来完成协议栈的初始化 , 实现如下:
void sock_init(void)//网络栈初始化{ int i; printk("Swansea University Computer Society NET3.019\n"); /* * Initialize all address (protocol) families. */ for (i = 0; i < NPROTO; ++i) pops[i] = NULL; /* * Initialize the protocols module. */ proto_init;#ifdef CONFIG_NET /* * Initialize the DEV module. */ dev_init; /* * And the bottom half handler */ bh_base[NET_BH].routine= net_bh; enable_bh(NET_BH);#endif }
- Windows|New Windows 11操作系统壁纸灵感来源,新的视角,一个新的时代
- 操作系统|如何从一个静态库中访问当前模块的实例句柄
- Windows11|win11操作系统与win10:差距无法接受
- 操作系统|全新手机操作系统ocean遭曝光:支持应用小窗,采用双系统设计
- 核聚变|核聚变的原理是什么?一次可以产生多少能量、掌握后的前景有多大
- 抗衰老|干细胞美容防衰原理,中科西部细胞研究院
- 显卡|鸿蒙OS靠边站,中兴百分百自研操作系统,电脑和高铁都已经用上了
- 操作系统|新款笔记本电脑的操作系统“装不上”怎么回事?拿走不谢
- 操作系统|国内三大操作系统:UOS统一操作系统,银河麒麟,鸿蒙系统
- 操作系统|为什么说我们现在能做好操作系统
