西城楊柳弄春柔——系統調用

什麼是系統調用?

系統調用是應用程序與操作系統內核之間的接口,它決定了應用程序是如何與內核打交道的,無論程序是直接進行系統調用,還是通過運行庫,最終還是會到達系統調用這個層面上,系統調用實現在內核中。

系統調用的意義?

在現代的操作系統裏,程序運行的時候,本身是沒有權利訪問多少系統資源的,由於系統有限的資源有可能被多個不同的的應用程序同時訪問,因此,如果不加以保護,那麼各個應用程序難免產生衝突。所以,現代操作系統將可能產生衝突的系統資源給保護起來,阻止應用程序直接訪問,所有的操作都必須經由操作系統所規定的方式來進行,如果沒有操作系統的幫助幫助,應用程序的執行可謂是相當艱難。

爲了讓應用程序有能力訪問系統資源,也爲了讓程序藉助操作系統做一些必須由操作系統支持的行爲,每個操作系統都會提供一套接口(系統調用),以供應用程序使用。這些接口往往通過中斷來實現,比如,Linux使用0x80號中斷作爲系統調用的入口

關於中斷(Interrupt)?

現代的CPU常常可以在多種截然不同的特權級別下執行指令,在現代的操作系統中,通常也據此有兩種特權級別,分別爲用戶模式(User Mode)和內核模式(Kernel Mode),也別成爲用戶態和內核態。由於有多種特權模式的存在,操作系統就可以讓不同的代碼運行在不同的模式上,以限制他們的權利,提高穩定性和安全性。

系統調用是運行在內核態的,而應用程序基本都是運行在用戶態的,用戶態的程序如何運行內核態的代碼呢?操作系統一般是通過中斷來從用戶態切換到內核態

那什麼是中斷呢?中斷是一個硬件或者軟件發出的請求,要求CPU暫停當前的工作轉手去處理更加重要的事情。

 

 

中斷一般具有兩個屬性,一個稱爲中斷號(從0開始),一個稱爲中斷處理程序。不同的中斷具有不同的中斷號。在內核中,有一個數組稱爲中斷向量表,這個數組的第n項包含了指向第n號中斷的中斷處理程序指針。當中斷到來時,CPU會暫停當前的執行代碼,根據中斷的中斷號,在中斷向量表中招到對應的中斷處理程序,並調用它。中斷處理程序執行完成後,CPU會繼續執行之前的代碼。(如下簡單示意圖)

 

通常意義上,中斷有兩種類型,一種被稱爲硬件中斷,這種中斷來自於硬件的異常或者其他事件的發生,如:電源掉電、按下鍵盤等。另一種被稱爲軟件中斷,軟件中斷通常是一條指令,帶有一個參數記錄中斷號,使用這條指令用戶可以手動出發某個中斷並執行其中的中斷處理程序。

由於中斷號是有限的,操作系統不會捨得用一箇中斷號來對應一個系統調用,而更傾向於用一個或者少數幾個中斷號來對應所有的系統調用。例如,Linux使用int 0x80 來觸發所有的系統調用。

那麼對於同一個中斷號,操作系統如何知道是哪一個系統調用要被調用呢?和中斷一樣,系統調用都有各自的一個系統調用號,就像身份標識一樣來標明是哪一個系統調用,這個系統調用號通常就是系統調用在系統調用表中的位置,例如,Linux中fork的系統調用號是2.

 

 

系統調用號在執行int指令前會被放置在某個固定的寄存器裏,對應的中斷代碼會取得這個系統調用號,並且調用正確的函數。以Linux的int 0x80 爲例,系統調用號是由寄存器eax來傳入的,用戶將系統調用號放入eax,然後使用int 0x80 調用中斷,中斷服務程序就可以從eax中取得系統調用號,進而調用對應的函數,當系統調用返回時,eax又作爲調用結果的返回值。(以fork爲例,簡單示意圖如下)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章