ブートの仕組み

2001/07/28
目次
  1. 序説
  2. 語源
  3. 電源ON
  4. 周辺機器の初期化
  5. 起動ドライブのサーチ
  6. 起動ドライブディスクの先頭セクターのロード
  7. 先頭セクターにある起動プログラムの実行
  8. マスターブートレコード(MBR)
  9. ブートセクター
  10. ブートセクターの役割とこれを作る人
  11. ブートシーケンス図
  12. まとめ

序説

 みなさんはPCの電源を入れ、PCが起動されると、ハードディスクやその他のディスクのいろいろなファイルやフォルダ、ディレクトリなどに当たり前のようにアクセスしていると思う。しかし、このファイルやディレクトリといった仕組みは、PCというハードウェアが提供しているものではない。これはファイルシステムと呼ばれるOSの重要な機能の一部によって実現している。従ってOSが起動しないとファイルやディレクトリにはアクセスできない。OSが起動する仕組みはそのOSによって様々だが、ここではまだファイルといった概念のない、OSが起動する直前まで段階と、主なOSの起動の極初期の段階、ブートシーケンスについて説明しよう。

 


語源

 内容の説明に入る前に、一応の「ブート(boot)」という言葉の語源を説明しておく。現在では「Booting」とか「Bootable」などの単語があるように、立派な「コンピュータを起動する」という動詞である。一応最近の英和辞典ならこの意味も記載されているものもあるが、所謂「ブーツ(長靴)」のことだ。

 由来としては、pull oneself up by one's own bootstraps」(自力で進む、自力で這い上がる)というイディオムにある。このイディオムはある古典の一説から出ていると言われている。直訳すると「自分のブートストラップ(ブーツを履くときに持ち上げるためのつまみ革)を掴んで、自分自身を引っ張りあげる」という、物理的に矛盾した荒唐無稽な話だが、これが上記のような「自力で進む」という意味のイディオムになったわけだ。今はBootstrapという単語だけでも、この意味を含むものとなっているようである。

 しかし、この荒唐無稽な話も、コンピュータの起動プロセスに当てはめると、大変しっくりくるいう。いかにも自分で自分を引っ張りあげるという表現が、ピッタリくるような動きをしている。そこで誰かがコンピュータの起動プロセスを「bootstrap」と名づけたようだ。現在でも、正確には「コンピュータ起動プロセス」のことを「ブートストラップ」と呼ぶ。

 しかし一般的には、更にそれが縮んで「boot」だけでそのような意味として使われることが多くなり、こちらはやがて動詞としても使われるようになったようである。

 


電源ON

 さて、本題に入ろう。まずPCの電源を入れると、マザーボード上にあるBIOS ROM内に格納されている初期化プログラムが呼び出され実行される。

 


周辺機器の初期化

 このプロセスを通常POST(Power On Self Test)と呼ぶ。初期化プログラムは、まずビデオカードを初期化を行う。これは初期化の経過をディスプレイに表示する必要があるため、一番最初に行われる訳だ。その後メモリチェックや、基本的なデバイスの初期化を進める。ビデオ以外の順序も、ある程度決まっているとは思うが、BIOSプログラムやM/Bなどによっても多少違うだろうし、ここではあまり重要なことではないので、特に説明はしない。

 


起動ドライブのサーチ

 次にBIOSプログラムが行うのは起動ドライブを探すことである。ドライブには、フロッピーディスクドライブ(FDD)、ハードディスクドライブ(HDD)、CD-ROMドライブ、その他リムーバブルディスクドライブなどあるが、ここでは最も一般的なフロッピーディスクドライブハードディスクドライブの場合を説明しよう。

 現在のPCの場合、必ずフロッピーディスクドライブとハードディスクドライブがあり、ハードディスクドライブなどは複数ある場合もある。そこでどこを起動ドライブとするのかという設定が必要になる。BIOSの設定で『Boot Sequence』という項目を見たことがある人が多いと思うが、この項目を設定することによって起動ドライブを指定することができる。大抵デフォルトでは『A then C』などとなっており、フロッピー(A)が最初で、次にハードディスク(C)という設定になっていると思う。ハードディスクが複数ある場合はちょっと複雑である。

  • IDESCSIより先 ※1
  • IDEでは、プライマリチャネルセカンダリチャネルより先 ※2
  • IDEの同じチャネルでは、マスタースレーブより先 ※2
  • SCSIではSCSI IDが若い方が先 ※3
  • SCSIカードが複数ある場合は挿入スロット番号の若い方が先 ※4
 UltraATA66/100/133のインターフェースカードなどは、BIOSから見た場合、SCSIと同じように扱われる。

 


