Где указатели на функции указывают в структуре "proto_ops"?
В ядре Linux я нахожу системный вызов getsockopt
наконец звонит sock->ops->getsockopt
( код здесь). А также sock->ops
это структура называется proto_ops
, Эта структура содержит много указателей на функции, такие как getsockopt
и мне интересно, куда это указывает - я не нашел место, которое инициирует эту структуру.
Я использую IPv4 и TCP для системного вызова, и он может иметь некоторые определенные функции реализации для вызова здесь.
Любые идеи будут чрезвычайно полезны. Заранее спасибо!
1 ответ
Для сокета IPv4 ops будет одной из структур inet_stream_ops
, inet_dgram_ops
, inet_sockraw_ops
определяется в net/ipv4/af_inet.c
(если только вы не используете что-то странное, например, SCTP, у которого свои собственные операции определены в другом месте). Чтобы увидеть, как эти указатели попадают туда, посмотрите на inet_create
в том же файле, который вызывается из __sock_create
как pf->create()
,
Чтобы увидеть, как этот указатель попадает туда, обратите внимание, что inet_create
это create
член структуры называется inet_family_ops
который передается sock_register()
, в результате чего он будет помещен в net_families
массив, к которому обращаются при создании сокета.
Функции с register
в их именах полезно искать, когда вы хотите увидеть, как связаны различные компоненты ядра.
Теперь вернемся к getsockopt
, Если вы посмотрите, где getsockopt
указатель фактически идет, во всех 3 inet_*_ops
структурирует это указывает на sock_common_getsockopt
для getsockopt
функция.
sock_common_getsockopt
в net/core/sock.c
не очень интересно Это просто извлекает struct sock
из struct 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
в net/ipv4/ip_sockglue.c
и это вызывает do_ip_getsockopt
в том же файле, где SOL_IP
варианты на самом деле обрабатываются.