第二章. 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;
阅读(481) | 评论(0) | 转发(0) |