|
0から作るOS開発 GRUBその1 ブートローダーとGRUB
|
ここでは、Grub(Grand Unified Bootloader)について見ていきます。
Grubは様々なOS(Windows、Linuxなど)をブートするブートローダーとなります。
Grubを使用することで、自分で作った自作OSをフロッピー、CD、USBなどから
ブートすることができるようになります!!!
それでは、順番に見ていきます。
ブートローダー
初期のコンピューター
1940年代〜1950年代の初期のコンピューターでは、人の手で1週間ぐらいかけて
コンピューターに入力していました。初期型のENIACではコンピューターの配線を
変えてプログラムを入力していて、まだブートローダーというものはありませんでした。
(強いて言えば”人間”がブートローダーとなります。)
1960年になると弾道ミサイル早期警戒システム(BMEWS:Ballistic Missile
Early Warning Syste)では、1つのプログラムが実行できました。ただ、容量が
少なくプログラム自身を少しずつ部分的にロードして実行していました。
初期の商用コンピューター
初期の商用コンピューターである、UNIVAC IやIBM 701では、"Load"ボタンを押すと
パンチカードなどのメディアからブートローダーをロードするハードウェアが開発されました。
1950年代になると、IBMではブート処理のことををIPL(Initial Program Load)と
呼ぶようになり、現在でもIPLという言葉が使われています。
IBM 701では、"Load"ボタンを押すとブートローダーをメモリーに読み込み、読み込まれた
ブートローダーは実行を開始します。そして、人が入力するのではなく自動的に、大きな
プログラムをメモリーに読み込み、そのプログラムの実行を開始します。”ブート”という言葉
は少なくとも1958年から使用されているようです。(”ブート”という言葉自体はブーツを
持ち上げるために付いているブーツのブーツストラップからきています。人ではなく、
”ブーツが自分自身でブートストラップを持ち上げる”イメージからきていて、プログラムが
プログラム自体をメモリーにロードすることを”ブートストラップ”と呼ぶようになりました。
最初は”ブートストラップ”でしたが、次第に省略されて”ブート”になったようです。)
IBM System/360と後継機
IBM System/360とその後継機(現在のメインフレームで言えばz/Architecture)では、
ブートローダーが行う処理のことをIPLと読んでいます。IBM System/360以降のシステムでは
オペレーターはIPLが格納されているデバイスを指定するコマンドを打ち込み、が指定した
デバイスからIPLを読み込みできるようになりました。
ROMを使用したコンピューター
ROM(読み込み専用メモリー)がコンピューターに導入されてから、従来のブート処理が
変わってきました。ROMに格納されているファームウェアがブート処理を行うようになりました。
(現在のBIOSも同様にROMに格納されているファームウェアとなります)。1976年に
アップルが開発したApple 1では、PROMに格納されているファームウェアでブートローダーを
ロードするようになり、”Load”ボタンをが無いコンピューターを作りました。これにより、
オペレーターが操作することなくブートローダーをロードするコンピューターが出てきます。
一方IBMのパソコンでは、BIOSをROMに格納し、ブートデバイスからプログラムをロードし、
実行するように設計されるようになりました。
現在のパソコン
現在のパソコンでは、昔のパソコンとの互換性のためにBIOSがブートデバイスから
512バイトのブートローダーをメモリーにロードし、ブートローダーを実行します。
現在ののパソコンでは、512バイトのブートローダーでは、OSを起動する処理を
プログラムするには小さすぎるため、OSをロードするプログラムをロードします。
また、OSをロードするためには、ブートデバイスを制御するドライバーや、デバイスの
どこにカーネルがあるのかを記録しているファイルシステムを調べ、カーネルをロードする
プログラムが必要となります。OSをロードするプログラムをこのサイトではカーネルローダー
と記載しています。このように、OSを起動するには、2段階以上のローダーが必要と
なります。ブートローダーは、OSをロードするプログラムをメモリーにロードして、カーネルを
起動するプログラムとなります。ブートローダー自身もパソコンの電源を入れた時に
BIOSがメモリーにロードし、ブートローダーの処理を起動します。BIOS自身は電源を
入れた時のリセット処理でBIOSのファームウェアの処理が呼び出されます。
GRUB
GRUB
とは、沢山あるブートローダーの1つで、ブートローダーとカーネルローダーの機能を
あわせ持ったブートローダーで、Grand Unified Bootloaderの略となります。
これまでのブートローダーは専用のOSのみしか起動できませんでしたが、
(例えばNTLDRはWindowsを、LILOはほぼLinuxだけを起動していました)。
GRUBは
マルチブート仕様
をベースに作られていますので、様々なOSを
起動することができます。
現在ではGNUのプロジェクトで開発されていて、
Linuxの各ディストリビューションで
ブートローダーとして採用されています。
GRUBの簡単な歴史
GRUBは当初エーリッヒ・シュテファン・ブーリンという方が
FSF(フリーソフトウェア財団)
で開発しているGNU Hurdを起動させるためのものでした。
1999年にゴードン・マッツィヒカイトという方と奥地秀則という方がGNUプロジェクト
の公式ソフトウェアとして公開しました。
GRUBの特徴
GRUBは起動時に設定ファイル(デフォルトではgrub.cfg)を読み込み、また
カーネルやinitrd(初期RAMディスク)を選んで起動することができ、コマンドライン
を入力することもできます。
ファイルシステムと様々なデバイス
GRUBはUnixで主に使用されているファイルシステムからWindowsのVFATやNTFS
など様々なファイルシステムに対応しています。また、OSが格納されている色々なメディア
(HDD、CDなど)からOSをロードすることができます。
インターフェース
設定を行うことで、起動時のブートメニューの背景画像を表示させたりといった設定が
できます。
ネットワークからの起動
ネットワークからOSをダウンロードして、起動することができますので、ディスクレスシステム
も可能となります。
マルチブート
マルチブート仕様に対応しているOSを選んで起動することができます。また、
マルチブート仕様に対応していないOSでも、そのOSのブートローダーを
ロードすることで(チェインロード)、ブートすることができます。
GRUBのブート処理
GRUBには公式的に2つのバージョンがあります。
-
GRUBバージョン1
GRUBレガシー(GRUB Legacy)と呼ばれています。現在GNUはGRUBレガシーの
開発を中止していて、grubバージョン0.9*がGRUBレガシーにあたります。
現在ではGRUB 2にプロジェクトが移行しています。
-
GRUBバージョン2
GNUプロジェクトではGRUB 2と記載されています。GRUB 2はGRUBレガシーから
より小さいサイズ、実行時のモジュール動的読み込み、メモリー管理の拡張、
国際化対応、違うプラっとフォームへのインストール対応、その他の役に立つ
パッケージの追加、などを行うために全面的に書き換えを行ったものです。
GRUB 2は当初PUPAプロジェクト
から始まりました。PUPAは
IPAの
「未踏ソフトウェア創造事業」の「次世代GRUBブートローダの基本設計と実装」
という案件として採択されました。その後、2002年ごろに現在のGRUB 2の開発に
統合され、正式にリリースされたのが2012年2月となります。
このサイトではGRUB 2を対象としています。これ移行でGRUBと表記している
箇所はGRUB=GRUB 2の意味となります。
GRUB 2のブート処理
パソコンの電源を入れた時にBIOSはHDDなどのディスクのMBR(最初のセクター:512バイト)から
ブートローダーを読み込み、ブートローダーの処理を開始します。GRUBも最初は512バイトしか
読み込まれませんので、このサイトでブートローダーとカーネルローダーの例を載せているような
具合に2段階構成となっています。このサイトのブートローダーにあたるのがboot.imgで、
boot.imgの処理でカーネルをロードするcore.imgをロードします。core.imgでは、
実行に必要なモジュールのロードとカーネルのロードを行います。
-
boot.imgの処理
ディスクのMBRまたはGRUBをチェインロードするときはPBR(VBR:仮想ブートセクター)に
格納されています。BIOSがまずMBR(ディスクの最初のセクター)から512バイトの
boot.imgを物理アドレス0x7C00に読み込みboot.imgの処理を開始します。
boot.imgではデフォルトでは次のセクター(フロッピーディスクの場合。CDなどは
1セクターの読み込みで2024バイト読み込みできるため、boot.imgが終わる
次のバイトから2024バイトはメモリーにあります。)以降に格納されているcore.imgを
メモリーに読み込み、core.imgの処理を開始します。
-
core.imgの処理
通常boot.imgの次のセクター(または次のバイトから)に格納されています。
core.imgでは、実行時に必要に応じてファイルシステムのモジュールをロード
し、ディスクのファイルシステムに格納されているカーネルをメモリーにロードしてから
カーネルの処理を起動します。また、モジュールでGRUBのメニューや設定ファイル
(通常grug.cfg)の読み込みを行いカーネルを起動します。
ここまでで、GRUBの概要が分かりました。(ここまでであまり詳細が把握できていなくても
問題ありません)。次回はGRUBを実際にインストールして自作OSを起動してみます。