0

getsockoptLinux カーネルでは、システム コールが finally を呼び出していることがわかりましたsock->ops->getsockopt( code here )。Andsock->opsと呼ばれる構造体proto_opsです。この構造体には次のような多くの関数ポインターが含まれてgetsockoptおり、それがどこを指しているのか疑問に思っています-この構造体を開始する場所が見つかりませんでした。

システムコールにIPv4とTCPを使用していますが、ここで呼び出す特定の実装関数がある場合があります。

どんな洞察も非常に役に立ちます。前もって感謝します!

4

1 に答える 1

2

IPv4 ソケットの場合、ops はで定義された構造体inet_stream_opsinet_dgram_ops、のいずれかになります (SCTP のように独自の ops が別の場所で定義されている奇妙なものを使用している場合を除きます)。これらのポインターがどのようにそこに到達するかを確認するには、 asから呼び出される同じファイルを参照してください。inet_sockraw_opsnet/ipv4/af_inet.cinet_create__sock_createpf->create()

そのポインターがどのようにそこに到達するかを確認するには、が に渡さinet_createれる構造体のcreateメンバーであることに注意してください。これにより、ソケットの作成時に参照される配列に配置されます。inet_family_opssock_register()net_families

名前に が含まれる関数はregister、さまざまなカーネル コンポーネントがどのように接続されているかを知りたい場合に便利です。

に戻りgetsockoptます。getsockoptポインターが実際にどこに行くかを見ると、 3 つのすべての構造体で関数inet_*_opsを指してsock_common_getsockoptgetsockoptます。

sock_common_getsockoptではnet/core/sock.cあまり面白くありません。struct sockaから aを抽出してstruct socketを呼び出すだけsk->sk_prot->getsockoptです。次に、それがどこから来るのか疑問に思うでしょう。

それは次の層から来ます。例としてTCPを想定します。

net/ipv4/tcp_ipv4.cにはstruct proto tcp_protgetsockoptメンバーが指すtcp_getsockopt、で定義された関数がありnet/ipv4/tcp.cます。SOL_TCPオプション自体を実装し、他のものについては、getsockoptと呼ばれる別の ops 構造体からメソッドを呼び出しますicsk_af_ops。が を指しているnet/ipv4/tcp_ipv4.c場所に戻ります。struct inet_connection_sock_af_ops ipv4_specificgetsockoptip_getsockopt

ip_getsockoptが入っていて、オプションが実際に処理される同じファイルをnet/ipv4/ip_sockglue.c呼び出します。do_ip_getsockoptSOL_IP

于 2016-03-24T20:13:01.573 に答える