seegongsik
単語帳
オペレーティングシステム

システムコール:プログラムがOSにお願いする公式の窓口

前回の終わりに、妙な隙間を一つ見ましたね。OSはファイルごとに権限を決めるのに、肝心の私のプログラムは、読み取りを許されたファイルでさえディスクから直接取り出せない、と。じつはプログラムは、ディスクも画面もネットワークも勝手にさわれません。固い柵の中に閉じこめられているからです。では、いったいどうやってファイルを開き、画面に文字を映すのでしょう。

01

プログラムは柵の中に閉じこめられている(ユーザーモード)

前に、OSはプログラムどうしが互いのメモリを侵せないように壁を立てる、と言いました。その壁は、ハードウェアにも同じように働きます。ふつうのプログラムは、ディスクに直接手を伸ばすことも、画面に直接点を打つことも、ネットワークの線を直接さわることもできません。まるで柵の中に入っているようなものです。こうして閉じこめられた状態を、ユーザーモードと呼びます。窮屈に見えますが、理由があります。もしどんなプログラムでもハードウェアを直接いじれたら、ミスだらけの、あるいは悪意あるプログラム一つが、コンピューター全体を壊しかねないからです。

プログラム
ディスク

プログラムにディスクへ直接手を伸ばさせてみましょう。壁にはばまれて遮断(赤)されます。ユーザーモードのプログラムは、ハードウェアを直接さわれません。

直接手を伸ばすたびに、ことごとくはばまれました。安全のためには当然のことです。でも、それなら不思議ですよね。私たちが毎日使うプログラムは、ちゃんとファイルを開き、写真を見せ、インターネットにつなぎます。閉じこめられているはずなのに、その仕事をいったいどうやってやりとげるのでしょう。秘密は、自分でやるのではなく、お願いすることにあります。次で、そのお願いのやり方を見ましょう。

02

解決:公式の窓口にお願いする(システムコール)

銀行に行くとき、私たちは金庫に直接入りません。窓口へ行って依頼書を差し出すと、鍵を持つ職員が代わりに処理してくれます。プログラムも同じです。ディスクを直接開けない代わりに、OSの窓口へ行ってお願いします。「このファイルを開いて」「この文字を画面に映して」「インターネットでこれを送って」と。こうしてOSに差し出す要求一つ一つを、システムコールと呼びます。かんじんなのは、プログラムが仕事を自分でやらず、OSにやらせる、ということです。OSにはその権限があるからです。

プログラム
OSの窓口
ディスク

依頼書を押して窓口にお願いしてみましょう。プログラム(金)がファイルを開くをOSの窓口(青)に差し出すと、OSが代わりに処理して結果を返します(緑)。

窓口にお願いしたら、できなかったことができました。プログラムは依然として柵の中にいますが、OSという代理人を通して、外の仕事をやりとげたのです。でも一つ妙です。同じディスクなのに、プログラムが直接さわると止められ、OSがさわるとできるのはなぜでしょう。窓口を越えるその短い瞬間に、何かが変わるのは確かです。次で、その変化をのぞいてみましょう。

03

窓口を越えると権限が変わる(ユーザーモードとカーネルモード)

秘密は、CPUに二つのモードがあることです。一つはユーザーモード。私たちのプログラムが住む、力の制限された世界です。もう一つはカーネルモード。ハードウェアでも何でもさわれる、OSの強力な世界です。ふだんプログラムはユーザーモードで走ります。そして、システムコールで窓口を越えた瞬間、CPUはしばらくカーネルモードに変わります。その強い権限でOSが頼まれた仕事を処理し、終わるとすぐにユーザーモードに戻って、プログラムに結果を渡します。強い力は、要求を処理するその瞬間だけ、しかもこの窓口でだけ与えられ、すぐに取り戻されるのです。

ユーザーモード

