linux系統呼叫第一篇

ivanlee717發表於2024-04-15

系統呼叫

系統呼叫,顧名思義,說的是作業系統提供給使用者程式呼叫的一組“特殊”介面。使用者程式可以透過這組“特殊”介面來獲得作業系統核心提供的服務,比如使用者可以透過檔案系統相關的呼叫請求系統開啟檔案、關閉檔案或讀寫檔案,可以透過時鐘相關的系統呼叫獲得系統時間或設定定時器等。

從邏輯上來說,系統呼叫可被看成是一個核心與使用者空間程式互動的介面——它好比一箇中間人,把使用者程序的請求傳達給核心,待核心把請求處理完畢後再將處理結果送回給使用者空間。

image-20240415102749218

系統服務之所以需要透過系統呼叫來提供給使用者空間的根本原因是為了對系統進行“保護”,因為我們知道 Linux 的執行空間分為核心空間與使用者空間,它們各自執行在不同的級別中,邏輯上相互隔離。所以使用者程序在通常情況下不允許訪問核心資料,也無法使用核心函式,它們只能在使用者空間操作使用者資料,呼叫使用者空間函式。

實現

系統呼叫是屬於作業系統核心的一部分的,必須以某種方式提供給程序讓它們去呼叫。CPU 可以在不同的特權級別下執行,而相應的作業系統也有不同的執行級別,使用者態和核心態。執行在核心態的程序可以毫無限制的訪問各種資源,而在使用者態下的使用者程序的各種操作都有著限制,比如不能隨意的訪問記憶體、不能開閉中斷以及切換執行的特權級別。顯然,屬於核心的系統呼叫一定是執行在核心態下,但是如何切換到核心態呢?

答案是軟體中斷。軟體中斷和我們常說的中斷(硬體中斷)不同之處在於,它是透過軟體指令觸發而並非外設引發的中斷,也就是說,又是程式設計人員開發出的一種異常(該異常為正常的異常)。作業系統一般是透過軟體中斷從使用者態切換到核心態。

系統呼叫(system call)和庫函式(library function)是程式設計中常用的兩種呼叫方式,它們之間有以下幾點區別:

  1. 觸發方式
    • 系統呼叫是由使用者程式透過特殊的指令(例如軟中斷指令或者特定的處理器指令)觸發的,以請求作業系統提供服務或執行特定操作。
    • 庫函式是由使用者程式直接呼叫的函式,這些函式通常封裝在庫檔案中,使用者程式透過連結庫檔案來呼叫這些函式。
  2. 特權級別
    • 系統呼叫執行時會導致使用者態和核心態之間的切換,因為系統呼叫需要訪問作業系統的核心空間,具有較高的許可權級別。
    • 庫函式的執行在使用者態完成,不需要切換到核心態,因此無需特殊的許可權。
  3. 功能
    • 系統呼叫通常提供了與作業系統相關的底層功能,例如檔案操作、程序管理、網路通訊等。
    • 庫函式提供了各種常用的功能,例如字串處理、數學運算、記憶體管理等。
  4. 效能開銷
    • 由於系統呼叫涉及使用者態和核心態之間的切換,因此通常會伴隨著較大的效能開銷。
    • 庫函式的呼叫通常只涉及使用者態,因此效能開銷較小。
  5. 跨平臺性
    • 系統呼叫的介面是由作業系統定義的,因此在不同的作業系統上可能存在差異,需要編寫特定平臺的程式碼。
    • 庫函式通常是標準化的介面,在不同的程式語言和平臺上都可以使用,具有較好的跨平臺性。

image-20240415105955948

C庫IO函式工作流程

image-20240415110205627

後續提供具體程式碼

虛擬地址空間

每個程序都會分配虛擬地址空間,在32位機器上,該地址空間為4G:

image-20240415110854676

image-20240415125012940

程式碼裡體現的都是使用者區的資料段。image-20240415125258651

在程序裡平時所說的指標變數,儲存的就是虛擬地址。當應用程式使用虛擬地址訪問記憶體時,處理器(CPU)會將其轉化成實體地址。

這樣做的好處在於:

  • 程序隔離,更好的保護系統安全執行

  • 遮蔽物理差異帶來的麻煩,方便作業系統和編譯器安排程序地址

具體對於虛擬地址空間的理解我看的這一篇

相關文章