起動ドライブディスクの先頭セクターのロード

 さてとりあえず起動ドライブは決まったとしよう。次にBIOSプログラムが行うのは、起動ドライブディスクの先頭セクターのロードという作業だ。まだこの段階ではOSは何も実行されていないので、OSに依存したところのファイルシステムというものは一切存在しておらず、ファイルという概念を用いてハードディスク上のデータにアクセスすることは、全くできない。この状態でディスクにアクセスするには、BIOS ROM内部に16ビットコードで書かれているPC/ATの基本入出力サブルーチンのうち、ソフトウェア割り込みINT13Hで呼び出せるディスクBIOSによって行う他ない。これはある意味ハードディスクを生で読む訳だが、この詳細はこちらを参照してほしい。

 さてBIOSプログラムは、上記INT13Hのアクセス方法に従って、ディスクドライブの先頭セクターをロードする(メモリに読み込む)。

 


先頭セクターにある起動プログラムの実行

 先頭セクターをロードすると、BIOSプログラムはそこに書かれたあるプログラム(起動プログラム)に制御を移す。この先頭セクターの構造が、フロッピーディスクとハードディスクではかなり違うので、その後の動きが多少違ってくる。この先頭セクターをハードディスクではマスターブートレコード(Master Boot Record)と一般に呼び、フロッピーディスクの方はブートセクターと呼ぶ。マスターブートレコードの方は、基本的にPC/AT互換機で一般的な構造が決まっているが、ブートセクターの方はOS固有の構造になっている。もっともハードディスクの場合もマスターブートレコードを読み込んだ後で、やがてブートセクターを読み込むことになる。つまりハードディスクはフロッピーに比べマスターブートレコードという回り道をするということだ。これは後述するようにハードディスクにはパーティションというものがあるからである。

 まずはマスターブートレコードから見てみよう。

 


マスターブートレコード(MBR)

 マスターブートレコード(MBR)は、ハードディスクの先頭セクターだ。PC/AT互換機ではセクターは512バイトなので、マスターブートレコードも当然512バイトで、以下のような構造になっている。

