在 Linux 内核中,我发现系统调用getsockopt
finally 调用sock->ops->getsockopt
(代码在这里)。并且sock->ops
是一个名为proto_ops
. 这个结构包含许多函数指针getsockopt
,我想知道它指向哪里——我没有找到启动这个结构的地方。
我使用 IPv4 和 TCP 进行系统调用,它可能有一些特定的实现函数可以在这里调用。
任何见解都会非常有帮助。提前致谢!
在 Linux 内核中,我发现系统调用getsockopt
finally 调用sock->ops->getsockopt
(代码在这里)。并且sock->ops
是一个名为proto_ops
. 这个结构包含许多函数指针getsockopt
,我想知道它指向哪里——我没有找到启动这个结构的地方。
我使用 IPv4 和 TCP 进行系统调用,它可能有一些特定的实现函数可以在这里调用。
任何见解都会非常有帮助。提前致谢!
对于 IPv4 套接字,操作将是 , 中定义的结构inet_stream_ops
之一inet_dgram_ops
(inet_sockraw_ops
除非net/ipv4/af_inet.c
您使用的是像 SCTP 这样的奇怪东西,它在其他地方定义了自己的操作)。要查看这些指针是如何到达那里的,请查看从as调用inet_create
的同一个文件。__sock_create
pf->create()
要查看该指针是如何到达那里的,请注意它inet_create
是create
一个名为的结构的成员,inet_family_ops
它被传递给sock_register()
,导致它被放置在net_families
创建套接字时查询的数组中。
register
当您想查看不同内核组件的连接方式时,查找名称中带有的函数是一件好事。
现在回到getsockopt
. 如果您查看getsockopt
指针实际指向的位置,则在inet_*_ops
它指向函数的所有 3 个结构sock_common_getsockopt
中。getsockopt
sock_common_getsockopt
innet/core/sock.c
不是很有趣。它只是struct sock
从 a中提取 astruct socket
然后调用sk->sk_prot->getsockopt
。所以接下来你会想知道它是从哪里来的。
它来自下一层。我将以 TCP 为例。
在其中net/ipv4/tcp_ipv4.c
有一个成员指向的函数,一个在 中定义的函数。它自己实现选项,对于其他人,它从另一个名为. 这使我们回到了指向的地方。struct proto tcp_prot
getsockopt
tcp_getsockopt
net/ipv4/tcp.c
SOL_TCP
getsockopt
icsk_af_ops
net/ipv4/tcp_ipv4.c
struct inet_connection_sock_af_ops ipv4_specific
getsockopt
ip_getsockopt
ip_getsockopt
是 in并且它在同一个文件中net/ipv4/ip_sockglue.c
调用,这是实际处理选项的地方。do_ip_getsockopt
SOL_IP