• ベストアンサー

Linuxカーネルは誰が動かしているのでしょうか。

Linuxカーネルは、ほとんどC言語で書かれているということですが、そのプログラムは誰が(どういった仕組み)で動かしているのでしょうか。 自分で作ったプログラムならOSの上で動くのは、なんとなくイメージできるのですが…。 どなたか、初心者にも分かる言葉で教えて頂けないでしょうか。宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • tonasuke
  • ベストアンサー率46% (7/15)
回答No.2

(以下の説明では、初心者の方にわかりやすいように、あえて単純な表現を使ったり、技術的な詳細を省略したりしていますので、ご了承ください。) PCの電源が入ると、BIOS が GRUB や LILO などをロードし、続いて、これらのカーネルローダーが Linux カーネルをメモリにロードします。 その後、カーネルはメモリ上に存在し、Linux を終了するまでずっと動き続けます。 したがって、「誰かが動かしている」のではなく「自分で動いている」という表現のほうがわかりやすいと思います。 カーネルは確かにC言語で書かれてはいますが、普通のプログラム(アプリケーションプログラムまたはユーザプログラム)とは違います。 普通のプログラムはカーネルがメモリ上にロードして実行することになりますが、カーネルの場合はカーネルローダーがメモリ上にロードして実行するわけです。 では、動き続けているカーネルが何をしているのかというと、基本的には何かの事象が発生するのを待っているのです。 「何かの事象」とは、具体的には、ハードウエア割り込みやシステムコールなどですが、カーネルが自分自身の実行のために待っている事象と、アプリケーションプログラムにサービスを行うために待っている事象とがあります。 アプリケーションプログラムと直接関係があるのはシステムコールです。 例えば、あなたが作成したプログラム(以下、ユーザプログラム)が printf() ライブラリ関数を使ったとしましょう。printf() は、最終的には write() システムコールを呼び出します。 write() を呼び出すまではユーザプログラムの実行(ユーザプログラムが実行されている)ですが、ユーザプログラムが write() を呼び出したら、そのときがカーネルの出番です。 カーネルはユーザプログラムを中断させ、ユーザプログラムがリクエストしたwrite() システムコールの処理を(ユーザプログラムにかわって)実行します。このときはカーネルが動いているのです。 write() の実行が完了すると、カーネルは実行結果をユーザプログラムに返し、ユーザプログラムを再開します。 ユーザプログラムは write() の続き(write() の次の処理)を実行するというわけです。 まとめると、カーネルはPCの起動時にロード、実行開始され、その後はずっと動いている。カーネルは、必要なときにはいつでも実行できる状態で待機しており、何らかの事象が発生すると対応処理を実行する。ということです。

その他の回答 (1)

  • Lean
  • ベストアンサー率72% (435/603)
回答No.1

(Windowsを念頭にしての解説ですが)基本的なPCの起動の流れは参考URLにあるページでも参考にしてください。 最終的には、MBRもしくはブートセクタにインストールされたブートローダ(LILO/GRUB等)によってカーネルは起動されます。

参考URL:
http://homepage2.nifty.com/winfaq/howtoboot.html

関連するQ&A