[マスターブートレコードの構造]
マスターブートレコート

 オフセット的に前後するが、まず0446から始まる64bytesのパーティションテーブル(Partition Table)についてだが、ここはハードディスクのパーティション(区画、領域)に関する情報を格納しているところだ。1エントリ16bytesの4つのエントリがある。1エントリの16Bytesのデータにはそのパーティションの位置情報、種類(基本領域か拡張領域かの別など)、起動可能かどうかの情報(起動フラグ)などが格納されている。

 ブートシーケンスを理解するにはパーティションテーブルについてはこの程度でもいいのだが、もう少し詳しいパーティションの内容については、こちら『パーティションとその切り方』を参照してほしい。

 最後のブートシグニチャは必ずマジックナンバーと呼ばれる0xAA55という値が入っている。この値が入っていないとマスターブートレコード自体が無効なものとして扱われ、BIOSによって後述するブートストラップローダが実行されないし、パーティションテーブルも読み込まれない。つまりこのマスターブートレコードが正当なものであることを保証する署名(シグニチャ)である。

 さて、前に戻って、先頭から446バイトのプログラム領域だが、これがBIOSプログラムによって次に実行されることになる。こちらには元々IBMMicrosoftによって作成された次のような動作を行う起動プログラムがかかれている。

  1. パーティションテーブルの検査
    4つのテーブルエントリーを先頭から順に検査し、起動可能な(起動フラグの立った)基本領域がないか探す。
  2. 見つかったら、その領域の先頭位置をテーブルから取得する。
  3. BIOSにその位置を示して、当該先頭セクターをメモリーにロードしてもらう。
  4. ロードした先頭セクターに制御を移す。

 この起動プログラムを通常(マスター)ブートストラップローダと呼ぶ。マスターブートローダとかマスターブートコード(マスター)イニシャル・プログラム・ローダなどと呼ばれることもある。またこのプログラムだけをマスターブートレコードと呼ぶ人もいる。「ブートストラップローダ」という呼び名は全く権威ある一般的な呼び名ではない。実はこのプログラムにはIBMが最初に作った時から、正式な名称なんて無いのだ。イニシャル・プログラム・ローダという呼び名もかなり一般的だ。しかしこれは後で出てくるブートセクター内のプログラムにも一般的に使われる。またブートストラップスローダは、MBRを読むBIOS側のプログラムを指すときにも使用されるので、用語的には大変混乱している。

 しかし、何らかの呼び方で統一しないと、ここでは不便なので、便宜上ブートストラップローダと呼ばせてもらう。

 用語的な話をすると、「マスターブートレコード」という用語も、前述のように起動プログラムのことを指して呼ぶ人もいる。つまり先頭セクター全体ではなくて、パーティションテーブル以降を含まない部分を指す。これはたぶん、このプログラムを書くコマンドが「FDISK /MBR」というコマンドオプションなので、これを根拠にしているのだろう。中には、起動に使われない第2ハードディスク以降の先頭セクターは「ブート」しないのだから、マスターブートレコードではないという人までいる。

 しかし、もはや「マスターブートレコード」をハードディスクの先頭セクター全体を指すのは、ほぼ一般的であると言えるので、私はこの説に従う。

 ブートストラップローダによってロードされる『起動可能な基本領域の先頭セクター』こそが先に説明したブートセクターである。

 このブートストラップローダは上記のような動作をするため、たとえば4つのエントリーの中に基本領域がなかったり、あっても起動可能でなかったりした場合、実行に失敗し、そこでブートシーケンスは停止してしまう。よくある停止要因としては基本領域が起動可能(アクティブ)になっていないことだ。

 因みに、これが非常に誤解の多いのことなのだが、パーティションテーブルはもとよりマスターブートレコードの構造全体やブートストラップローダの内容も含めて、これらは全てPC/AT互換機の一般仕様であり、別の言い方をすれば、IBMとMicrosoftのオリジナル仕様で、基本的にOSに依存しないものであるということだ(ただしこれはちょっと注意が必要だ。詳細は後述する)。従ってMS-DOSでもWindows95/98でも、WindowsNT/2000、Linuxなどでも基本的には同じものである。(もっともOSによっては微妙に違う。例えばWindows98では、バックアップブートセクターを読む機能などが追加されていたりはするが、前述の動作は概ね同じである)

 ただし、LinuxのローダであるLILOなどは、マスターブートレコード内のプログラム領域部分(つまりブートストラップローダのあるところ)に書き込むことができ、PC/AT互換機の一般的ブートシーケンスを横取り(トラップ)して、独自の起動シーケンスを実現することができる。これについては後で少し説明する。またSystem CommanderなどOSの起動を行ういくつかのプログラムがあるが、多くはLILO同様にマスターブートレコード内のプログラム領域内に入り込んでブートシーケンスをトラップする作りになっている。

 このようにしてPC/AT互換機一般のIBMオリジナルのブートストラップローダと違ったものになってしまったものを元に戻す方法として、DOSやWindows95/98の『Fdisk /mbr』というコマンドがある。これは本来パーティションテーブルを作成、更新するfdiskというコマンドの非公開オプション機能で、パーティションテーブルには触れることなく、プログラム領域部分(オフセット0000から0445)だけ、上記のPC/AT互換機一般のブートストラップローダに書き換える(書き戻す)。

 因みに、後述するブートセクター修復用の『sys』コマンド『fdisk /mbr』コマンドの役割が時折混同されるので気をつけよう。もっともこれはマスターブートレコードとブートセクターの違いを正しく認識していない人が多いために起こる誤解のようで、ここで正しく両者の違いを理解すれば、今後は混同することはないだろう。

 ブートストラップローダについては、ブートストラップローダの詳細で更に詳しい解説をしているので、興味のある人は読んでみてほしい。ただしそちらを読まなくてもブートの仕組みの概要を理解することは可能だ。

 またマスターブートレコードのデータをもう少し技術的にかつ詳細に知りたい諸兄は、マスターブートレコードの解析を参照してほしい。実際のデータを見ながら解析している。

 さて、MBRのブートストラップローダによってブートセクターがロードされ、制御がそちらに移されると、ブートシーケンスもいよいよPC/AT互換機一般の世界から離れて、OS固有の世界に足を踏み入れることになる。

 