システムコールを押してみましょう。プログラムはユーザーモード(金)で走り、窓口を越えた瞬間カーネルモード(青)に変わって仕事を処理し、またユーザーモードに戻ります。

モードがしばらく変わって、また戻る。この小さな踊りこそが、じつはOSの安全の核心です。力はいつもオンなのではなく、お願いが来たその瞬間だけオンになって、また切れるからです。でもここで、一つ疑問がわきます。窓口を越えさえすればOSが言われたとおり何でもやってくれるなら、結局プログラムが直接ハードウェアをさわるのと何が違うのでしょう。だから窓口には、もう一つ仕事があります。検査です。次で見ましょう。

04

窓口が一つだから検査できる(権限の確認)

もしOSが、お願いされたとたんに何も問わずすべてやってしまうなら、窓口はただの通過点でしょう。でもOSはそうしません。すべての要求が必ずこの一つの窓口を通るので、OSは仕事を処理する前に、まず検査できます。「君、このファイルを読む権限ある?」前回見た、あの権限の確認が、ここで起きます。権限があれば処理し、なければ断ってエラーを返します。狭い窓口一つが、すべての危険な行動が必ず通る検問所になるのです。

要求を選んで窓口に出してみましょう。OSが権限を検査します。許された要求は処理(緑)、禁じられた要求(例えば他人のファイルへの書き込み)は拒否(赤)してエラーを返します。

許された要求は通り、禁じられた要求は戸口で止められました。窓口が狭いことは不便なのではなく、むしろ安全装置でした。すべての危険な行動が必ず一か所を通るので、その一か所でだけルールを守ればよいからです。さて、ユーザーモードの柵、お願いというシステムコール、しばらく変わるカーネルモード、そして窓口での検査まで、一本の線でつないでみましょう。

05

まとめ:一本の線でつないだ往復、そして窓口の奥のカーネル

全体を一本の線で見ると、こうです。プログラムはユーザーモードの柵の中で、ハードウェアを直接さわれないまま走ります。何かが必要になると、システムコールで公式の窓口にお願いします。窓口を越えた瞬間、CPUはしばらくカーネルモードに変わり、OSはまず権限を検査してから仕事を処理します。終わると、またユーザーモードに戻って結果を渡します。つまりシステムコールは、プログラムとOSの力をつなぐ、たった一つのよく守られた扉なのです。私たちがファイルを開くとき、画面に点を一つ打つとき、インターネットに何かを送るとき、そのすべてが静かにこの扉を通っていきます。

各ステップを順に押して、一周をたどってみましょう。ユーザープログラムからシステムコールへ、カーネルモードへの切り替えと権限検査へ、仕事の処理から結果の返却まで。往復がひと目で整理できます。

でも、その窓口の奥で、カーネルモードの強い力で実際に仕事を処理してくれる存在は、だれなのでしょう。OSのいちばん深い中心、すべての権限を握ってハードウェアと直接話す、その核には名前があります。カーネルです。システムコールは結局、このカーネルへ送るお願いだったのです。次回は、いよいよそのカーネルと正面から出会います。これまで見てきたスケジュール、メモリ、ファイル、権限、窓口が、みなだれの手で回っていたのかを、一か所で見ることになります。

一言でいうとすべてのプログラムは、直接ハードウェアにさわれないよう柵の中(ユーザーモード)に閉じこめられています。仕事をするには、OSにお願いしなければなりません。そのお願いこそがシステムコールです。「このファイルを開いて」「画面に映して」といった要求を、公式の窓口に差し出すのです。窓口を越えた瞬間、CPUはしばらく強い権限(カーネルモード)に変わってOSが仕事を処理し、すぐにもとのモードに戻ります。窓口が一つしかないので、OSはすべての要求を先に検査でき(権限の確認もここで)、そのおかげで柵はしっかり立ったまま、プログラムは必要な仕事をやりとげます。
オペレーティングシステム
このページがお役に立ったなら支援する