ops->getsockopt ( code here )。而 sock->ops 是一个名为 proto_ops -6ren">
gpt4 book ai didi

linux - 函数指针指向 struct "proto_ops"的哪里?

转载 作者:太空宇宙 更新时间:2023-11-04 10:38:36 24 4
gpt4 key购买 nike

在 Linux 内核中,我发现系统调用 getsockopt 最后调用 sock->ops->getsockopt ( code here )。而 sock->ops 是一个名为 proto_ops 的结构体。该结构包含许多函数指针,例如 getsockopt我想知道它指向哪里——我没有找到启动这个结构的地方。

我正在使用 IPv4 和 TCP 进行系统调用,它可能有一些特定的实现函数可以在这里调用。

任何见解都会非常有帮助。提前致谢!

最佳答案

对于 IPv4 套接字,ops 将是结构之一 inet_stream_ops , inet_dgram_ops , inet_sockraw_opsnet/ipv4/af_inet.c 中定义(除非您使用的是 SCTP 之类的奇怪东西,它在别处定义了自己的操作)。要查看这些指针如何到达那里,请查看 inet_create在同一个文件中,即 called from __sock_create as pf->create() .

要查看 that 指针如何到达那里,请注意 inet_create 是名为 inet_family_ops 的结构的 create 成员> 这是 passed to sock_register() ,导致它被放置在创建套接字时查询的 net_families 数组中。

当您想了解不同内核组件的连接方式时,名称中带有 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。所以接下来您会想知道 that 从何而来。

它来自下一层。我将以 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 选项实际被处理。

关于linux - 函数指针指向 struct "proto_ops"的哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36206744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com