共計 1626 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章主要講解了“linux 中系統調用的概念是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“linux 中系統調用的概念是什么”吧!
在 linux 中,系統調用是指操作系統提供給用戶程序調用的一組特殊接口,用戶程序可以根據這組接口獲得操作系統內核的服務;系統調用規定了用戶進程陷入內核的具體位置,或者說規劃了用戶訪問內核的路徑,只能從固定位置進入內核。
本教程操作環境:linux7.3 系統、Dell G3 電腦。
linux 中什么是系統調用
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 中系統調用的概念是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!