ブートセクター

 先にブートセクターはOS固有だと説明した。そしてMBRはOSを超えたPC/AT互換機の世界のものだと述た。しかしPC/AT互換OSの中で、MicrosoftのOSは特別な地位にある。これは当然その歴史によるもので、そもそもIBMが最初にPCを作った時に、その標準OSとしたのが、他でもないMicrosoftのMS-DOS(当時はPC-DOSと呼んだ)だったからだ。

 従って、PC/AT互換機の仕様は、MS-DOSの仕様といっても過言ではないのだ。PC/AT互換機のパーティション構成のことを、DOSパーティションと呼ぶ人もいるし、前述したMBRのIBM、Microsoftオリジナルのブートストラップローダのことを、DOS IPLと呼ぶ場合もあるのだ。PC/AT互換機とMSのOS、特にMS-DOSとは切っても切れない縁がある訳である。だから、ブートセクターもMS-DOSのものが事実上の標準だ。特にMicrosoftのOSでは全体の構造はMS-DOSの頃からほぼ同じで、下図のようなものになっている。

 ところでブートセクターは、物理ディスクの先頭セクターであるマスターブートレコードに対して、各パーティションの先頭セクターということで、パーティションブートレコードPBR Partition Boot Record)と呼ばれることも結構ある。ブートセクターの方が若干より一般的な呼称のようだ。またLinuxなどUNIXの世界ではセクターを通常ブロックと呼ぶので、ブートセクターをブートブロック、または単にブート領域などとも呼ぶ。尚、このブートブロックがスーパーブロックと同一のもの、またはスーパーブロックの一部であるとの誤解が存在しているようだが、ブートブロックとスーパーブロックは別のものなので注意してほしい。

[DOSのブートセクターの構造]
DOSのブートセクター

 DOSのブートセクターの先頭はプログラムコードへのジャンプ命令(3バイト)が入っていて、続いてディスクパラメータがある。ディスクパラメータはBIOSパラメータブロック(BPB)とも呼ばれる(ここでも用語の混乱がある)。内容はOSに依存する部分もあるが、基本的にはファイルシステムの情報、特にそのパーティションに特化した情報が記録されている。ディスクパラメータの詳細は「ディスクパラメータの詳細」を参照してほしい。因みにLinuxを始め多くのUNIX-OSのブートセクター(ブロック)には、このディスクパラメータはない。UNIXの場合、ブートブロックはブートコード用にリザーブされた専用の領域なので、ブートコード以外の情報は記述しない。ファイルシステムの情報は次のブロック以降にあるスーパーブロックに書かれている。

 次のプログラムコードが通常IPL(Initial Program Loader)と呼ばれるもので、やはりOSによって様々だが、ファイルシステムのアクセス手法に従って、その記念すべき最初のファイルの読み込みを行うようなコードが書かれているのが普通だ。

 サポートするファイルシステムが違うので、Windows95でも初期型とOSR2では違うコードになっている。勿論MS-DOSやWindows98とも違う。ただOS固有の最初のアクセスファイルは共通で、MS-DOSからWindows98 SEまで、それはIO.SYSだ。これを読み込んでこちらに実行を移す。その他MSDOS.SYSも読み込むようにコードには書かれている。IO.SYSの後はCommand.comなど、どんどんシステムファイルがロードされていく。

 一方Windows NTは当然サポートするファイルシステムの違いからコード自体が違う訳だが、最初に読み込まれるファイルも違う。NTの場合、NTLDRというファイルが読み込まれる。またWindows NTのセットアップブートディスクのブートセクターでは、SETUPLDR.BINというファイルを読む特別なIPLになっている。これ以降はNTDETECT.COMなど様々なファイルを読み込みつつ、制御を移してどんどんOSが起動されていく訳だ。

 このようにMicrosoftのOSに限ってだが、IPLには、IO.SYSやMSDOS.SYSを次に読み込むDOS-IPLと、NTLDRを次に読み込むNT-IPLの2種類に大別できる。ただし同じDOS-IPLでも、ファイルシステムによってコードは多少違っている。

 最後のブートシグニチャは、MBR同様マジックナンバー0xAA55という値が入っている。ここでもやはり当該ブートセクターが有効なものであるかどうかを示す値(署名)になっており、もしこの値が入っていないと多くのブートローダはそのブートセクターを有効なものと認めず、実行処理を行わず、ブートシーケンスはそこで停止してしまう。

 


