系统调用概念
“操作系統”通常包含以下兩種含義:
1、表示完整的軟件包,包括用來管理計算機資源的核心層軟件,以及附帶的所有標準軟件工具,諸如命令行解釋器、圖形用戶界面、文件操作工具和文本編輯器等;
2、狹義上的操作系統是指管理和分配計算機資源(如CPU、RAM和設備)的核心層軟件。
內核負責管理分配計算機資源,作為計算機和用戶之間的溝通橋梁而存在。因此就有內核態和用戶態的概念。執行硬件指令可以在兩種狀態間轉換。與之對應,可以將虛擬內存分為內核空間和用戶空間。在用戶態運行時,CPU只能訪問用戶空間;在內核態運行時,CPU可以訪問內核空間和用戶空間。
系統調用是受控的內核入口,借助這一機制,進程可以請求內核以自己的名義去執行某些動作。以應用程序編程接口的形式(API),內核提供了一系列服務。這些服務包括創建新錦程、執行I/O、為進程間通信創建管道等。
需要注意:
1、系統調用將處理器從用戶態切換到內核態,以便CPU訪問受保護的內核空間;
2、系統調用的組成是固定的,每個系統調用都由一個唯一的數字來標識;
3、每個系統調用都提供一套參數,來規范用戶空間與內核空間之間的信息傳遞;
從編程角度來看,系統調用很像C語言函數調用。下面是一個系統調用事件的發生順序:
1、應用程序通過調用C語言的外殼函數(wrapper)發起系統調用;
2、對系統調用中斷處理例程來說,外殼函數必須保證所有的系統調用參數可用。參數是通過堆棧傳遞到外殼函數的,但內核希望這些參數置入特定的寄存器。因此,外殼函數將上述參數復制到寄存器;
3、由于所有的系統調用進入內核的方式相同,內核需要設法區分每個系統調用。因此外殼函數會將系統調用編號復制到一個特殊的CPU寄存器中;
4、外殼函數執行一條中斷機器指令(int 0x80),引發處理器從用戶態切換到內核態,并執行系統中斷0x80的中斷矢量所指向的代碼;
5、為響應0x80中斷,內核會調用system_call()例程,來處理中斷,具體如下:
(1)在內核棧中保存寄存器值;
(2)審核系統調用編號的有效性;
(3)以系統調用編號對存放所有調用服務例程的列表(內核變量sys_call_table)進行索引,發現并調用相應的系統調用服務例程。若系統調用服務例程帶有參數,那么將首先檢查參數的有效性。隨后該服務例程會執行必要的任務,這可能會涉及對特定參數中指定地址處的值進行修改,以及在用戶內存和內核內存間傳遞數據。最后該服務例程會將結果狀態返回給system_call()例程;
(4)從內核態回復寄存器的值,并將系統調用返回值置于堆棧中;
(5)返回外殼函數,同時將處理器切換到用戶態;
6、若系統調用服務例程的返回值表明調用出錯,外殼函數會使用該值來設置全局變量errno。然后外殼函數會返回調用函數,并返回一個整數型值,以表明系統調用是否成功。
下圖以系統調用execve()為例,展示了上述事件的發生序列:
總結
- 上一篇: 神角技巧手游哥布林营地宝箱怎么开
- 下一篇: 请教怎么用简单的代码解决textarea