在linux中,系統呼叫是指作業系統提供給使用者程式呼叫的一組特殊接口,使用者程式可以根據這組介面獲得作業系統核心的服務;系統呼叫規定了使用者行程陷入核心的具體位置,或者說規劃了使用者存取核心的路徑,只能從固定位置進入核心。
本教學操作環境:linux7.3系統、Dell G3電腦。
1.什麼是系統呼叫
系統調用,指的是作業系統提供給使用者程式呼叫的一組特殊接口,使用者程式可以根據這組接口獲得作業系統核心的服務。它規定了使用者進程陷入核心的具體位置,或者說規劃了使用者存取核心的路徑,只能從固定位置進入核心。
2.linux的系統呼叫
對現代作業系統來說,系統呼叫是使用者空間和核心通訊的普遍手段,linux也不例外。依照功能區域,linux系統呼叫大致分為進程控制,檔案訪問,系統控制,儲存管理,網路管理,進程通訊等,詳細說明可以透過man 2 syscalls命令查看manpage說明。
系統調用,僅透過軟中斷機制向核心提交請求,進入系統調用對應服務。 linux提供的使用者程式介面遵循了POSIX標準,這套標準除了定義一些標準的C函數外,提供了一套封裝例程將系統呼叫封裝供使用者程式設計使用。不過封裝並非必須的,如果你願意直接調用,linux核心也提供了syscall()函數來實作呼叫。透過下面一個例子來了解C函式庫呼叫和直接呼叫的差異。
/* ** file: demo.c ** author: eric.xu ** date: 2016-02-25 */ #include <syscall.h> #include <unistd.h> #include <sys/types.h> #include <stdio.h> int main(void) { long id1, id2; /* system call no 20, __NR_getpid equal to SYS_getpid */ id1 = syscall(__NR_getpid); printf("sys_call getpid %ldn", id1); /* libc getpid */ id2 = getpid(); printf("libc getpid %ldn", id2); return 0; }
編譯運行,可以看到兩者結果一致。
sys_call getpid 2899 libc getpid 2899
3.linux系統呼叫實作
當使用者狀態的程序呼叫一個系統呼叫時,CPU切換到核心狀態並開始執行核心函數。因為核心中每個系統呼叫都有唯一的標號,所以用戶態呼叫必須傳遞一個系統呼叫號的參數來決定特定的系統呼叫函數。所有的系統呼叫函數都是整數,在核心中,整數和0表示系統呼叫成功結束,負數則表示出錯條件,而這個錯誤值會存放在errno變數中作為出錯碼回傳給應用程式。
linux系統呼叫使用軟中斷實現,在x86架構中呼叫int $0x80彙編指令,這條指令會產生向量為128的異常。而在arm架構中透過SWI指令進入核心空間,下面看下這條指令的格式:
SWI {cond} immed24;其中immed24表示24位立即数
SWI異常中斷處理程序需要透過讀取引起軟體中斷的SWI指令,取得24位元立即數。基本步驟是在SWI異常產生後,存取SPSR暫存器判斷該指令是ARM指令還是Thumb指令,然後透過存取LR暫存器得到整個指令位址,緊接著拿到該條指令,取得最低24位元立即數。
相關推薦:《Linux影片教學》
以上是linux中什麼是系統調用的詳細內容。更多資訊請關注PHP中文網其他相關文章!