コンピュータシステムの起動:ブートの仕組みと歴史
コンピュータを起動する、あるいはシステムをリセットした後に、モニタやOSといった基本的なソフトウェアを主記憶(メモリ)に読み込み、ユーザーがプログラムを実行できる状態にするまでの処理の流れを
ブート(boot)または
ブートストラップ(bootstrap)と言います。この
プロセスを担うのが
ブートローダ(boot loader)です。ブートローダは、補助記憶装置(ハードディスクなど)に保存されているプログラムを読み出し、主記憶に書き込むプログラムです。
電源投入によるブートを
コールドブート、リセットによるブートを
ウォームブートと呼びます。ウォームブートでは、コールドブートの一部手順を省略できる場合があります。
「ブートストラップ」という名称は、靴を履く際に靴ひも(strap)を引っ張って足を持ち上げる動作に由来します。これは、
コンピュータが動作するにはプログラムが必要だが、プログラムを読み込むプログラム自体はどうやって読み込むのかというパラドックスを表しています。
ブートの歴史:初期のコンピュータから現代のPCまで
初期の
コンピュータ、例えばENIACはノイマン型ではなく、プログラムは配線によって設定されました。ノイマン型
コンピュータとして実用化されたEDSAC(1949年)では、
イニシャルオーダ(initial orders)と呼ばれるプログラムが、ROMのような仕組みから主記憶に書き込まれ、
紙テープから機械語を読み込んで実行する仕組みでした。この技法は、後の
コンピュータのブートローダ開発に大きな影響を与えました。
1950年代以降、
IBM 701などでは、ボタン操作でブートプログラムを読み込み、それがさらに大きなプログラムをロードする方式が採用されました。この頃より「ブート」という言葉が、この意味で使われ始めました。
DEC PDP-8などのミニ
コンピュータでは、フロントパネルのスイッチで短いプログラムを入力してブートする方法が一般的でした。後にROMが搭載されるようになり、スイッチ操作は不要になりました。
集積回路によるROMが登場する以前は、メモリ容量が小さく、ROMも容量が少なかったため、複雑なブートシーケンスが必要でした。しかし、ROMの容量が大きくなると、ブートプログラムをROMに格納し、電源投入時に自動的に実行する方式が一般的になりました。
Apple I (1976) は、PROMチップを搭載したことでフロントパネルが不要になった例です。Atari STなどのホーム
コンピュータは、電源投入と同時にROM上のOSが起動するシンプルなブートを採用していました。
多くの
コンピュータシステムは、主記憶上の実行コードしか実行できません。しかし、OSはハードディスクなどに保存されているため、電源投入時にはメモリに存在しません。そこで、ROM上に格納された小さなプログラムである
ブートローダが、OSをロードする役割を担います。
初期の
コンピュータでは、フロントパネルのスイッチでブートローダをメモリに格納し、
CPUを起動する方式が用いられました。
IBM 650、DEC PDP-5、PDP-8などがその例です。ブートローダは、
紙テープや磁気ディスクなどからOSを読み込み、実行します。
現代のPCでは、
CPUがB
IOSやEFIといったファームウェアを自動的に実行し、そこからブート可能なデバイスを探し、ブートローダをロードします。ブートローダは、複数の段階を経てOSをロードすることが多く、
一次ブートローダと
二次ブートローダという役割分担が見られます。一次ブートローダはB
IOSやMBR(Master Boot Record)などのファームウェアに含まれます。二次ブートローダは、GRUB、BOOTMGR、NTLDRなどがあります。これらのブートローダは、OSの選択や、セーフモードでの起動などのオプションを提供する機能を備えています。
ブートデバイスとブート手順:PC互換機の例
ブートデバイスとは、OSをロードするために初期化が必要なデバイス(ハードディスク、
光学ドライブ、USBメモリなど)のことです。B
IOSは、設定された順番にブートデバイスを探し、ブート可能なデバイスを見つけると、そのブートセクタをメモリにロードして実行します。
x86アーキテクチャのPCでは、電源投入時にB
IOSがまず実行され、POST(Power On Self Test)を実行して
ハードウェアのチェックを行います。その後、ブート可能なデバイスを探し、ブートセクタをメモリにロードし、実行します。ハードディスクの場合、MBRがパーティションテーブルを調べ、アクティブなパーティションのブートセクタを実行します。ブートセクタは、OS
カーネルをロードして実行します。
最近のPCでは、UEFI(Unified Extensible Firmware Interface)がB
IOSに代わるファームウェアとして採用されている場合もあります。UEFIは、B
IOSと比べてより柔軟なブート処理を提供します。
その他のブート方法
組み込みシステムでは、ROMや
フラッシュメモリにOS全体を格納し、直接実行する方式が一般的です。また、ネットワーク経由でブートを行う
ネットワークブートも広く利用されています。
様々な
CPUや
マイクロコントローラは、それぞれ異なるブート方法を持っています。TI OMAPなどのDSPは、ブートROMを内蔵しており、複数のデバイスからブートプログラムをロードできます。JTAGなどのデバッグインタフェースを用いてブートコードを書き込むことも可能です。
IBMの
メインフレームでは、ブート処理を
IPL(Initial Program Load)と呼びます。オペレータがデバイスを指定してLOADボタンを押すことでブートが開始されます。
バロースB1700では、フロントパネルに装着されたテープからブートローダを読み込む独特な方法が用いられました。
LinuxなどのOSでは、
クイックブートと呼ばれる高速起動機能も提供されています。
ブート処理は、
コンピュータがユーザーとインタラクトできる状態になる、あるいはOSがアプリケーションを実行できる状態になるまで続きます。PCのブート時間は、数秒から数十秒程度ですが、大きな
サーバでは数分かかることもあります。
組み込みシステムでは、ほぼ瞬時にブートが完了することが求められます。