本文主要是介绍linux 内核网络分析 -- 分配并初始化socket,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
分配并初始化socket
inet_creat()函数分配了一个sock结构,定义的代码在2.2中,分配工作是通过sk = sk_alloc(net, PF_INET, GFP_KERNEL, answer_prot) 来完成的,将anwer_prot作为其prot参数使用,已经设置为tcp_prot ,
sys_socketcall()->sys_socket() sock_create->sock_create -> inet_create sk_alloc
struct sock * sk_alloc(struct net *net, int family, gfp_t priority, struct proto *prot)
{
struct sock *sk;
sk = sk_prot_alloc(prot, priority) __GFP_ZERO, family;
if (sk)
sk->sk_family = family
sk->sk_prot = sk->sk_prot_creator = prot;
sock_lock_init(sk);
sock_net_set(sk, get_net(net));
}
传输层的钩子结构tcp_prot 挂入倒了sock->sk_prot 上,下面将会看到对这个钩子机构的调用,在sk_alloc 函数943行处用了sk_prot_alloc 分配一个通用的sock结构体,根据tcp_prot 结构是否提供了slab 高速缓存来确定是在告诉缓冲区中分配还是在通用缓冲区分配
sys_sockcall->sys_socket() ->sock_create-> sock_create inet_create sk_alloc sk_prot_alloc
static struct sock *sk_prot_alloc(struct prots *prot, gfp_t priority, int family)
{
struct sock *sk;
struct kmem_cache *slab;
slab = prot->slab;
if (slab != NULL)
sk = kmem_cache_alloc(slab, priority);
else
sk = kmalloc(prot->obj_size, priority);
if (sk != NULL) {
if (security_sk_alloc(sk_family, priority))
goto out_free;
if (!try_module_get(prot->owner))
goto out_free_sec;
return sk;
out_free_sec:
security_sk_free(sk);
out_free:
if (slab != NULL)
kmem_cache_free(slab, sk);
else
kfree(sk);
return NULL;
}
}
891 行处理了使用了内存管理的slab分配函数kmem_cache_alloc 表示专用的sock高速缓冲中分配结构空间,而kmalloc 函数则是在通用的高速缓冲池中分配结构空间,这两个函数的具体过程属于内存管理的内容,因而不作为重点。
无论是告诉缓冲还是通用缓存,分配成功后都会在sk_alloc函数中对其进行的初始化操作,而调用sock_lock_init 函数对其同步作用的sk_lock锁进行初始化
sys_sockcall->sys_socket ->sock_create ->sock_create ->inet_create sk_alloc sock_lock_init
这篇关于linux 内核网络分析 -- 分配并初始化socket的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!