Chinaunix首页 | 论坛 | 博客
  • 博客访问: 698931
  • 博文数量: 193
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2187
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(193)

文章存档

2024年(9)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: LINUX

2015-07-24 22:12:14

第二章. socket的创建
    2.1几个重要的数据结构
        struct socket {
            ...
            struct sock *sock;
            ...
        };
        struct sock {
            ...
            struct socket *sk_socket;
            ...
        };
        struct sk_buff{
            ...
            struct sock *sk;
            ...
        }; 
        struct tcp_sock;
    2.2分配并初始化socket结构
       sys_socketcall()-->sys_socket()-->sock_create()-->__sock_create()-->sock_alloc()-->new_inode()-->alloc_inode()-->sock_alloc_inode()
                                                                                                                 -->inet_create()-->sk_alloc()
                                                                                                                                          -->sock_init_data()
                                                                                                                                          -->tcp_v4_init_sock()
                                                         -->sock_map_fd()-->sock_alloc_fd()
                                                                                     -->sock_attach_fd()
        一个结构体
            struct socket_alloc{
                struct socket socket;
                struct inode vfs_inode;
            };
        其中的sock_alloc_inode()给struct socket_alloc指针分配空间并赋初值后,这返回该分配结构的inode成员地址(&ei->vfs_inode)
    2.3使用协议族的函数表初始化socket
        a. sock_alloc()中将new_inode()返回的inode指针转换得到相应的struct socket指针. 作相应赋值处理后返回strcut socket指针给__sock_create()
        b. inet_create()将前面处理得到的struct socket指针及其struct net/protocol等参数代入处理. 
            i. 在已经注册的协议链表中查找指定的协议编码类型. 记为answer. 挂入相应的钩子函数. 协议类型留下备用.
                sock->ops = answer->ops;
                answer_prot = answer->prot;
            ii. 分配struct sock结构. 与相应赋值. 通过sock_init_data()对新分配的struct sock结构进一步初始化.
    2.4分配并初始化sock结构
        sk_alloc()-->sk_prot_alloc()
            分配空间给struct sock类型指针. 初始化之.
        sock_init_data()
            使sock和sk挂钩
    2.5TCP协议对sock结构的初始化
            tcp_v4_init_sock()对inet_sock()结构进行初始化
    2.6socket与文件系统的关联
            a. 通过sock_map_fd()函数将新分配的struct socket结构与文件号及文件结构挂钩
            b. 通过sock_alloc_fd()分配文件号与文件结构, 两者挂钩.
            c. 通过sock_attach_fd()
                    i. 创建一个socket文件系统的目录项, 挂入目录项操作表
                            dentry->d_op = &sockfs_dentry_operations
                    ii.初始化socket的文件结构, 挂入文件操作表
                            init_file(file, sock_mnt, dentry, FMODE_READ|FMODE_WRITE, &socket_file_ops);
                    iii. 文件结构与socket挂钩
                            file->private_data = sock;
阅读(489) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~