Socket 與系統呼叫深度分析

2022-05-04 22:09:17 字數 2249 閱讀 6362

本次實驗主要從以下幾個方面對socket和系統呼叫之間的關係:

socket api 和 系統呼叫關係**

系統呼叫機制

socket相關系統呼叫核心函式和跟蹤驗證

系統呼叫一般發生在中斷的時候。當中斷發生時,系統就會進入核心態指向相關的系統呼叫。相信考過408的同學對下圖應該是很熟悉的。這個圖大概的描述了如何進入核心態執行系統隨後離開核心態進入使用者態的整個過程。

本次實驗室對上個實驗的深入與擴充套件。在上個實驗中,我們大致的學習了如何使用gdb進行除錯,並執行了hello/hi通訊程式。當我們在命令列中輸入hello後,服務端會響應hi。那麼在這個簡單的hello-hi的過程中發生了什麼呢,或者說在當我們按下回車符的時候系統在幹什麼,有哪些函式被先後呼叫,這是本次實驗我們要學習的。

原始碼實現

通過對以上過程的分析,我們去hello/程式的源**去找找,看能不能找到與上述功能描述向符合的函式

從main.c開始看起

從replyhi可以看出,在這個過程中這個函式主要呼叫了六個函式,分別是initializeservice()、servicestart()、recvmsg()、sendmsg()、servicestop()、shutdownservice()這六個函式,和我們前面分析的過程大致相符。

深層實現

我們進一步的進入到該檔案中去找。通過觀察可以發現,主要可以分為兩個部分來看。server和client。

在server的實現中我們可以看到initserver()函式,這個函式主要完成了兩個工作,繫結埠號以及監聽埠,由bind()listen()實現。

隨後是servicestart(),顧名思義,開啟服務。這個函式呼叫了accept()函式(api)

繼續向下分析,接著是recvmsg()sendmsg()函式,這兩個函式依次呼叫了rec()send()函式。

最後是servicestop()shutdownservice()函式,呼叫了close()函式用於斷開連線

hello()呼叫了如下幾個函式openremoteservice()sendmsg()receievemsg()closeremoteservice()。從名字上可以是【看出這幾個函式的大致功能是:開啟乙個socket連線,傳送訊息,接受訊息以及關閉socket連線。

我們繼續再深入檢視這幾個函式的內部實現。openremoteservice()呼叫了preparesocket()函式和initclient()函式,這個函式的主要功能是將ip位址和埠號繫結形成客戶端套接字。initclient()函式呼叫了connect函式。closeremoteservice()函式呼叫了close()函式關閉連線。

從上面對server和client的內部實現不難看出。我們之前分析的tcp/ip的實現過程所要呼叫的函式正好和上面的**分析相對應。傳送資料和接受資料對應的sendmsg和revmsg函式。建立連線功能對應的connect函式。監聽埠功能對應的listen函式。接受請求功能對應的是accept()函式。關閉連線功能對應的是shutdownservice函式和closeremoteservice函式

核心跟蹤

我們首先在sys_socketcall函式處建立斷點

然後按c讓程式繼續執行。在這個過程中可以通過terminal檢視到發生了如下的情況:

根據這些系統呼叫返回的系統呼叫號,我們去檢視這些系統呼叫實現了哪些功能,根據terminal的內容我們找到socket.c檔案,我麼可以看到以下內容:

syscall_define2(socketcall, int, call, unsigned long __user *, args)

return err;

通過對這些系統呼叫號的分析不難看出,這些系統呼叫發生的順序和replyhi()和hello()函式的執行過程正好一一對應起來。

Socket與系統呼叫深度分析

一 系統呼叫 由於需要限制不同的程式之間的訪問能力,防止他們獲取別的程式的記憶體資料,或者獲取外圍裝置的資料,併發送到網路,cpu劃分出兩個許可權等級 使用者態和核心態。核心態 cpu可以訪問記憶體的所有資料,包括外圍裝置,例如硬碟,網絡卡,cpu也可以將自己從乙個程式切換到另乙個程式。使用者態 只...

SOCKET使用者介面與系統呼叫關係

所有的socket系統呼叫的總入口是sys socketcall 在include linux syscalls.h中定義 其中,param call 標識介面編號,param args 是介面引數指標 介面編號的定義在 include uapi linux net.h中定義 介面編號對應的引數個數...

SOCKET使用者介面與系統呼叫關係(2)

上一節中講述了socket呼叫的總入口sys socketcall的巨集定義形式,該定義形式還廣泛用於其他介面api。現在我們來看看sys socketcall的實現方式。在net socket.c 中,sys socketcall的實現如下 2465 2466 api序號鑑定,需要在socket ...