seegongsik
オペレーティングシステム

起動プロセス わかりやすく

電源を切ったばかりのコンピューターは真っ暗です。画面は消え、メモリは空っぽです。けれども私たちは、カーネルがすべてを管理すると学びました。プロセスを立ち上げ、メモリに壁を立て、システムコールを受け付けると。そのカーネルは今どこにいるのでしょうか。電源が切れているので、メモリには何もありません。では、電源ボタンを押すその一瞬に、空っぽのコンピューターはどうやって生きて動くコンピューターに変わるのでしょうか。

01

電源を押すと、空っぽのコンピューターが目を覚ます

電源の切れたコンピューターを思い浮かべてみます。メモリはきれいに空っぽです。あれほど学んだカーネルも、そこから枝を伸ばしていたプロセスたちも、今はメモリに一行もありません。電気が流れていないのだから当然です。
電源ボタンを押すと、だれかが最初の一歩を踏み出さなければなりません。その一歩を踏み出すのはカーネルではなく、マザーボードのチップの中にいつも保存されている、ごく小さなプログラムです。これを始動プログラム、またはファームウェアと呼びます。
ファームウェアは、電源が入ったらいちばん先に目を覚ますよう、最初からその場所に入っています。

メモリ:空っぽ
チップ
電源オフ

電源を入れるボタンを押すと、メモリが空っぽだったコンピューターで、チップの中の小さな始動プログラム(ファームウェア、青)がいちばん先に目を覚まします。カーネルはまだどこにもいません。

目を覚ましたのは小さなファームウェア一つだけで、メモリはまだほとんど空っぽです。ファームウェアは賢くありません。部品がつながっているかを簡単に確かめるほかは、画面を飾ることもアプリを起動することもできません。
ファームウェアが知っているのは、本当の働き手を連れてくる方法だけです。その働き手がカーネルです。ところが、カーネルは今メモリにいません。電源が切れているあいだ、カーネルはディスクの上でファイルとして眠っていたからです。
だから、ファームウェアのすることははっきりしています。ディスクへ行って、カーネルを連れてくることです。

02

ファームウェアがディスクからカーネルをメモリへ載せる

ここで前回の話を思い出してみます。カーネルはいつもメモリに常駐して、すべてを管理すると言いました。けれども、いつも常駐しているというカーネルも、ある瞬間には初めてメモリに載らなければなりません。その瞬間が、まさに今です。
ファームウェアはディスクでカーネルのファイルを見つけ、一かたまりずつメモリへ運びます。実際のコンピューターでは、ファームウェアがまずブートローダーという小さなプログラムを読み込み、ブートローダーがカーネルを載せることが多いです。どちらにしても、空っぽだったメモリに、ついにカーネルが居場所を得ます。
この分野でずっとすべての主役と呼んできたカーネルが、起動のこの場面で初めて舞台に上がるのです。

ファームウェア
ディスク(カーネルのファイルが眠る)
カーネル
カーネル
カーネル
カーネル
メモリ

ボタンを押すたびに、ディスクでファイルとして眠っていたカーネル(金)が一かたまりずつメモリへ上がってきます。四つのかたまりがそろうと、いつも常駐するはずのカーネルが初めて居場所を得ます。

カーネルがすべてメモリに載ると、ファームウェアは静かに仕事を引き渡します。小さな始動プログラムの役目はここまでです。本当の働き手を起こして席に着かせたので、ここからの舞台はカーネルのものです。
目を覚ましたカーネルは、まず何をするのでしょうか。カーネルだけでは、私たちの目に見える仕事は何一つできません。画面のアイコンも、キーボードの入力を受け取るウィンドウも、私たちが開くアプリも、すべて何かのプログラムが動き出して初めて生まれます。
この瞬間から、コンピューター全体を受け持つのはカーネルです。そこでカーネルが真っ先にするのは、最初のプロセスを生むことです。

03

カーネルが最初のプロセスを生み、そこから枝が伸びる

プロセスを扱ったレッスンを思い出してみます。プログラムはディスクで眠るファイルで、それが実行されて生きて動いている状態がプロセスだと話しました。起動のとき、カーネルはまさにそれを初めてやってのけます。
ディスクで眠っていたプログラムを一つ選んで実行し、このコンピューターで生きて動く最初のプロセスにするのです。Linuxでは、この最初のプロセスに1番という番号が付きます。ただし、カーネルがすべてのアプリを一つずつ起動するわけではありません。最初のプロセスが別のプロセスを生み、その子がまた子を生んで、一本の木のように枝を伸ばしていきます。
私たちが使うたくさんのプログラムは、すべてこの最初のプロセスから分かれた枝です。

カーネル

ボタンを一度押すと、カーネル(金)の下に最初のプロセスが生まれ、もう一度押すと、そこから子プロセス(緑)が枝のように伸びていきます。

