ホームページ  >  記事  >  運用・保守  >  Linuxのシステムコールとは何ですか

Linuxのシステムコールとは何ですか

WBOY
WBOYオリジナル
2022-03-21 14:15:305971ブラウズ

Linux では、システム コールは、ユーザー プログラムが呼び出すためにオペレーティング システムによって提供される一連の特別なインターフェイスを指します。ユーザー プログラムは、この一連のインターフェイスに基づいてオペレーティング システム カーネルからサービスを取得できます。システム コールは、ユーザー プロセスがカーネルに閉じ込められる時間 特定の場所、またはユーザーがカーネルにアクセスするための計画されたパスは、固定された場所からのみ入力できます。

Linuxのシステムコールとは何ですか

#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。

Linux のシステム コールとは

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。