CPUの持つリングプロテクションのものです。ぷりんOSはx86のみのサポートなのでこれ以降、x86前提で話していきます。カーネル管理下の領域にはハードウェア情報やらなにやらがあり、誰でもアクセス可能だったら、めちゃくちゃ困りますし、セキュリティもあったもんじゃありません。カーネルとユーザを分離する必要があります。そのための機構がリングプロテクションで、以下のような図で表されます。x86リングプロテクション数字が小さいほうが権限が高く、大きい方が権限が低いです。x86では4つのリングがありますが、もぷりんOSでは0と3しか使っていません。LinuxやFreeBSDも基本的に同様です(XenでRing1を使うとかなんとかあるらしいですが)そして、このRing0をカーネルモード、Ring3をユーザモードと言っています。このリングは外側のリング領域全てにアクセス可能です。Ring0なら全てにアクセス可能で、Ring3なら外にはもう無いので、自分自身だけです。カーネルはユーザに干渉できて、ユーザはカーネルに干渉出来ないことなります。この機構はOSの基本的なセキュリティにぴったりですね。言ってみましたが、全くアクセス出来なくてはそれはそれで困ります。上記で既に言ったように、カーネル領域にはハードウェア情報などがあります。アクセス出来ないのではユーザプログラムはハードウェア資源を使えないことになってしまいます。一定の手順を踏むとユーザモードからカーネルモードに切り替わることが出来ます。イメージとしてはリングの内側にジャンプする感じですね。いったカーネルプログラムをユーザプロセスが実行出来るようになるわけです。そのためのインターフェースがシステムコールというやつです。ユーザプログラムはシステムコールを発行し、リング内側のカーネルに使いたい機能を要求して、色々と処理をしていくわけです。このとき、実行中プロセスはユーザプロセスですが、実際に動いているのはカーネルプログラムなので、OSが処理をしているのと変わりません。てきとうですが、大まかにユーザモードとカーネルモードについて説明しました。話を戻しますと、起動時にはカーネルしか無いわけです、ユーザプログラムは一切存在しません。カーネルモードプロセス一個のみです。今やりたいことは、それとは別のユーザプロセスを起動することです。ここで暗に言っていますが、別のプロセスを起動することは、2つのプログラムを並列実行させることです。これは何を隠そうマルチタスク-wikipediaです。一般的に、CPUの計算処理時間に比べ、ディスクやネットワークの処理時間は数十から数百倍かかる。シングルタスク環境では、逐次処理が行われるため、入力待ちや通信待ちなど、CPUが計算を実行できずに、待つ時間が発生する。マルチタスクの導入によって、これらの待ち時間の間にCPUを動作させ別の計算を行い、全体の処理時間の短縮を実現することが可能になる。Wikipediaからの引用です。別の計算を行うということが、つまり別のプロセスに切り替えるということです。この切り替えることをコンテキストスイッチと言います。edx)や現在のスタック(esp)やインストラクションポインタ(eip)などのコンテキストを全て切り替えるためにコンテキストスイッチと言われます。それを実行出来るのはカーネルモードのみです。図にしてみるとわかりやすいかと思います。プロセスがいっぱいあるときも同様です。ぷりんOSにおいて、コンテキストスイッチはタイマー割り込みによって生じます。上記リンクのプリエンプティブ・マルチタスクというやつです。これはタイマー割り込みによって、一定時間が経過すると、次のプロセスに切り替わる処理が実行されます。割り込みの処理をするもの(割り込みハンドラ)は全てカーネルが提供するものです。ゆえに、この時、実行していたプロセスはカーネルモードに切り替わって、コンテキストスイッチを実行します。具体的には10ms秒ごとに割り込まれます。早いように思えますが、CPUの周波数からすればある程度プログラムを実行するには十分です。コンテキストスイッチの流れを以下に図示します。これはかなり重要です。マルチタスクの肝と言ってもいいでしょう。以下の流れで動作します。↓ユーザモードに復帰ここで出てきた、プロセスのカーネルスタックとは、それぞれのプロセスがカーネルモード時に使用するスタックのことです。先程は説明しませんでしたが、カーネルモードに切り替わるときに、スタックもカーネルスタックに切り替わります。ユーザプログラムのコンテキストも退避されます。これはx86の仕様です。上で同じことを言いましたが、雰囲気としてはカーネルに化けるような感じかなと思っています。カーネルスタックはプロセスを生成する過程で設定されます。ここで、この一連の割り込みの流れを、ユーザプログラムの立場から見ると、割り込まれた時、カーネルプログラムに移り、処理再開される時にはきっちり割り込まれた部分から再開するので、割り込まれたことすらわかりません。これによってユーザはマルチタスクのことなど気にせずにプログラミングができるし、我々も普段からしているというわけです。やってみるとわかりますが、当たり前の事のように行われているのに裏では大変なんだなとしみじみ思います。長くなってしまいました、疲れてしまったので今回の記事はここまでとします。思ったより大変な記事になりそう...(2)も数日中に書いて公開します。104日目の記事になります。