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 中主要函数及调用关系如下:
Linux操作系统原理—内核网络协议栈
本文插图
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 }