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

What Is Linux System Call



Linuxシステムコールの定義を掘り下げてその実行の詳細を調べる前に、典型的なLinuxシステムのさまざまなソフトウェア層を定義することから始めるのが最善です。

Linuxカーネルは、ハードウェア上で利用可能な最低レベルで起動および実行される特殊なプログラムです。キーボード、ディスク、ネットワークイベントの処理から、複数のプログラムを並行して実行するためのタイムスライスの提供など、コンピューター上で実行されるすべてのものを調整するタスクがあります。







カーネルがユーザーレベルのプログラムを実行すると、メモリスペースが仮想化され、プログラムはメモリ内で実行されている唯一のプロセスであると見なします。このハードウェアとソフトウェアの分離の保護バブルにより、セキュリティと信頼性が向上します。特権のないアプリケーションは他のプログラムに属するメモリにアクセスできず、そのプログラムがクラッシュすると、カーネルが終了するため、システムの他の部分に害を及ぼすことはありません。



Linuxシステムコールで障壁を破る

特権のないアプリケーション間のこの分離層は、システム上の他のアプリケーションやユーザーを保護するための優れた境界を提供します。ただし、コンピュータや外の世界の他の要素とインターフェイスする方法がなければ、プログラムはほとんど何も達成できません。



相互作用を容易にするために、カーネルは、実行中のプログラムがカーネルに代わって動作するように要求できるようにするソフトウェアゲートを指定します。このインターフェイスは、システムコールと呼ばれます。





LinuxはすべてがファイルであるというUNIXの哲学に従っているため、デバイスである可能性のあるファイルを開いて読み取りまたは書き込みを行うことで、多くの機能を実行できます。たとえば、Windowsでは、CryptGenRandomという関数を使用してランダムなバイトにアクセスできます。ただし、Linuxでは、これは、ファイル/ dev / urandomを開き、標準のファイル入出力システムコールを使用してファイルからバイトを読み取るだけで実行できます。この決定的な違いにより、よりシンプルなシステムコールインターフェイスが可能になります。

ウェーハ-薄いラッパー

ほとんどのアプリケーションでは、システムコールはカーネルに対して直接行われません。事実上すべてのプログラムが標準Cライブラリにリンクされており、Linuxシステムコールの薄いが重要なラッパーを提供します。ライブラリは、関数の引数が正しいプロセッサレジスタにコピーされていることを確認してから、対応するLinuxシステムコールを発行します。呼び出しからデータを受信すると、ラッパーは結果を解釈し、一貫した方法でプログラムに返します。



舞台裏

システムと対話するプログラム内のすべての関数は、最終的にシステムコールに変換されます。これが実際に動作することを確認するために、基本的な例から始めましょう。

空所主要(()。 {{
}

これはおそらくあなたが今まで見た中で最も些細なCプログラムです。メインのエントリポイントを介して制御を取得し、終了するだけです。 mainはvoidとして定義されているため、値を返すことすらありません。ファイルをctest.cとして保存し、コンパイルしてみましょう。

gccctest。NS -ctest

コンパイルすると、ファイルサイズは8664バイトになります。システムによって多少異なる場合がありますが、約8kになるはずです。出入りするだけのコードはたくさんあります。 8kである理由は、libcランタイムが含まれているためです。シンボルを削除しても、6kを少し超えています。

さらに簡単な例では、Cランタイムに依存するのではなく、Linuxシステムコールを実行して終了させることができます。

空所_始める(()。 {{
asm(('movl $ 1、%eax;'
'xorl%ebx、%ebx;'
'int $ 0x80')。;
}

ここでは、1をEAXレジスタに移動し、EBXレジスタ(そうでなければ戻り値を含む)をクリアしてから、Linuxシステムコール割り込み0x80(または10進数で128)を呼び出します。この割り込みは、カーネルが呼び出しを処理するようにトリガーします。

asmtest.cという新しい例をコンパイルし、シンボルを削除して標準ライブラリを除外すると、次のようになります。

gcc-NS-nostdlibasmtest。NS -o asmtest

1k未満のバイナリを生成します(私のシステムでは、984バイトになります)。このコードのほとんどは実行可能ヘッダーです。現在、Linuxの直接システムコールを呼び出しています。

すべての実用的な目的のために

ほとんどすべての場合、Cプログラムで直接システムコールを行う必要はありません。ただし、アセンブリ言語を使用する場合は、必要が生じる可能性があります。ただし、最適化では、Cライブラリ関数にシステムコールを実行させ、パフォーマンスが重要なコードのみをアセンブリディレクティブに埋め込むのが最善です。

システムコールチュートリアルをプログラムする方法

すべてのシステムコールのリスト

Linuxで利用可能なすべてのシステムコールのリストを確認したい場合は、次のリファレンスページを確認してください。LinuxHint.comのシステムコールの完全なリスト、 filippo.io/linux-syscall-table/ およびまたは syscalls.kernelgrok.com