先達たちに、「どこからUnixをHackすれば良いのでしょうか?」と聞いた場合、「最初はlocoreからやん」と言う言葉が良く返ってくる。 自分も、その言葉に従ってlocore.sを見ていましたが、その途中いくつか疑問がわいてきました。それは、次のような疑問でした。
- locoreが走っている時点で、スタックに引数が格納されているが、引数は誰がセットしているのか?
- このスタックは誰が生成しているのか?
- そもそも、このプログラムは誰がロードしているのか?
これらの事柄は、「もっと前のレベルでlocoreのプログラムをロードするための処理が動いていると言うことに他ならない。」と思い、ネット上で検索すると、PCは電源立上げ時にBootstrapと呼ばれるプログラムをロードして走らせ、この処理がOSを立上げるための処理を起動するらしいと言うことがボンヤリと理解できました。
この辺の処理は、PCを長いこと使っているが良く理解できていなくて、「MBRって言う所を書き換えるとマルチブートが出来るんだよね」のレベルだったので、もっと理解を深めるために調べてみました。
ここまでは、一般的なbootの流れを説明しましたが、簡単にOpenBSDのbootの流れを説明したいと思います。まず、OpenBSDをIDE HDDの領域を全てを使い下図のようにインストールしたとします。
OpenBSDの起動の流れ
このOpenBSDがインストールされたPCの電源をONにすると、
- BIOSはHDD内にあるMBR領域をメモリに読込み、Master Bootstrap Loderを実行する。
読込まれるMBRはインストール時に/usr/mdec/mbrの内容と同じものがHDDのMBR領域に書込まれる。
- 次にMBRは、起動可能なHDDの領域にあるPBRを読込み、PBR内のBootstrap Loaderが実行される。
PBRの領域には、/usr/mdec/biosbootがインストール時にinstallbootによって書込まれる。
- biosbootは"/boot"を読込み、boot処理に移行させる。
bootプログラムは、CPU/HWの初期化などの処理を行う。
- bootプログラムが初期化を終了して、kernelが実行出来る状態になったら、kernelを読込み処理をkernl側に移行させる。
kernelが読込まれ処理が開始されるとき、最初に動くのが"locore.S"なのだ。と言うことは「hackはlocoreから」と言う格言はあながち間違いでは無いですが、bootの仕組みをわかっていないと、私みたいに「???」と言うことになってしまうかもしれない。