Linux では、システム コールは、ユーザー プログラムが呼び出すためにオペレーティング システムによって提供される一連の特別なインターフェイスを指します。ユーザー プログラムは、この一連のインターフェイスに基づいてオペレーティング システム カーネルからサービスを取得できます。システム コールは、ユーザー プロセスがカーネルに閉じ込められる時間 特定の場所、またはユーザーがカーネルにアクセスするための計画されたパスは、固定された場所からのみ入力できます。
#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。
1. システム コールとは
システム コールとは、オペレーティング システムによって提供される呼び出しを指します。ユーザー プログラム ユーザー プログラムがオペレーティング システム カーネルからサービスを取得できる特別なインターフェイスのセット。これは、ユーザー プロセスがカーネルに入る特定の場所を規定するか、ユーザーがカーネルにアクセスするためのパスを計画し、固定された場所からのみカーネルに入ることができます。
2. Linux システム コール
最新のオペレーティング システムでは、システム コールはユーザー空間とカーネル間の通信の一般的な手段であり、Linux も例外ではありません。 Linux システム コールは、機能分野に応じて、プロセス制御、ファイル アクセス、システム制御、ストレージ管理、ネットワーク管理、プロセス通信などに大別されます。詳細な説明については、man 2 syscalls コマンドを使用してマンページの説明を参照できます。
システム コールは、ソフト割り込みメカニズムを通じてカーネルに要求を送信するだけであり、システム コールの対応するサービスに入ります。 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; }
コンパイルして実行すると、2 つの結果が一貫していることがわかります。
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 中国語 Web サイトの他の関連記事を参照してください。