起動:電源を一度押すと、学んだすべてが舞台に上がる瞬間
さっき切ったコンピューターは真っ暗です。画面も消えていて、メモリは空っぽです。でも、私たちはずっと、カーネルがすべてを管理すると学んできましたよね。プロセスを立ち上げ、メモリに壁を立て、システムコールを受けつける、と。そのカーネルは今どこにいるのでしょう。電源が切れているので、メモリには何もありません。では、電源ボタンを押すその一瞬で、空っぽのコンピューターは、どうやって生きて動くコンピューターに変わるのでしょう。
電源を押すと:空っぽのコンピューターが目を覚ます
電源の切れたコンピューターを思い浮かべてください。メモリはきれいに空っぽです。あれほど学んだカーネルも、そこから枝を伸ばしていたプロセスたちも、今はメモリに一行もありません。電気が流れていないので当然です。でも電源ボタンを押すと、不思議なことが始まります。だれかが最初の一歩を踏み出さなければなりませんよね。その一歩を踏み出すのは、はなやかなカーネルではなく、チップの中にいつも刻まれている、とても小さなプログラムです。これを始動プログラム、またはファームウェアと呼びます。ファームウェアは、電源が入るといちばん先に目を覚ますよう、最初からその場所に埋めこまれています。
電源を押してみましょう。メモリは空っぽのままですが、チップの中の小さな始動プログラム(ファームウェア、青)がいちばん先に目を覚まします。カーネルはまだどこにもいません。
目を覚ましたのは、小さなファームウェア一つだけです。メモリは相変わらずほとんど空っぽです。ファームウェアは賢くありません。画面を見ばえよく飾ったり、アプリを立ち上げたりするすべも知りません。ファームウェアが知っているのはただ一つ、本物の働き手を連れてくる方法です。その本物の働き手こそがカーネルです。でもカーネルは今、メモリにいません。電源が切れていたあいだ、カーネルはディスクにファイルとして眠っていたからです。ならばファームウェアのすべきことは明らかです。ディスクへ行って、そのカーネルを連れてくることです。次でその場面を見ましょう。
ファームウェアがディスクからカーネルをメモリへ載せる
ここで、前の講での約束を一つ思い出してみましょう。カーネルはいつもメモリに常駐して、すべてを管理する、と言いました。でもよく考えると、いつも常駐するというカーネルも、ある瞬間には初めてメモリに上がらなければなりませんよね。その瞬間こそ、いまです。ファームウェアはディスクからカーネルのファイルを見つけ、ひとかたまりずつメモリへ運んできます。空っぽだったメモリに、ついにカーネルが座を占めるのです。私たちがarea じゅう、すべての出来事の主役と呼んできたあのカーネルが、起動のこの一場面で、ようやく初めて舞台に登場するのです。
ファームウェアを押してみましょう。ディスクにファイルとして眠っていたカーネル(金)が、ひとかたまりずつメモリへ上がってきます。いつも常駐すると言っていたカーネルが、まさに今、初めて座を占めます。
カーネルがメモリにすべて上がると、ファームウェアは静かに任務を引き渡します。小さな始動プログラムの役割は、ちょうどここまでです。本物の働き手を起こして座らせたので、もう舞台はカーネルのものです。目覚めたカーネルは、まず何をするのでしょう。カーネル一人では、私たちに見える仕事を一つもできません。画面のアイコンも、キーボードの入力も、私たちが開くアプリも、すべて、だれかが実行されて初めて生じることだからです。だからカーネルがいちばん最初にするのは、最初のプロセスを生むことです。次で見ましょう。
カーネルが最初のプロセスを生み、そこから枝が伸びる
プロセスを扱った講を思い出してみましょう。プログラムはディスクに眠るファイルで、それが実行されて生きて動く状態がプロセスだ、と言いました。起動でカーネルは、まさにそれを、いちばん最初にやってのけます。ディスクに眠っていたあるプログラムを一つ選んで実行し、このコンピューターで生きて動く最初のプロセスにするのです。でもカーネルは、すべてのアプリを自分で一つずつ立ち上げたりはしません。代わりに、この最初のプロセスがまた別のプロセスを生み、その子がまた子を生んで、まるで一本の木のように枝を伸ばしていきます。私たちが使う数々のプログラムは、みなこの最初のプロセスから分かれて出た枝なのです。
カーネルを押して最初のプロセスを生んでみましょう。もう一度押すと、その子プロセスたちが枝のように伸びてきます。カーネル(金)から最初のプロセスへ、最初のプロセスから複数へ(緑)。
一度の押下で最初のプロセスが生まれ、もう一度でその下に子たちがずらりと伸びていきました。これが、私たちが毎日見るあの画面の出発点です。デスクトップを描くプログラムも、時計も、通知も、すべてこの枝のどこかにあるプロセスです。そしてこれらのプロセスは、それぞれ自分のメモリ空間を持ち、何かが必要になるたびにカーネルへシステムコールでお願いします。area で別々に学んだ断片が、起動という一場面の中で、つぎつぎと所定の位置に収まっていくのです。さあ、その断片を一枚の絵に、一層ずつ積み上げてみましょう。
層を重ねて完成する(ハードウェアからアプリまで)
では全体を一枚の絵で見ましょう。いちばん下にはハードウェアがあります。ディスク、メモリ、画面、キーボードといった実際の部品です。その上に小さなファームウェアが目を覚まして最初の一歩を踏み出し、そのファームウェアがカーネルを載せます。カーネルはハードウェアのすぐ上に座り、すべての部品と直接話しながら、メモリに壁を立て、スケジュールを管理します。カーネルの上には最初のプロセスが、その上に私たちが使うアプリが順に積み重なります。下の層がしっかり支えてこそ、上の層が立てます。ハードウェアなしにファームウェアは、ファームウェアなしにカーネルは、カーネルなしにプロセスは、プロセスなしにアプリは立てないからです。
下から一層ずつ押して点灯してみましょう。ハードウェア、ファームウェア、カーネル、最初のプロセス、アプリの順に積み上がります。下の層が先に立たないと、上の層は載せられません。
いちばん上のアプリまで灯がともると、ようやく私たちが見るあの画面が完成します。真っ暗だったコンピューターが、いまや生きて動くのです。おもしろいのは、この塔ができあがると、ファームウェアのした仕事がほとんど忘れられることです。私たちはアプリを使いながら、その下にカーネルが、さらにその下にファームウェアとハードウェアが支えていることを、ほとんど意識しませんよね。でもそのすべての層は、起動という一瞬に、下からきちんと積み上げられたのです。さあ最後に、電源を一度押すだけで、このすべてがどう一本の線につながるのか、はじめから終わりまでたどってみましょう。
電源を一度押すだけで、このすべてが:area を一枚に
全体を一本の線でつなぐと、こうです。電源を押す、チップの中の小さなファームウェアが目を覚ます、ファームウェアがディスクからカーネルをメモリへ載せる、カーネルが最初のプロセスを生み、そこからアプリが枝を伸ばす。わずか数秒のあいだに起こるこの一本の線の中に、私たちが area で学んだほとんどすべてが入っています。ディスクに眠るファイルとメモリ、いつも常駐するカーネル、生きて動くプロセス、プロセスごとのメモリ空間、部品と話すドライバー、だれが何をしてよいかを決める権限、そしてプロセスがカーネルにお願いするシステムコールまで。起動とは、これらすべての断片が初めて一か所に、しかも決まった順番で登場する場面なのです。
各ステップを順に押して、起動の一周をたどってみましょう。電源、ファームウェアの目覚め、カーネルの読み込み、最初のプロセス、アプリのスタックまで。area で学んだ断片が一本の線につながります。
これで、電源ボタンを押すあの短い瞬間が、以前とはちがって見えるはずです。その中では、小さな始動プログラムがカーネルを起こし、カーネルが最初のプロセスを生み、その上に私たちのアプリが一層ずつ立ち上がる、大きな組み立てが起こっているのですから。OSがどんな働きをする家計のやりくり役なのか、と問いながら、この area を始めましたね。起動とは、そのやりくり役が朝に起きて、家のことを最初から一つずつ整える、まさにその場面です。真っ暗な機械が、私たちを迎える支度を終える、毎日静かにくり返されるあの一瞬です。