Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15530245
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2008-08-06 22:10:45

浅析sys_socket创建socket的简易流程

sys_socket=>
1.sock_create=>__sock_create=>
pf->create(net, sock, protocol);
inet_create=>看看都做了什么事情,
sk_alloc=>sk_prot_alloc=>kmalloc(prot->obj_size, priority);
这个prot->obj_size的大小是从哪里来的呢,接着看,
sk->sk_prot = tcp_prot;
他的.obj_size = sizeof(struct tcp_sock),所以
struct tcp_sock {
    /* inet_connection_sock has to be the first member of tcp_sock */
    struct inet_connection_sock inet_conn;
    ...
}
struct inet_connection_sock {
    /* inet_sock has to be the first member! */
    struct inet_sock icsk_inet;
    ...
}
struct inet_sock {
    /* sk and pinet6 has to be the first two members of inet_sock */
    struct sock sk;
    ...
}
sk->sk_prot->init(sk)也就是调用tcp_prot的init,也就是
tcp_v4_init_sock=>tcp_init_xmit_timers=>inet_csk_init_xmit_timers
(sk, &tcp_write_timer, &tcp_delack_timer,&tcp_keepalive_timer);
对tcp使用到的3个timer定时器做初始化.
    icsk->icsk_retransmit_timer.function = tcp_write_timer;
    icsk->icsk_delack_timer.function = tcp_delack_timer;
    sk->sk_timer.function         = tcp_keepalive_timer;
icsk->icsk_af_ops = &ipv4_specific;
icsk->icsk_ca_ops = &tcp_init_congestion_ops;
tp->reordering = sysctl_tcp_reordering;
sk->sk_write_space = sk_stream_write_space;
icsk->icsk_sync_mss = tcp_sync_mss;
tp->af_specific = &tcp_sock_ipv4_specific;
故icsk_af_ops就是ipv4_specific
这样sys_socket的创建工作也接近尾声了【gliethttp.Leith】,
sys_socket=>
2.sock_map_fd=>sock_attach_fd=>
dentry->d_op = &sockfs_dentry_operations;
init_file(file, sock_mnt, dentry, FMODE_READ | FMODE_WRITE, &socket_file_ops);
file->private_data = sock;
其中init_file=>file->f_op = fop;也就是file->f_op = socket_file_ops;
所以read(),wirte(),poll()和ioctl()应用程序调用的file->f_op就是socket_file_ops了,
比如:
read()对应sock_aio_read网络异步读
write()对应sock_aio_write网络异步写
ioctl()对应sock_ioctl

socket_file_ops结构体具体实现如下:
static const struct file_operations socket_file_ops = {
    .owner = THIS_MODULE,
    .llseek = no_llseek,
    .aio_read = sock_aio_read,
    .aio_write = sock_aio_write,
    .poll = sock_poll,
    .unlocked_ioctl = sock_ioctl,
#ifdef CONFIG_COMPAT
    .compat_ioctl = compat_sock_ioctl,
#endif
    .mmap = sock_mmap,
    .open = sock_no_open, /* special open code to disallow open via /proc */
    .release = sock_close,
    .fasync = sock_fasync,
    .sendpage = sock_sendpage,
    .splice_write = generic_splice_sendpage,
};

阅读(1744) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~