Linuxシステムコール:Linuxのシステムコール実装
Linuxのシステムコール実装 これまで述べてきたようにOS(カーネル)の持つ機能へのインターフェイスがシステムコールですが、システムコールの実態はカーネルの中にあります。このため、ユーザープログラムがシステムコールを呼び出すとユーザーモードからカーネルモードへの切り替わりが発生し、カーネル内部での処理完了でユーザーモードに復帰します。 例として、ファイルからデータを読み出す場合を見てみましょう。 ユーザープログラムがファイルを読むため、システムコールを呼び出します。このときCPUのソフトウェア割り込み、またはシステムコール命令が発行されることで、CPUはカーネルモードに移行します。システムコール命令を発行するとき、特定のレジスタに実行したいシステムコールの番号を設定しておきます。CPUはカーネルモードに切り替わるとシステムコール番号からシステムコールテーブルを参照して、カーネル内部の所定の処理を呼び出します。 この例では、ファイル読み込みが呼ばれ、その中で物理的なファイルを読み込み、ユーザー領域のバッファにデータを転送し、ユーザープログラムがシステムコールを呼んだ場所にリターンします。ユーザー空間にリターンすることで、CPUのモードもカーネルモードからユーザーモードに移行します。 システムコールを呼び出すことで、これらの一連の処理が実行されています。 少し余談になりますが、ライブラリもハードウェアとして実態のファイルにアクセスするためにシステムコールを使っています。なぜ同じような目的なのにわざわざライブラリにしているのでしょうか? 目的は2つあります。1つはシステムコールのラッパーとしての役割、もう一つは抽象化したシステムの提供です。 OSがWindowsである場合、ファイル読み込みのシステムコールは ReadFile() ですが、Windows上で動作するc言語のstdioで定義されているファイル読み込みは同じ fread() で、Linux上で動作する fread() と同様の動作をします。 このように、OSが変わっても同様のプログラミングが可能なようにする役割もライブラリは持っています。 また、抽象化とは、今回の例ではファイルの読み込みですが、ファイル読み込みはシステムコールでは read()...