ブートセクターの役割とこれを作る人

 ところでブートセクターの役割として、今まで説明したように、OSのブート作業というものが当然ある訳だが、MicrosoftのOSの場合、それだけに留まらない。ブートセクターの中のディスクパラメータは、そのパーティションのファイルシステムに関する重要な(あるいは唯一の)情報源として、OS稼動時にも参照される。

 一方多くのUNIX-OSの場合、ブートセクターにディスクパラメータを持たないと前述した。つまりファイルシステムに関する情報をブートセクターに持っていない。そのためブート時以外にカーネルなどからブートセクターにアクセスすることはない。

 特にLinuxなどは、LILOを当該ブートセクターにインストールしない限り、ブート作業すらしない、結局何にもしない(できない)、何の情報も記述されていないブートセクターになっている。単なるパーティションの先頭セクターに過ぎず、ただいつでもブートコードを書けるように、データ領域として使わずに、空けといてある予備セクターとしての位置付けでしかないブートセクターもある。

 結局ブートセクターは、そのパーティションの1セクターに過ぎない。そこに書かれたファイルシステムが、そこをどのように使おうと勝手な訳だ。しかし先頭セクターということで、MBRのブートストラップローダから読み込まれる可能性があるため、すべてのOSがそこにブートコードを書く場所として使っている。ブートコードを書いても余裕があるなら、その他ファイルシステムの各種情報を格納するなど自由に使えばいい訳だ。

 因みにブートセクターは、ブートという名前がついているが、単なるパーティションの先頭セクターだから、ブートとは関係ないパーティションにも存在する。特にMicrosoftのOSでは、全てのパーティションのブートセクターが同じで、ブートに関係ない領域(例えば論理領域)でもIPLが書かれている。未来永劫実行されることのないコードだが。


 次にMicrosoftのOSの場合、ブートセクターはブート以外にも大切な役割を持っていると説明したが、このブートセクターを書く人、これを作る人にも大切な情報となる。

 ブートセクターの内容が書き込まれるのは、通常フォーマット時だ。DOSやWindows9x系の場合の「format」コマンド、WindowsNTの場合のディスクアドミニストレータ、Windows2000の場合のディスクの管理、Windows全てのエクスプローラ(ドライブのコンテキストメニュー)でパーティションのフォーマットができるが、この時にブートセクターは書き込まれる。これらがブートセクターを作る人ということになる。

 この時、ブートセクターのBPB(ディスクパラメータ)部は、ファイルシステムやパーティションのサイズなどに依存するが、IPLフォーマットを実行したOSに依存する。例えば同じFATファイルシステムでも、WindowsNTでフォーマットしたパーティションのブートセクターと、Windows98でフォーマットしたパーティションのブートセクターは、ディスクパラメータは同じでも、IPLが違うということになる。

 ファイルシステムは現在のところ4種類(FAT12、FAT16、FAT32、NTFS)、IPLは、DOS-IPLNT-IPLの2種類だから、これらの組み合わせで8種類といきたいところだが、ファイルシステムがNTFSでIPLがDOS-IPLのものはないので、ブートセクターは7種類存在することになる。フォーマットを実行するOSによってどのような組み合わせのブートセクターができるかを表にしてみよう。
 
