每天花三分鐘學習一下linux套接口的知識點

剛好有時間可以寫文章,就繼上一篇文章接著寫linux 之socket層的知識,

上一篇文章,我們介紹過,socket層是通過proto_ops這個數據結構來跳轉到傳輸層的處理函數,你可以把它當成跳轉表,proto_ops結構如下:

每天花三分鐘學習一下linux套接口的知識點

圖1

通過這個數據結構,我們可以看到,裡面存的是函數指針,而這些函數指針的名字,是不是覺得非常熟悉,和我們系統調用的名字很相符,下面我就舉一個例子,假設,應用程序調用mmap時,它的執行流程如下所示:

每天花三分鐘學習一下linux套接口的知識點

圖2

由上圖我們知道了整個調用的過程,即,應用程序調用mmap函數時,由用戶空間切換到內核空間,找到了sys_mmap函數,從而調用到了socket層,socket層會調用proto_ops中的mmap函數去執行真正的處理。

由上述我們知道了傳輸層用到了一個特殊的數據結構,就是proto_ops,我們也知道了,這個數據結構實際上就是一個跳轉表,是應用程序和傳輸層之間的跳轉表,那麼傳輸層和IP層之間是否與跳轉表呢,答案當然是有嘍,這個結構名是proto,這個結構以後會細講,下面給大家介紹一下,和這兩個結構相關的數據結構,那就是inet_protosw,inet_protosw結構中包含了proto_ops和proto這兩個結構,你說重要不重要呢。

inet_protosw結構是存在了靜態數組中inet_array中,網絡初始化時,會根據socket的類型,將inet_protosw註冊到hash數組inetsw[]中,具體結構見下圖:

每天花三分鐘學習一下linux套接口的知識點

圖3

當我們調用socket創建套接口時,會根據type在inetsw中搜索匹配的inet_protosw結構,並將搜索到的inet_protosw中的proto_ops存儲到socket結構中的ops中。

今天就寫這些吧,謝謝。


分享到:


相關文章: