I-6-6. システムコール

一般のアプリケーションからOSの機能を利用する際に使用するシステムコールを紹介する。システムコールの位置づけを説明し、システムコールが呼ばれたときのOS内部での振る舞いについて概説する。

【学習の要点】

* システムコールとは、アクセスできない保護領域にアクセスすることや、保護されたレジスタを操作するなど、カーネルの持つ特殊な機能を利用する場合に使用する仕組みのことである。

* Linuxでは約300種類のシステムコールが用意されており、CPUの動作モードなどを変更することも可能である。

* システムコールは、そのほとんどがソフトウェア割り込みによって実行されているため、その処理方法は一般の割り込み処理と同様である。

図I-6-6. システムコール

【解説】

1) システムコールとは

カーネルが提供する機能を一般のアプリケーションから利用する際に呼び出すサービスのことをシステムコールという。

* システムコールでできること

- 通常のアプリケーションからはアクセス不可能な保護対象のメモリ領域へのアクセス

- 通常は保護されているレジスタの操作

- CPUの動作モードの変更(一般のアプリケーションは勝手に変更できない)

* システムコールの数

OSによって異なるが、Linuxの場合、300個程度の種類が用意されている。FreeBSDの場合は、

およそ330個のシステムコールを利用可能である。

* システムコールの例

open, read, write, close, wait, fork, execve, killといったシステムコールがPOSIXで定義されている。なおPOSIXとは、様々なUNIXの実装やその他のOS間で共通なAPIを定め、アプリケーションの移植性を向上させることを目的として策定されたアプリケーションプログラムインタフェースの規格である。IEEEによって定められており、システムコールの定義もPOSIXで用意されている。

2) システムコールの処理方法

システムコールは、ソフトウェア割り込みで実現されることが多い。したがってシステムコールが発効された際の動作は、ソフトウェア割り込みに対する処理と同様となる。

* システムコールが呼び出されたときの動作

- システムコールを呼び出したプロセスはその時点で中断

- その時点でのコンテキストを保存 (システムコールからの復帰時にプロセスを正しく再開できるように)

- 呼び出された番号からシステムコールを選択、引数を設定 (なおこの際に呼び出したプロセスがそのシステムコールを実行する権利を持っているかどうかを調べ、問題がなければそのまま続行する)

- 選択されたシステムコールを実行

- システムコールの処理終了後、保存したコンテキストに従い呼び出し元プロセスに復帰

* プロセス再開時の実行順

システムコール終了後、呼び出したプロセスが直ちに再開されない場合がある。システムコールを呼び出したプロセスは、システムコールの処理終了後に復帰できるよう「実行可能」キューに並べられる。実行可能キューには複数のプロセスが入れられる可能性があり、このような場合、システムコールの処理が終了してもそのシステムコールを呼び出したプロセスが、終了後すぐに再開されるわけではない。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。