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

わかりやすく システムコール とは

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

01

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

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

プログラム
ディスク

ボタンを押すと、プログラムがディスクに直接手を伸ばします。真ん中の壁が赤くなって阻まれ、ユーザーモードのプログラムはハードウェアに直接触れられないことがわかります。

直接手を伸ばすたびに、毎回阻まれます。安全を考えれば当然のことです。
けれども不思議です。私たちが毎日使うプログラムは、ちゃんとファイルを開き、写真を見せ、インターネットにつながります。柵に閉じ込められているのに、どうやってそれをやってのけるのでしょうか。
秘密は、自分でやらずに頼むところにあります。

02

解決:公式の窓口に頼む(システムコール)

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

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

ボタンを押すと、プログラム(金)がOSの窓口(青)に「ファイルを開く」を頼み、OSがディスクで代わりに仕事をして結果を返します(緑)。プログラムは一度もディスクに直接触れません。

窓口に頼んだら、できなかったことができました。プログラムは相変わらず柵の中にいますが、OSという代理人を通して外の仕事をやり遂げたのです。
ただ、一つ不思議なことがあります。同じディスクなのに、プログラムが触れると止められ、OSが触れると通るのはなぜでしょうか。
窓口を越えるその短い瞬間に、何かが切り替わっているはずです。

03

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

秘密は、CPUに二つのモードがあることです。一つは、私たちのプログラムが暮らす、力の限られたユーザーモードです。もう一つは、ハードウェアでも何でも触れられる、OSのカーネルモードです。
プログラムはふだんユーザーモードで動いています。システムコールで窓口を越えた瞬間、CPUは一時的にカーネルモードに切り替わります。OSはその強い権限で頼まれた仕事を処理し、終わるとすぐにユーザーモードへ戻って、プログラムに結果を渡します。
強い力は、要求を処理するその瞬間だけ、しかもこの窓口を通したときだけ与えられ、すぐに取り上げられるのです。

ユーザーモード

ボタンを一度押すと、システムコールが窓口を越え、カーネルモード(青)でOSが仕事を処理します。もう一度押すと、ユーザーモード(金)に戻って結果を受け取ります。

一瞬モードが切り替わり、また戻ってくる。この短い往復こそが、OSの安全の要です。強い力はつけっぱなしではなく、頼みが来た瞬間だけオンになり、すぐに切れます。
とはいえ、疑問が一つ残ります。窓口を越えさえすればOSが言われたとおり何でもしてくれるのなら、プログラムがハードウェアに直接触れるのと結局何が違うのでしょうか。
そこで窓口には、もう一つ仕事があります。検査です。

04

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

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

三つの要求から一つを選んで窓口に出します。OSが権限を検査し、自分のファイルを読むことと画面への出力は処理し(緑)、友だちのファイルへの書き込みは断ってエラーを返します(赤)。

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

05

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

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

五つのステップを順に押すと、プログラム、システムコール、カーネルモードと権限検査、仕事の処理、結果の返却とつながる往復が一周分点灯します。五つすべてがつけば一周の完成です。

では、その窓口の奥で、カーネルモードの強い力を使って実際に仕事をしているのはだれでしょうか。OSのいちばん深い中心で、すべての権限を握り、ハードウェアと直接やり取りする部分には名前があります。カーネルです。システムコールは、結局このカーネルへの頼みごとだったのです。
次のレッスンでは、いよいよカーネルと正面から向き合います。これまで見てきたスケジューリング、メモリ、ファイル、権限、窓口が、すべてだれの手で動いていたのかを、一か所で見ることになります。

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