0から作るソフトウェア開発

日々勉強中。。。

0から作るOS開発

環境準備

環境設定

ブートローダ

カーネルローダ

GRUB

カーネル

ドライバーその他

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 2のブート処理

パソコンの電源を入れた時にBIOSはHDDなどのディスクのMBR(最初のセクター:512バイト)から

ブートローダーを読み込み、ブートローダーの処理を開始します。GRUBも最初は512バイトしか

読み込まれませんので、このサイトでブートローダーとカーネルローダーの例を載せているような

具合に2段階構成となっています。このサイトのブートローダーにあたるのがboot.imgで、

boot.imgの処理でカーネルをロードするcore.imgをロードします。core.imgでは、

実行に必要なモジュールのロードとカーネルのロードを行います。



  1. boot.imgの処理

  2. ディスクのMBRまたはGRUBをチェインロードするときはPBR(VBR:仮想ブートセクター)に
    格納されています。BIOSがまずMBR(ディスクの最初のセクター)から512バイトの
    boot.imgを物理アドレス0x7C00に読み込みboot.imgの処理を開始します。
    boot.imgではデフォルトでは次のセクター(フロッピーディスクの場合。CDなどは
    1セクターの読み込みで2024バイト読み込みできるため、boot.imgが終わる
    次のバイトから2024バイトはメモリーにあります。)以降に格納されているcore.imgを
    メモリーに読み込み、core.imgの処理を開始します。

  3. core.imgの処理

  4. 通常boot.imgの次のセクター(または次のバイトから)に格納されています。
    core.imgでは、実行時に必要に応じてファイルシステムのモジュールをロード
    し、ディスクのファイルシステムに格納されているカーネルをメモリーにロードしてから
    カーネルの処理を起動します。また、モジュールでGRUBのメニューや設定ファイル
    (通常grug.cfg)の読み込みを行いカーネルを起動します。

Grub2でカーネルの起動

ここまでで、GRUBの概要が分かりました。(ここまでであまり詳細が把握できていなくても

問題ありません)。次回はGRUBを実際にインストールして自作OSを起動してみます。

inserted by FC2 system