struct“proto_ops”中的函数指针指向哪里?
Posted
技术标签:
【中文标题】struct“proto_ops”中的函数指针指向哪里?【英文标题】:Where do the function pointers point to in struct "proto_ops"? 【发布时间】:2016-07-12 10:20:02 【问题描述】:在Linux内核中,我发现系统调用getsockopt
最终调用sock->ops->getsockopt
(code here)。而sock->ops
是一个名为proto_ops
的结构。这个结构包含许多函数指针,例如getsockopt
,我想知道它指向哪里——我没有找到启动这个结构的地方。
我正在使用 IPv4 和 TCP 进行系统调用,它可能有一些特定的实现函数可以在这里调用。
任何见解都会非常有帮助。提前致谢!
【问题讨论】:
【参考方案1】:对于 IPv4 套接字,操作将是 net/ipv4/af_inet.c
中定义的结构 inet_stream_ops
、inet_dgram_ops
、inet_sockraw_ops
之一(除非您使用的是像 SCTP 这样的奇怪东西,它在其他地方定义了自己的操作) .要查看这些指针是如何到达那里的,请查看同一文件中的inet_create
,即called from __sock_create
as pf->create()
。
要查看 那个 指针是如何到达那里的,请注意 inet_create
是名为 inet_family_ops
的结构的 create
成员,即 passed to sock_register()
,导致它被放置在 @ 987654339@ 数组,创建套接字时查询。
名称中带有register
的函数在您想了解不同内核组件的连接方式时是一个不错的选择。
现在回到getsockopt
。如果您查看 getsockopt
指针的实际位置,在所有 3 个 inet_*_ops
结构中,它指向 sock_common_getsockopt
的 getsockopt
函数。
net/core/sock.c
中的sock_common_getsockopt
不是很有趣。它只是从struct socket
中提取struct sock
,然后调用sk->sk_prot->getsockopt
。所以接下来你会想知道那个是从哪里来的。
它来自下一层。我将以 TCP 为例。
在net/ipv4/tcp_ipv4.c
中有一个struct proto tcp_prot
,其中getsockopt
成员指向tcp_getsockopt
,这是一个在net/ipv4/tcp.c
中定义的函数。它自己实现了SOL_TCP
选项,对于其他人,它从另一个名为icsk_af_ops
的操作结构中调用getsockopt
方法。这让我们回到net/ipv4/tcp_ipv4.c
,其中struct inet_connection_sock_af_ops ipv4_specific
有getsockopt
指向ip_getsockopt
。
ip_getsockopt
在net/ipv4/ip_sockglue.c
中,它在同一个文件中调用do_ip_getsockopt
,这是实际处理SOL_IP
选项的地方。
【讨论】:
非常感谢您的澄清!我从中学到了很多。所以我向sock_common_getsockopt
和tcp_getsockopt
添加了一个打印语句,令人惊讶的是,我得到了来自sock_common_getsockopt
的输出,但没有得到tcp_getsockopt
的输出。 (我实际上使用的是SOL_TCP
。)但是我从security/security.c
中的另一个名为security_socket_getsockopt
的函数中获得了输出。你知道为什么要调用这个方法吗?我通过sock = socket(AF_INET, SOCK_STREAM, 0);
创建了套接字,我认为它是 TCP 使用的 IPv4 套接字。
而且我发现这个函数调用了security_ops->socket_getsockopt
,这也是一个函数指针(lxr.free-electrons.com/source/include/linux/…)。它可能指向哪里?
哦,我解决了 - security_socket_getsockopt
在开始时在 sock_common_getsockopt
被调用,如果这个异常退出,以下函数调用将终止。非常感谢!以上是关于struct“proto_ops”中的函数指针指向哪里?的主要内容,如果未能解决你的问题,请参考以下文章
当指向struct的双指针是函数的参数时,为什么我们使用“&(*”语句?