システムコール

システムコールとは



システムコールとは、オペレーティングシステム (OS) の核となる部分、カーネルが提供する特権的な機能を、ユーザープログラムが利用するためのインターフェースです。OSの機能は、一般的にはAPIとして公開された特別な関数呼び出しを通じて利用できますが、このAPIの裏側で実際にOSの機能を呼び出すのがシステムコールです。μITRONではサービスコール、OSをスーパーバイザと呼ぶ場合はスーパーバイザコールとも呼ばれます。

例えば、C言語でよく使われる`fopen()`や`malloc()`といった標準ライブラリ関数は、内部で`open()`や`sbrk()`などのシステムコールを呼び出しています。システムコールは、アプリケーションから直接呼び出すことができるものもあれば、システムソフトウェアやデバイスドライバなど、特定のプログラムからのみ利用できるものもあります。

日本語では「システム呼び出し」と訳されることもありますが、一般的には外来語の「システムコール」という言葉が使われることが多いです。

システムコールの背景



現代のプロセッサは、複数の特権レベルで命令を実行します。代表的なものとしては、ユーザーモードとスーパーバイザーモードがあり、OSのカーネルスーパーバイザーモードで、アプリケーションはユーザーモードで動作します。この特権レベルの分け方によって、OSはハードウェアへのアクセスや割り込み処理、メモリ管理などを制限し、システムのセキュリティと安定性を維持しています。

低い特権レベルから高い特権レベルへの制御移行を安全に行うために、システムコールという機構が必要とされました。低い特権レベルのコードが、高い特権レベルのコードを直接実行できてしまうと、システムのセキュリティが損なわれたり、予期せぬ動作を引き起こす可能性があるためです。

システムコールの仕組み



システムコールは、専用の命令(またはソフトウェア割り込み)を利用して実行されます。CPUの動作モードを遷移させることで、保護されたメモリ領域へのアクセスや、保護されたレジスタの操作、CPUの動作モードの変更などが可能になります。

システムコールが呼び出されると、以下の流れで処理が行われます。

1. 呼び出し元のプログラムが中断され、コンテキスト(プログラムの実行に必要な情報)が保存されます。
2. CPUが高い特権レベルのコード(カーネル)に制御を移します。
3. カーネルは、システムコールの種類を示す番号や引数を受け取り、必要な処理を実行します。
4. この際、呼び出し側のアクセス権などをチェックし、システムコールを実行する権限があるかを確認します。
5. 処理が完了すると、保存されていたコンテキストを復元し、呼び出し元のプログラムに制御を戻します。
6. 戻り値は、特定のレジスタまたはスタックに格納されます。

システムコールは、ファイルI/Oやネットワーク通信など、時間のかかる処理を含むことがあります。その場合、プログラムは中断(ブロック)され、処理が完了するまで待機状態になります。処理が完了すると、OSはプログラムを実行可能な状態に戻します。

ライブラリの役割



一般的に、OSはユーザープログラムとカーネルの中間に位置するライブラリを提供します。これは標準Cライブラリの実装であることが多く、システムコールを直接呼び出すのではなく、ライブラリ関数を通じてOSの機能を利用します。ライブラリは、システムコールの呼び出しに必要な処理を行ったり、特権を必要としないデータ処理を行ったりします。

このライブラリの存在により、アプリケーションとOSの依存関係が緩和され、移植性が向上します。特にダイナミックリンク[[ライブラリ]](.dll)を使用する場合、システムコールの処理が実行時にリンクされるため、アプリケーションの実行ファイルを他のOSで実行できる可能性が高まります。

Exokernelベースのシステムでは、ライブラリ(LibOS)が特に重要です。Exokernelは非常に低いレベルのAPIしか提供しないため、LibOSが抽象化やリソース管理の機能を提供します。

システムコールの例



POSIXや類似のシステムにおける主要なシステムコールとしては、`open`、`read`、`write`、`close`、`wait`、`execve`、`fork`、`kill`などがあります。これらのシステムコールは、ファイルシステム、ネットワーク、メモリ、プロセス、スレッド、セキュリティなど、多岐にわたる機能を提供します。

最近のOSでは数百個のシステムコールが提供されており、例えば、Linuxでは317個、FreeBSDでは約500個のシステムコールが存在します(これらの数はバージョンやアーキテクチャによって異なります)。

Microsoft Windowsの場合は、Windows APIがシステムコールに相当する役割を果たします。

まとめ



システムコールは、OSの機能を利用するための重要なインターフェースであり、セキュリティと安定性を維持する上で不可欠な機構です。ユーザープログラムは、直接システムコールを呼び出すこともできますが、通常はライブラリ関数を通じて間接的に利用します。システムコールを理解することは、OSの動作原理を理解する上で重要です。



出典

Wikipedia

関連項目

CPUモード
リングプロテクション

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。