我试图计算在Linux内核中为TCP / IPnetworking堆栈定义的用于处理数据包的各层和函数所消耗的CPU周期 。 所以我通过各种function使用TSC进行CPU消耗。 这表明对sk_data_ready()函数的单个调用需要很多CPU周期。
所以我遵循Linux内核中的TCP / IP协议栈的源代码,以获取原始套接字的信息,并在最后在特定套接字的接收循环链表中列出了信息包。
但是在将数据包排队之后,将sock.c中定义的函数sock_queue_rcv_skb()调用
sk->sk_data_ready(sk, skb_len);
这是callback函数(我认为)。 但我无法获得此callback函数的任何源代码。
任何人都可以帮助我find代码和它是如何工作的?
recvfrom()函数是否也与上面定义的callback函数有关?
默认的 – > sk_data_ready()回调是sock_def_readable():
static void sock_def_readable(struct sock *sk, int len) { struct socket_wq *wq; rcu_read_lock(); wq = rcu_dereference(sk->sk_wq); if (wq_has_sleeper(wq)) wake_up_interruptible_sync_poll(&wq->wait, POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND); sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); rcu_read_unlock(); }
它基本上唤醒了等待这些数据的进程,例如recv(),并让它们处理 – > sk_receive_queue中的数据。
有些协议可能会覆盖这个,例如netlink,请参阅__netlink_kernel_create()。
顺便说一句,你可以使用perf top
命令来查看哪个内核函数消耗了大多数的CPU周期。