什么是系統調用?
由操作系統提供的供所有系統調用的程序接口集合;用戶程序通常只在用戶態下運行,當用戶程序想要調用只能在內核態運行的子程序時,所以操作系統需要提供訪問這些內核態運行的程序的接口,這些接口的集合就叫做系統調用,簡要的說,系統調用是內核向用戶進程提供服務的唯一方法。
用戶程序通過系統調用從用戶態(user mode)切換到核心態(kernel mode ),從而可以訪問相應的資源。這樣做的好處是:
- 為用戶空間提供了一種硬件的抽象接口,使編程更加容易。
- 有利於系統安全。
- 有利於每個進程度運行在虛擬系統中,接口統一有利於移植
系統調用的過程
首先介紹下什么是中斷處理:
中斷處理是從用戶態進入到內核態的主要的方式,也可能是用戶態程序執行的過程中調用了一個系統調用陷入了內核態當中,這個叫做trap,系統調用只是一種特殊的中斷。
系統調用機制
- 中斷/異常機制
支持系統調用服務的實現:選擇一條陷入指令(訪管指令)即可
- 選擇一條特殊指令:陷入指令(亦稱訪管指令)
引發中斷異常完成用戶態到內核態的切換
- 系統調用號和參數:
每個系統調用都實現給定一個編號(功能號)
怎樣傳遞參數?
-
由陷入指令自帶參數:陷入指令的長度有限,且還要攜帶系統調用功能號,只能自帶有限的參數
-
通過通用寄存器傳遞參數:這些寄存器是操作系統和用戶程序都能訪問的,但寄存器的個數會限制傳遞參數的數量
-
在內存中開辟專用堆棧區來傳遞參數
- 系統調用表:
存放系統調用服務例程入口地址
完整過程:
用戶調用高級語言的庫函數 ->轉換為匯編語言,封裝好的函數做好參數傳遞工作,調用中斷處理程序int 0x80 ->CPU通過0x80號在IDT中找到對應的服務例程並調用 ->將參數保存在內核棧,根據系統調用號索引系統調用表,找到系統調用程序入口 ->執行完程序后再返回用戶態