陳鐵 + 原創作品轉載請註明出處 + 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000。
Linux內核啓動後,接管系統控制權。本質上操作系統負責資源管控,用戶程序要使用任何資源,都需要申請相應的資源。系統調用就是操作系統爲用戶態進程與硬件設備進行交互提供的一組接口。系統調用通過軟中斷向內核發出一個明確的請求,使用一個封裝例程完成相應的功能,將結果返回給用戶進程。
當用戶態進程調用一個系統調用時,CPU切換到內核態並開始執行一個內核函數。 在Linux中是通過執行int $0x80來執行系統調用的,這條彙編指令產生向量爲128的編程異常。內核實現了很多不同的系統調用,進程指明需要哪個系統調用,把系統調用號作參數傳入eax寄存器。下面以linux系統調用getuid爲例簡單分析一下系統調用過程。
//getuid.c #include <stdio.h> #include <unistd.h> #include <sys/types.h> int main(int argc, char const *agrv[]) { uid_t uid; uid=getuid(); printf("The current user ID:%d\n",uid); return 0; }
執行結果:
利用內聯彙編的方式把系統調用展示一下,結果如圖:
可以看到,系統調用執行了內核的封裝例程,用戶進程只需要把相應的調用號放入eax寄存器,內核就在內核態完成相應的計算,把用戶所要求的結果返給用戶進程,參與其他運算。
總結,我認爲系統調用就是內核將常用的用戶需要使用底層硬件或特權級操作的相關代碼,封裝成服務例程,給每個例程一個編號(系統調用號),當用戶需要執行相應功能時,進程產生軟中斷int 0X80,裝系統調用號作爲參數傳入eax寄存器。完成相應的功能。