浅析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,
}
;
浅析sys_socket创建socket的简易流程
最新推荐文章于 2024-07-24 19:03:11 发布