學習 理解 Linux下的系統呼叫過程

2022-08-23 04:57:15 字數 1085 閱讀 5439

在應用程式中,很多時候都會呼叫到系統呼叫來完成一些操作,可是系統呼叫是在核心態下才能呼叫,使用者態下的應用程式是無法直接呼叫到的,那麼作業系統是怎麼處理這一過程的呢?

本文的環境是基於linux 0.11,沒有查證現代作業系統是否有所變化,不過基本思路應該差不多。

先來看一張圖,有個大概的理解。

首先,應用程式能直接呼叫的是系統提供的api,這個在使用者態(ring3)下就可做到。

然後相應的api就會將相應的系統呼叫號儲存到eax暫存器中(這一步通過內聯彙編實現),之後就是使用int 0x80觸發中斷(內聯彙編),進入到中斷處理函式中(該函式是完全由彙編**編寫),這個時候就進入到了核心態(ring0)了。

在中斷處理函式中就會呼叫與系統呼叫號相對應的那個系統呼叫。在這個函式中,會把ds、es這兩個暫存器設定為指向核心空間。這樣一來,我們無法把資料從使用者態中傳到核心態啊(如open(const char * filename, int flag, ...)中,filename指標指向的字串的位址

是在使用者空間中的,在核心空間相應的地方取的話根本沒有該字串),這該怎麼辦呢?中斷處理函式中的fs暫存器被設定為指向了使用者空間,所以問題得以解決。

在系統呼叫中就是進行相應的操作了,如開啟檔案、寫檔案等。

處理完後,將會返回到中斷處理函式,返回值儲存在eax暫存器中。

從中斷處理函式中返回到api,依舊是把返回值儲存到eax暫存器中。這個時候就從核心態恢復成使用者態。

在api中從eax中取出值,做相應的判斷返回不同的值,用以表示操作完成情況。

在保護模式下,有各種各樣的中斷,而系統呼叫就和0x80號中斷繫結。當要呼叫系統呼叫時,就觸發int 0x80,中斷處理函式就通過eax獲知想要呼叫的是哪乙個系統呼叫。這樣做的原因是系統呼叫數量太多,中斷號會不夠用,所以用乙個來集中管理。

作業系統中有乙個表,是用來儲存各個系統呼叫函式的位址的。這個表是乙個陣列,所以通過下標就可以訪問到不同函式的位址。故可以做到乙個中斷號+各樣的系統呼叫號就管理多個系統呼叫。

歡迎各位發現錯誤後指出,本人一定及時改正並致以最誠懇的感謝!

理解linux系統呼叫

1.系統呼叫和普通函式完全不同,系統呼叫實際上是0x80號中斷對應的中斷處理程式的子程式。換句話說,在linux系統上,0x80中斷是系統呼叫的統一入口。某個具體的系統呼叫是這個中斷處理程式的子程式,進入具體某個系統呼叫是通過核心定義的系統呼叫號碼來實現的。linux通過執行如下彙編 陷入核心執行系...

Linux 系統呼叫理解

系統呼叫即為linux核心中設定的一組用於實現各種系統功能的子程式,作業系統通過系統呼叫為執行在其上的程序提供服務。由於程序一般不能訪問核心所佔記憶體空間以及呼叫核心函式,為了與使用者態程序進行互動,核心提供一組介面用於應用程式訪問。linux中系統呼叫是使用者空間訪問核心的唯一途徑,除了異常和中斷...

了解linux下的系統呼叫

計算機系統的各種硬體資源是有限的,在現代多工作業系統上同時執行的多個程序都需要訪問這些資源,為了更好的管理這些資源程序是不允許直接操作的,所有對這些資源的訪問都必須有作業系統控制。也就是說作業系統是使用這些資源的唯一入口,而這個入口就是作業系統提供的系統呼叫。系統呼叫是屬於作業系統核心的一部分的,必...