注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析、”(下)“表示分析是从上向下分析。
简单分析了链路层之后,上升到网络层来分析,看看链路层是如何为其上层--网络层服务的。其实在驱动程序层和网络层直接还有一层是接口层,叫做驱动程序接口层,用来整合不同的网络设备。接口层的内容会在上下层中提及。这里我们分析网络IP协议的实现原理。
其实现的文件主要是net/inet/ip.c文件中
我们首先分析下ip_init()初始化函数
这个函数是如何被调用的呢?
下面是调用的过程:
首先是在系统启动过程main.c中调用了sock_init()函数
void sock_init(void)//网络栈初始化 printk("Swansea University Computer Society NET3.019\n"); /* /* proto_init(); #ifdef CONFIG_NET dev_init(); bh_base[NET_BH].routine= net_bh;//设置NET 下半部分的处理函数为net_bh |
然后调用了proto_init()函数
void proto_init(void) /* Kick all configured protocols. */ |
而protocols全局变量协议向量表的定义中对INET域中协议的初始化函数设置为inet_proto_init()
/* * Protocol Table */ struct net_proto protocols[] = { #ifdef CONFIG_UNIX { "UNIX", unix_proto_init }, #endif #if defined(CONFIG_IPX)||defined(CONFIG_ATALK) { "802.2", p8022_proto_init }, { "SNAP", snap_proto_init }, #endif #ifdef CONFIG_AX25 { "AX.25", ax25_proto_init }, #endif #ifdef CONFIG_INET { "INET", inet_proto_init }, #endif #ifdef CONFIG_IPX { "IPX", ipx_proto_init }, #endif #ifdef CONFIG_ATALK { "DDP", atalk_proto_init }, #endif { NULL, NULL } }; |