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_opsinet_dgram_opsinet_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_getsockoptgetsockopt 函数。

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_specificgetsockopt 指向ip_getsockopt

ip_getsockoptnet/ipv4/ip_sockglue.c 中,它在同一个文件中调用do_ip_getsockopt,这是实际处理SOL_IP 选项的地方。

【讨论】:

非常感谢您的澄清!我从中学到了很多。所以我向sock_common_getsockopttcp_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的双指针是函数的参数时,为什么我们使用“&(*”语句?

如何在struct中正确定义一个函数指针,它以struct为指针?

指向 c 中结构的指针

signal_connect 函数中的指针工作不正确

Golang基础_07-结构struct