核心之旅 簡單分析getsockopt系統呼叫

2021-09-11 03:07:15 字數 1279 閱讀 8865

今天看了個sockopt操作,本想著了解下流程,看看程序是如何獲取opt的。結果前一半順利,後一半坎坷,但是還是堅持了下來。

我們知道,此函式為系統呼叫,在**中應該可以找到,參考我之前的blog,但是我這次遇到的是在net/ipv4/ip_sockglue.c找到的此次問題的答案,具體問題為nginx中的event模組中呼叫了此函式,目的想獲取介面ip屬性,細節就不展開描述了。按理說,找到獲取點,問題解決了。但是我和預期有些出入。問題出在經驗推斷上,所以我決定探測一番。

初步分析

首先,可以確定,此系統呼叫在net模組net/socket.c中,即此函式的定義之處

syscall_define5(getsockopt...)
其次,結論是在特定實現上,ip_sockglue.c中的實現。

所以目標明確,兩者是如何關聯的?這個系統呼叫的重點是sock->ops->getsockopt,所以找到ops是哪個物件?getsockopt是哪個實現?

前提首先此番探索是基於3.9.4的核心版本。

其次,建立sock是呼叫了socket這個系統呼叫,這裡會建立sock,並引用了net_families,它指向了inet_family_ops。

再次,在af_inet.c中進行了sock初始化,考察重點是依據建立條件,在inetsw中的匹配到相關物件(本次考察的是tcp),用此物件的prot為依據呼叫sk_alloc分配sk,在呼叫sock_init_data初始化sock,並在最後sk->sk_prot->init初始化。

最後,getsockopt呼叫時使用上述環境,獲取對應的值。

分析以tcp為例,在建立socket時,會進行初始化,這樣sock->ops指向inet_stream_ops,故sock->ops->getsockopt實際是sock_common_getsockopt。

sock_common_getsockopt使用了sk->sk_prot->getsockopt。

而上述初始化時將sk->sk_prot指向了tcp_prot,故sk->sk_prot->getsockopt實際是tcp_getsockopt。這裡又呼叫了icsk->icsk_af_ops->getsockopt。

在建立sock時,icsk_af_ops指向了ipv4_specific,所以icsk->icsk_af_ops->getsockopt實際是ip_getsockopt。

自己十分敬畏開源工程的每一行**的,深知不是兩句話可以說清的(暫時沒有這個能力:p),就以一句話勉勵自己作為結束:

在這條路上行走,適當參考先驅的經驗,只有經歷過洗禮,才能理解優雅的真諦。

linux 核心之旅

我不認為我是 linux 之上的高手,因為我的shell 沒有達到c語言的 拿來即用的水平,而且我的核心開發主要集中於裝置驅動的開發。但我確信我現在已經是乙個入門者,可以再遇到問題的時候,迅速定位,然後給出正確的指導和答案。linux核心難嗎?接觸之初,和現在完全是兩種答案。在學習linux之前,我...

GPIO核心之旅

linux核心中gpio 是最簡單 最常用的資源 和 interrupt dma,timer一樣 驅動程式,應用程式都能夠通過相應的介面使用gpio,gpio使用0 max int之間的整數標識,不能使用負數,gpio與 硬體體系密切相關的 不過linux 有乙個框架 處理gpio,能夠使用統一的介...

Android Framework核心之旅

android framework核心之旅 6.1 framework框架 framework定義了客戶端元件和服務端元件功能及介面。以下闡述中,應用程式 一般是指 apk 程式。框架中包含三個主要部分,分別為服務端 客戶端和linux驅動。6.1.1服務端 服務端主要包含兩個重要類,分別是wind...