[MSのブートセクターの種類とフォーマット実行OS]

BPB部/IPL部 DOS Win95A Win95B Win98 WinME WinNT Win2k
FAT12/DOS-IPL    
FAT16/DOS-IPL    
FAT32/DOS-IPL        
FAT12/NT-IPL          
FAT16/NT-IPL          
FAT32/NT-IPL            
NTFS/NT-IPL          

 FAT12とは、フロッピーディスクのフォーマット形式だが、表を見ても分かる通り、フォーマットを実行するOSによって、ブートセクターのIPL部分だけは違うフロッピーが出来上がる訳である。

 因みにWindows9x系の場合、sys」コマンドでも、ブートセクターのIPL部分を書き込む。BPB部はsysコマンドでは書き換えない。


ブートシーケンス図

 今まで、マスターブートレコードやブートセクターなど個々のデータについて図を示してきたが、それぞれの位置関係を図式化してなかったので、イメージが掴みにくかったかもしれない。ブートシーケンスをそれぞれのデータの位置関係も分かるように図式化すると以下のようになる。

[シーケンスとデータの位置関係その1]

 まずBIOSプログラムによってハードディスクの先頭セクターであるマスターブートレコード(MBR)が読み込まれる。次にアクティブな基本領域の先頭セクターであるブートセクターが読み込まれる。図では省略した形だが、厳密にはマスターブートレコード内のブートストラップローダがパーティションテーブルを検索してブートセクターを読み込む。

 ブートセクターが読み込まれるとOS固有の世界に入り、そのファイルシステムを理解して、そのアクセス方法に従って、記念すべきOS固有の最初のファイルを読み込む訳だ。これも厳密にはブートセクター内のIPLが行っている。図ではMS-DOSやWindows95/98の例なので、そのOS固有の最初のファイルはIO.SYSになっている。

 上図の例はハードディスクだが、フロッピーディスクの場合、領域という概念がなく、MBRがないので、BIOSから直接ブートセクターに飛ぶことになる。

 因みに上図では、そういうことも可能だということ示すため、あえて第2基本領域アクティブにしている。しかし普通は第1(先頭)基本領域がアクティブだろう。更に言えば、普通は基本領域はハードディスク内に一つだと思う。以下に通常のスタイルである、基本領域が一つで先頭にある場合を示す。

[シーケンスとデータの位置関係その2]

 上図では、今度はWindowsNT/2000の例を示している。またOS固有の世界に入れば、論理領域にあるWINNTディレクトリなどにもアクセスできることを表現している。

 ブートシーケンスをMBR以降の個々のデータに注目して図式化すると以下のようになる。

[MS-DOS、Windows95/98などのシーケンス]
MS-DOS、Windows95/98などのシーケンス

[WindowsNTのシーケンス]
WindowsNTのシーケンス

 いずれも、MBRのPC/AT互換機一般のブートストラップローダがブートセクターを読むところまでは同じだ。そのブートセクター(特にその中のIPL)が違うので、その後の動きが変わる様子が理解できるだろうか。

 因みにNTLDRは次に読み込むファイルを選択できる一種のセレクタになっているので、オペレータの選択によって処理を分岐させることができる。その分岐行為として、もう一度別のブートセクターを読み込ませて他のOSのブートをさせるようにすることもできる。Windows95などがインストールされているPCに後からWindows NTをインストールすると、Windows95とWindowsNTのデュアルブートができるが、これはこの仕組みを利用している。図式化すると次のようになる。

