分类: LINUX
2013-12-06 14:21:16
我们继续往下看
sys_socketcall()-->
sys_socket()-->
sock_create()-->
__sock_create()-->通过pf->create()--> inet_create()
lookup_protocol: |
这段代码看似复杂其实分析起来并不算难,首先上面
list_for_each_rcu(p, &inetsw[sock->type])是一个宏,我们看一下
#define list_for_each_rcu(pos, head) \ |
这段宏我贴些资料供大家理解,下面这些内容出自
RCU(Read-Copy Update)通过延迟写操作来提高同步性能,具体请参见第3章。这里只分析具有RCU的链表。 |
很明显上面的宏就是循环检查inetsw数组找到符合我们socket类型的链头,那么这个数组是什么时候初始化的呢?我们再象上一节那样看一下
static int __init inet_init(void) |
我们看到他循环用inet_register_protosw()函数处理inetsw_array数组中的元素
static struct inet_protosw inetsw_array[] = |
我们已经在前边看到了inet_protosw结构的定义,所以结合这个数组我们可以看出数组定义了三种类型的socket与网络层的接口内容,一个是用于tcp数据流的使用的,它所使用的IP协议标识码IPPROTO_TCP是传输控制协议,而另一个是udp的数据报使用的,它所使用的IP协议标识码IPPROTO_UDP是表示用户数据报协议,而第三个则是raw原始的协议使用的,可以由自行开发自己的ip协议,有很多IP欺骗程序都是使用的这种类型的协议,这里标识码IPPROTO_IP是“虚拟的IP协议”类型,为使们能够理解上面函数的代码我们再次结合应用程序的练习看一下
server_fd = socket(AF_INET, SOCK_STREAM, 0); |
继续往下看之前我们先完成上面inet_init()函数注册登记inetsw的过程,他是被下面的函数登记到数组中的,篇幅太长,转下一篇继续