基礎:作業系統是什麼

系統呼叫

系統呼叫(system call)是使用者程式請求作業系統替它做自己不被允許做的事所經過的受控門戶。想像一家銀行:你不能走進金庫拿現金,但你可以走到櫃員窗口,填張單據,請求提款。受信任、待在櫃檯後面的櫃員(核心)會檢查你的請求,並替你完成特權工作。系統呼叫就是那個櫃員窗口——從使用者模式進入核心唯一的、有人看守的官方通道。

在機制上,一次系統呼叫會發生這些事:程式把請求編號(它想要哪項服務,例如 read)與引數(哪個檔案、把位元組放哪裡、放多少)放進約定好的暫存器,然後執行一條特殊的陷阱指令。那條指令把 CPU 切換到核心模式,並跳到核心裡單一固定的進入點。核心在它的系統呼叫表中查找請求編號、驗證引數(這是真的檔案描述符嗎?緩衝區在程式自己的記憶體裡嗎?)、執行特權工作、放好回傳值、切回使用者模式,並在陷阱指令之後恢復程式。從程式的角度看,它幾乎就像一次平常的函式呼叫,只是異常地強大。

系統呼叫是程式抵達作業系統服務的整個介面——開檔案、建立行程、配置記憶體、送網路資料,全都經由它。有兩個誠實的重點。第一,系統呼叫比一般函式呼叫昂貴,因為有模式切換與驗證,所以寫得好的程式會避免做成千上萬次的細小呼叫(它們會批次處理或加緩衝)。第二,核心絕不能信任系統呼叫遞給它的引數——惡意程式會故意傳入壞的指標與超出範圍的值,所以在這道邊界謹慎檢查,是作業系統安全的核心一環。

read(fd, buf, 100) 這個呼叫是一次系統呼叫:程式請求核心從已開啟的檔案 fd 讀取最多 100 個位元組到緩衝區 buf。核心檢查 fd 是否有效、buf 是否落在程式的記憶體內,從裝置取出位元組、複製進去,並回傳它實際讀到的數量。

程式提出請求;核心驗證、完成特權工作,然後返回。

系統呼叫不等於你從程式語言裡呼叫的函式庫函式——函式庫函式往往只是把底層真正的系統呼叫包裝起來並觸發它。弄清這個差別,就是「API 與系統呼叫的區別」。

又稱
syscallkernel callsystem呼叫