设为首页 加入收藏

TOP

Linux内核--网络栈实现分析
2014-11-24 13:07:18 来源: 作者: 【 】 浏览:0
Tags:Linux 内核 网络 实现 分析

本文分析基于内核Linux Kernel 1.2.13


以后的系列博文将深入分析Linux内核的网络栈实现原理,这里看到曹桂平博士的分析后,也决定选择Linux内核1.2.13版本进行分析。


原因如下:



1.功能和网络栈层次已经非常清晰


2.该版本与其后续版本的衔接性较好


3.复杂度相对新的内核版本较小,复杂度低,更容易把握网络内核的实质


4.该内核版本比较系统资料可以查询


下面开始零基础分析Linux内核网络部分的初始化过程。


经过系统加电后执行的bootsect.S,setup.S,head.S,可以参考以前分析的0.11内核。原理相同。




进行前期的准备工作后,系统跳转到init/main.c下的start_kernel函数执行。


网络栈的层次结构如下图:(注:该图片摘自《Linux内核网络栈源代码情景分析》)




start_kernel函数经过平台初始化,内存初始化,陷阱初始化,中断初始化,进程调度初始化,缓冲区初始化等,然后执行socket_init(),最后开中断执行init()。


内核的网络战初始化函数socket_init()函数的实现在net/socket.c中


下面是该函数的实现



这里文件中定义的NPROTO为16


#define NPROTO 16 /* should be enough for now.. */


而pop[i]是如何定义的呢?


static struct proto_ops *pops[NPROTO];


proto_ops结构体是什么呢?该结构体的定义在include/linux/net.h中,该结构体是具体的操作函数集合,是联系BSD套接字和INET套接字的接口,可以把BSD套接字看做是INET套接字的抽象,结构示意图如下:



具体定义在net.h中



接下来是proto_init()协议初始化。



接下来会执行inet_proto_init()函数,进行INET域协议的初始化。该函数的实现在net/inet/af_inet.c中


其中的


(void) sock_register(inet_proto_ops.family, &inet_proto_ops);



参数中的inet_proto_ops定义如下:



然后



这是大体的一个初始化流程,讨论的不是很详细,后续会进行Linux内核网络栈源代码的详细分析。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 实现由下至上弹出并位于.. 下一篇Linux0.11内核--启动引导代码分析..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: