OSの中と外


オペレーティングシステムの中では、常にタスクが待機しています。
コンピュータのCPUは割り込みを受け取ると、割り込みベクトルテーブルで定義された関数を起動します。その処理結果は、常駐して待機しているOS内のタスクで処理されます。OSの処理は、この割り込み処理と、ポーリングを行っているタスクの両方から、通常の関数コールで辿ることができますが、この関数コールは、全てOS内部の関数である必要があります。OSの外のライブラリや、シェルのコマンドの機能は実行できません。

overview4

シェルのコマンドやOSの外部の関数が別の割り込みを発行し、この結果割り込み処理プログラムの中で別の割り込みを作成する、という現象が起きて、割り込み処理の中から抜け出せなくなる場合がある他、再帰的に自分自身を呼び出して、スタックがあふれてシステムがダウンします。

OSの中は、極めて時間的な制約の高いプログラム群が集まっています。従って、OSの内部で機能を実現する場合には、OSの外に出ることなく(つまり、/usr/libや/usr/binのライブラリ、コマンドなどを使わずに、)OS内部の関数をコールする、という形で機能を実現しなければなりません。

「OSの外でだったら、どうやったらいいかわかるのだけど・・・」という機能をOSの中で実現しようと思うなら、OSの外のコマンドや関数が、最終的にOSの中のどの部分でどう処理されているかを参照し、そのOSの中での処理方法を真似るというアプローチで工夫することができます。