システムコール
ハードウェアとOSからなるシステムが、アプリケーションプログラムに対して提供する機能を呼び出すこと、もしくはそのための機能をシステムコールという。メーカーやOSなどによりさまざまな呼び方があり、「ファンクションコール」(Function Call)、「API」(Application Programming Interface)などとも言う。
システムコール
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2026/04/09 10:01 UTC 版)
|
|
システムコール(英: system call)とは、アプリケーションソフトウェアなどがオペレーティングシステムのカーネル機能を実行させるために用いる呼出しの機構である[1]。
ユーザ空間とカーネル空間の境界に位置づけられ、ファイル操作、プロセス制御、入出力処理、メモリ管理などの基本機能の利用に用いられる。通常はライブラリ関数を介して発行され、実行時にCPUの特権レベル遷移を伴う点に特徴がある。
背景
現代のプロセッサは一般にいくつかの特権状態で命令を実行する。2つのレベルを持つシステムでは、これを通常ユーザーモードとスーパーバイザーモードと呼ぶ。このような特権レベルがあるのは、セキュリティと安定性を保つためにOSがその管理下で動作するプログラムによる操作を制限できるようにするためである。そのような制限を受ける操作としては、ハードウェア機器へのアクセス、割り込みの可/不可の変更、プロセッサの特権状態の変更、メモリ管理ユニットへのアクセスなどがある。OSのカーネルはスーパーバイザーモードで動作し、ユーザーアプリケーションはユーザーモードで動作する。
このような複数の特権レベルを持つシステムを開発するにあたって、低い特権レベルから高い特権レベルへ制御を安全に転送する機構が必要となった。低い特権レベルのコードが単純に高い特権レベルに移行したのではセキュリティと安定性は保てない。例えば、低い特権レベルのコードが高い特権レベルのコードに間違った処理をさせたり、不正なコールスタックを渡したりするかもしれない。
機構
システムコールは、多くの場合、専用命令(インテルx86はPentium II以降、ARMは最初から)もしくはソフトウェア割り込みによって実行される。CPUの動作モードを遷移させることによって、通常のアプリケーションプログラムからはアクセスできない保護されたメモリ領域にアクセスすることや、保護されたレジスタを操作すること、また、自らCPUの動作モードを変更することなどが可能になる。
システムコールは特殊な命令を使うことが多く、それによってCPUは高い特権レベルのコードに制御を渡す。具体的な方法はシステムに依存するが、例外や割り込みを発生させることで高い特権レベルに移行したり、特殊な分岐命令で高い特権レベルに移行したりする。このときにシステムコールの種別を示す番号や引数がレジスタやコールスタックに格納されていて、高い特権レベルのコード(カーネル)がそれを使用して処理を行う。
システムコールが呼び出されたとき、呼び出したプログラムは中断され、後で処理を続行するために必要な情報(コンテキスト)が保存される。そしてプロセッサが高い特権レベルのコードを実行し、上述のシステムコールの番号や引数を調べ、必要な処理を行う。この際に呼び出し側のアクセス権なども考慮して指定されたシステムコールを実行する権利があるかどうかがチェックされる。完了すると呼び出し側プログラムに復帰するため、保存されていた状態情報をリストアし、プログラムの処理が続行される。このとき所定のレジスタ(あるいはスタックの所定の位置)にリターン値が設定される。
多くの場合、プログラムへの復帰が即座に行われない可能性があることに注意が必要である。システムコールでは時間のかかるI/O処理をすることがあり(例えばディスクやネットワークへのアクセス)、プログラムは中断され(「ブロック」状態)、その処理が完了するまで「実行可能」キューに置かれる。必要な処理が完了すると、OSはそれを実行の候補として扱う。
中間層としてのライブラリ
一般にOSはユーザープログラムとOSの中間に位置するライブラリを提供している。標準Cライブラリを実装したもの(あるいは同等の機能をもつもの)が多い。このライブラリ内で実際のシステムコール(カーネルへ渡す情報の設定や特権モードへの移行)が行われたり、特権レベルの処理を必要としない様々なデータ処理が行われたりする。これにより、OSとアプリケーションの繋がりが緩められ、アプリケーションの移植性が高まっていると言える。特にダイナミックリンクライブラリ (.dll) であれば、システムコール処理部分が実行時にリンクされるため、アプリケーションの実行ファイルをそのまま他のOS上で実行できる可能性が高まる。
Exokernelに基づいたシステムでは、ライブラリが特に重要である。Exokernelは非常に低いレベルのカーネルAPIしか提供せず、LibOSと呼ばれるライブラリが抽象化やリソース管理の機能を提供している。
システムコールの例
POSIXおよび類似のシステムでの主要なシステムコールとしては、open、read、write、close、wait、execve、fork、kill などがある。ファイルシステム・ネットワーク・メモリ・プロセス・スレッド・セキュリティなどの機能を提供している。最近[いつ?] のOSは数百のシステムコールを持つ。例えば、Linuxは317個(Linux 2.6.35.4現在, i386アーキテクチャ[2][3])、FreeBSDは約500個[4]である。
Microsoft WindowsではWindows APIにシステムコールが含まれる。
出典
関連項目
システムコール
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/01/30 16:19 UTC 版)
システムコールは、ソフトウェア割り込みにより呼び出されるが、8080やZ80などの8ビットのコンピュータではメジャーな存在だったCP/Mとの互換性、特に8080用にアセンブリ言語で書かれたソースコードを8086にコンバートして用いる場合を想定し、call 5でも利用可能としてCP/M 80からの移行を促した。
※この「システムコール」の解説は、「MS-DOS」の解説の一部です。
「システムコール」を含む「MS-DOS」の記事については、「MS-DOS」の概要を参照ください。
固有名詞の分類
- システムコールのページへのリンク