[Windows95/98、WindowsNTのデュアルブートのシーケンス]
Windows95/98、WindowsNTのシーケンス

 NTのインストーラは、ブートセクターがDOSのそれであることを感知すると、これをNTのそれに書き換える前に、元のWindows95のブートセクターをごっぞり「bootsect.dos」というファイルに退避する。この場合、NTLDRが出すメニューには「Microsoft Windows」というメニューが加わるはずだ。このメニューがオペレータによって選択されると、このbootsect.dosが読み込まれ、その中のIPLが実行される。この後は全くMBRのブートストラップローダがブートセクターを読んだ場合と同じだ。

 ところで、この後事情あってWindows NTをアンインストールしたい場合、ファイルなどは削除したとしても、Windows NT用にntldrを読み込むようなIPLが書かれたブートセクターはそのままだ。ブートセクターはファイルではないので、エクスプローラで消したり、書き換えたりできるものではない。このままntldrを削除しても、ただ「ntldrが見つからない」という旨のエラーメッセージを出力して、ブートできなくなるだけである。

 こんな時にWindows95用に再びIO.SYSを読み込むブートセクターに戻すのが、sysコマンドだ。もっともこのsysコマンドはブートセクターの復元だけが目的ではなく、あるパーティションをDOS起動できるように必要なファイルを転送する『システム転送』コマンドだ。その機能の中にブートセクターを復元する機能が含まれている訳である。

 参考までにここで、先ほど少し出てきたLinuxのローダ「LILO」をMBRに書いて、Windowsなどとデュアルブートした場合のシーケンスも紹介しよう。

[Linux、DOSのデュアルブートのシーケンスイメージ]
Linux、DOSのシーケンスイメージ

 LILOもNTLDR同様に選択機能があるので、処理を分岐できる。特に論理領域のブートセクターを読み込ませることもできるなど柔軟性が高い。もっともMBRに入れたコード(1st boot loaderと呼ばれる)で全てのことをやっている訳ではない。殆どの処理はLinuxパーティションにあるプログラム(2nd boot loaderなど他)が行っていて、MBRに入れた1st boot loaderはそれらのプログラムを呼ぶくらいのことしかしていない。(従って上の図は正確ではない。特にMBRからDOS IPLに行く部分は、厳密に言うと嘘だ。イメージと書いてあるのはそのためである)

 System CommanderなどのブートプログラムもLILO同様に、MBRのプログラム領域に入り込むと先ほども説明した。これはPC/AT互換機のブートシーケンスをトラップするには、こうしないと実現できないからだ。しかしこれもLILO同様に、MBRに入り込んだコードは別パーティションに用意した本体プログラムを呼び出しているだけだ。これらの独自の領域にはデータなども保管し、見栄えのいい(カラーでNTLDRのそれよりももっといい)メニューなども出せるようになっている。これより詳しい話は、もう「マルチブートの仕方」に譲る。

 このようにして、MBRのプログラム領域に入り込んだコードを、PC/AT互換機一般のブートストラップローダに戻すのが、「fdisk /mbr」というコマンドであることは先ほども説明した。


まとめ

 最後にブートシーケンスの整理をしておく。()内はそのステージを司るプログラムである。

  1. 電源ON
  2. 周辺機器の初期化(BIOSプログラム)
  3. 起動ドライブのサーチ(BIOSプログラム)
  4. マスターブートレコードのロード(BIOSプログラム)

  5. 起動パーティションのサーチ(MBRのブートストラップローダ)
  6. ブートセクターのロード(MBRのブートストラップローダ)

  7. ファイルシステムの理解(ブートセクターのIPL)
  8. OS固有の最初のファイルのロード(ブートセクターのIPL)

  9. OS固有のブート手続き(OS固有の最初のファイル)

 このうち、『マスターブートレコードのロード』と『起動パーティションのサーチ』はフロッピーの場合、跳ばされることになる。

 先ほど説明したNTと98のデュアルブートの時の、Windows98が起動シーケンスの場合、9番の後にまた6番に戻るイメージだ。ちょっと遠回りしている訳である。

 以上、かなりOS固有の世界にも踏み込んでしまったが、PC/AT互換機のブートの仕組みをご理解いただけただろうか?

 


目次へ