一度押すと最初のプロセスが生まれ、もう一度押すと、その下に子どもたちがずらりと伸びました。これが、私たちが毎日見ている画面の出発点です。デスクトップを描くプログラムも、時計も、通知も、すべてこの枝のどこかにあるプロセスです。
これらのプロセスはそれぞれ自分のメモリ空間を持ち、何かが必要になるたびにシステムコールでカーネルに頼みます。この分野でばらばらに学んだかけらが、起動という一つの場面の中で、次々と収まるべき場所に収まっていくわけです。
では、そのかけらを一枚の絵に層を重ねて積み上げてみます。

04

層を重ねて完成する(ハードウェアからアプリまで)

全体を一枚の絵で見てみます。いちばん下には、ディスク、メモリ、画面、キーボードといった実際の部品であるハードウェアがあります。その上で小さなファームウェアが目を覚まして最初の一歩を踏み出し、ファームウェアがカーネルを載せます。
カーネルはハードウェアのすぐ上に座り、すべての部品と直接やり取りしながら、メモリに壁を立て、予定を管理します。カーネルの上には最初のプロセスが、その上には私たちが使うアプリが順に積み重なります。
下の層がしっかり支えなければ、上の層は立てません。ハードウェアがなければファームウェアが、ファームウェアがなければカーネルが、カーネルがなければプロセスが、プロセスがなければアプリが立てないのです。このように下の層が上の層を支える組み立てを、よく階層構造と呼びます。

アプリ
最初のプロセス
カーネル
ファームウェア
ハードウェア

ボタンを押すたびに、下から一層ずつ明かりがつきます。ハードウェア、ファームウェア、カーネル、最初のプロセス、アプリの順で、下の層が先に立たなければ上の層は載せられません。

いちばん上のアプリまで明かりがつくと、ようやく私たちの見る画面が完成します。真っ暗だったコンピューターが、今は生きて動いているのです。
おもしろいのは、この塔ができあがると、ファームウェアのした仕事はほとんど忘れられることです。アプリを使いながら、その下にカーネルが、さらにその下にファームウェアとハードウェアが支えていることを、私たちはほとんど意識しません。
けれども、そのすべての層は、起動という一瞬に下から順に積み上げられたものです。コンピューターをつけたときに一瞬映るメーカーのロゴ画面は、まさにファームウェアが働いている時間で、その画面が消えるころにカーネルが仕事を引き継ぎます。

05

電源一つでこのすべてが:分野全体を一枚に

全体を一本の線でつなぐと、こうなります。電源を押すと、チップの中の小さなファームウェアが目を覚まし、ファームウェアがディスクからカーネルをメモリへ載せ、カーネルが最初のプロセスを生み、そこからアプリが枝を伸ばします。
わずか数秒のうちに起きるこの一本の線の中に、この分野で学んだことのほとんどが入っています。ディスクで眠るファイルとメモリ、いつも常駐するカーネル、生きて動くプロセス、プロセスごとのメモリ空間、部品とやり取りするドライバー、だれが何をしてよいかを決める権限、そしてプロセスがカーネルに頼むシステムコールまでです。
起動は、これらのかけらが初めて一か所に、しかも決まった順番で登場する場面なのです。

五つのステップを順に押すと、電源、ファームウェアの目覚め、カーネルの読み込み、最初のプロセス、アプリの積み上げとつながる起動の一周が、一本の線でつながります。

これからは、電源ボタンを押す短い一瞬が、前とは違って見えるはずです。その中では、小さな始動プログラムがカーネルを起こし、カーネルが最初のプロセスを生み、その上にアプリが一層ずつ上がっていく大がかりな組み立てが進んでいるのですから。
この分野は、画面の裏にいる見えない世話役が何をしているのかを問うところから始まりました。起動は、その世話役が朝起きて、家の切り盛りを一から順に整える場面です。真っ暗な機械が私たちを迎える準備を終える、毎日静かに繰り返される一瞬なのです。

一言でいうと電源を押すと、チップの中にいつも入っている小さな始動プログラム(ファームウェア)がまず目を覚まします。ファームウェアはディスクでカーネルを見つけてメモリへ載せ、いつも常駐するはずのカーネルは、このとき初めてメモリに居場所を得ます。目を覚ましたカーネルは最初のプロセスを生み、そこから別のプロセスが枝のように伸び、その上に私たちが使うアプリが順に上がってきます。起動とは、ハードウェアからファームウェア、カーネル、プロセス、アプリまでを一層ずつ積み上げることで、電源一つで、この分野で学んだカーネルとプロセスとメモリがすべて順番に舞台に上がります。
← オペレーティングシステム
このページがお役に立ったなら支援する