ブート

歴史

初期のENIACではスイッチ群とプラグボードを使い、人手でプログラムを入力していた（正確に言えば配線を変えていた）。
EDSAC（1949年稼働）の起動時実行コードはイニシャルオーダ (英: initial orders) と呼ばれ、非常に技巧的なわずか数十語のコードで単純なアセンブラの機能を実現していた。英語版WikipediaのEDSAC#System_softwareを参照。EDSACのプログラム技法は成書「The Preparation of Programs for an Electronic Digital Computer」として広まり、パラメトロンコンピュータPC-1他のイニシャルオーダ (イニシャルインプットルーチンとも) がEDSACのイニシャルオーダの影響を受けて作成された。
EDSACの技法は成書として公刊されたため、同様のローダーがこの時代の多くのコンピュータで開発・使用されたが、そのローダをどうロードするか、という点では各種の手法があった。当時はそれらのうちの1つの手法を「ブートストラップ方式」と呼んでいた。ILLIAC Iの方式がブートストラップである。
1950年代の IBM 701 以降、何らかのブート処理でプログラムやOSを主記憶にロードするようになった。IBMのメインフレームではこれを "Initial Program Load" と称している。Load Card、Load Tape、Load Drum などと表示されたボタンを押下するとハードウェアの論理回路が対応する周辺機器からブートプログラムを読み込み、それを実行する。するとブートプログラムがより大きなプログラムを自動的にロードする。「ブート」という言葉は1958年からこの意味で使われている。
言葉の歴史としては、自分自身で自分のための土台を用意する、といったような意味では、電子回路の分野にもブートストラップという手法がある。またロバート・A・ハインラインの1941年の中篇SFの題By His Bootstrapsも、そのような意味でブートストラップという語を使っている。
DEC PDP-8 以降のミニコンピュータでは、フロントパネルにあるスイッチ群を操作して短いプログラムを入力する方法が採用された。初期のミニコンピュータは磁気コアメモリを使っており、電源を切っても情報は失われない。従ってブートローダーは消去されない限りメモリ上に存在し続けるが、バグのあるプログラムを実行して全メモリの内容を上書きしてしまうこともある。PDP-11でも同様の手法を採用したが、後にDECはオプションで32ワード（64バイト）のブートプログラムを格納したROMを追加できるようにした。このROMは集積回路ではなく、M792というUnibus用カードであり、32×16のダイオードアレイで回路を構成している。ダイオードが通電する部分のビットは1になり、通電しないようダイオードを除くと対応するビットが0になる。DECは様々な周辺機器からのブートに対応するため、同様のカードを BM792-Yx シリーズとして販売した。

集積回路のROMが登場する以前

IBM 701 (1952–1956) には "load" ボタンがあり、それによってパンチカード、磁気テープ、磁気ドラム装置のいずれかから先頭の36ビットワードを読み込む。そのうち先頭の18ビットは命令として実行され、通常はメモリに追加のワード群を読み込む命令になっている。IBM 1401 (1958) では同様にパンチカードリーダーからプログラムをロードする。80文字が格納されたパンチカードの内容は 001 から 080 番地のメモリに読み込まれ、001番地から命令として実行開始する。命令は通常いつも同じで、この先頭80文字分の情報をアセンブリエリアに転送し、2枚目以降のパンチカードの内容を読み込んでプログラムを構成する。アセンブリエリアに転送し終わると、080 番地の命令へジャンプし、そこにある命令（カードを読み込む命令）を実行することで、次のパンチカードを読み込み、その情報を処理する。つまり、パンチカード1枚ずつが次のパンチカードをブートストラップする形になっている。
CDC 6600 (1964) には144個のトグルスイッチを備えた dead start と呼ばれるパネルがある。このパネルで12ワードの情報を0番の周辺プロセッサ (PP0) のメモリに転送する。それを命令列として実行することでPP0は自身のメモリに必要なコードをロードし、他のPPを初期化する。
GE 645 (1965) には "BOOT" ボタンがある。
Multics (1967) にはブートコマンドがあった。
UNIXでは、The Unix Programmer's Manual 第1版（1971年11月3日）に "boot" への言及がある。
1975年、アルベルトCiaramellaはCSELTに、電話交換機のコンピュータをブートするデバイスの特許を取得した。ブートローダは、現代のROMメモリに常駐し、ブートプロセスはシングルボタン圧力から起動した。デバイスは、アドオン（例PDP-11用）などの任意の種類のコンピュータに適していた。

集積回路によるROMの時代

集積回路の Read Only Memory (ROM) が登場したことでブート処理は一変した。ROMには、マスクROM、PROM、EPROM、フラッシュメモリなどがある。これによってファームウェアとしてブートプログラムをインストールした状態でコンピュータを出荷できるようになった。
アップルの最初のコンピュータ Apple I (1976) にはPROMチップが搭載されていたため、フロントパネルが不要になった。当時の広告では "No More Switches, No More Lights ... the firmware in PROMS enables you to enter, display and debug programs (all in hex) from the keyboard."（スイッチはいらない、ライトもいらない…PROM内のファームウェアで、キーボードからプログラムを入力し、表示し、デバッグできる）と宣伝している。
Atari ST などのホームコンピュータは、電源を入れるとROM上のOSがすぐさま起動する。そのため、二次記憶装置からOSをロードする機能が省かれている。システムのカスタマイズやアクセサリ、サポートソフトウェアなどはフロッピードライブからブート時に自動的にロードされる。電源投入から一定時間フロッピーがセットされない場合やフロッピー内に追加コンポーネントが見つからない場合、それらのロード処理はタイムアウトする。これによりブランクディスク挿入を防ぐ。

二次ブートローダ

ブートローダが読み込む小さなプログラムは、オペレーティングシステムではなく二次ブートローダであることが多い。BOOTMGR、NTLDR、SYSLINUX、GRUBなどがある。二次ブートローダは実際のオペレーティングシステム (OS) をロードすることができ、最後にOSを実行する。OSは初期化処理を行い、デバイスドライバをロードし、OSの通常の処理に必要とされる他のプログラムをロードする。
GNU GRUB、Windowsの BOOTMGR、Windows NT/2000/XP の NTLDER といったブートローダーは、マルチブート設定が可能である。この場合異なるOSを指定することもできるし、同じOSの異なるバージョンを指定することもできるし、単に異なるオプションを指定することもでき（例えば、セーフモードで起動するなど）、OSではなく独立して動作するプログラムを指定することもできる（メモリテスタ Memtest86、ゲームなど）。ブートローダーに別のブートローダーをロードさせることもできる。例えば、GRUBがBOOTMGRをロードすることも可能である。一般にデフォルト設定があり、ある時間内にユーザーが選択しなければデフォルト状態でブートを行う。
なお、Windows 9x系ではMS-DOSが二次ブートローダのような役割を果たしている。ただし、MS-DOSを単体で起動することもできる。
ブート処理はコンピュータがユーザとやりとりできるようになった時点で完了したと見なされる。あるいは、オペレーティングシステムが普通のアプリケーションを実行できるようになった時点で完了と見なすこともできる。典型的なPCのブートは約 1 分ほどかかる。そのうち、15秒ほどが Power On Self Test (POST) が費やす時間で、残りはオペレーティングシステムのロードにかかる時間である。OSロード後の経過時間はシステム内のコアを同時に起動することで3秒程度にまで短縮可能で、例えばcorebootでそのようなブートが可能である。一方、大きなサーバでのブートは全てのサービス起動まで何分かかかる。
多くの組み込みシステムではほとんど即座にブートが完了しなければならない。たとえば、テレビが映るまでに1分かかったのでは使い物にならない。そのため、オペレーティングシステム全体を ROM やフラッシュメモリに格納して、直接実行できるようにしている。ただし、ROMやフラッシュメモリはRAMに比べると、2007年現在の水準では1000倍と桁違いに遅い為、複合機など高機能な機器ではROMの内容をRAMに書き出して実行している。VxWorksなどではROM上の直接実行形式で用意されたブートストラップローダーがROM上の圧縮されたプログラム本体をRAMに展開して本体プログラムが起動するという実装がとられている。

フラッシュブートローダ

組み込みシステムでは、製造工程や保守工程でプログラムを変更するためにフラッシュブートローダが必須である。フラッシュブートローダはフラッシュメモリ内にあり、リセット後に最初に実行されるアプリケーションである。フラッシュブートローダを出荷製品に入れておくと、アプリケーションの更新・修正、設定の変更が容易に行える。CAN ベースのフラッシュブートローダが一般的であり、診断プロトコルを使って通信・ダウンロードを行う。

ネットワークブート

多くのコンピュータはコンピュータネットワーク経由でブートを行う機能を持っている。この場合、二次ブートローダ はサーバのディスクに格納されており、それを TFTP のような単純なプロトコルでクライアントに転送する。内蔵ディスクを持たないシンクライアントは、ネットワークブートによって起動される。
実装としてはPreboot Execution Environment(PXE)などが存在する。

PC互換機のブートデバイス

ブートデバイスとはオペレーティングシステムをロードする前に初期化しなければならないデバイス（周辺機器）のことである。これには一つの入力機器（キーボード）、ひとつの出力機器（ディスプレイ）、初期プログラムロード用機器（フロッピーディスクドライブ、ハードディスクドライブ、CD-ROM、USBメモリなど）がある。初期プログラムロード (IPL = Initial Program Load) 用機器とは、オペレーティングシステムを格納し、ブート処理でOSをロードするのに使われる機器であり、他にも単独動作するユーティリティ（例えば、memtest86+）やブートローダが格納されている。古いシステムではこれはフロッピーかハードディスクと限定されていた。
最近のPCのBIOSは様々なデバイスからのブートをサポートしており、ローカルのハードディスク（あるいはディスク上のパーティション）、光学ドライブ、USBデバイス（フラッシュドライブ、ハードディスクドライブ、光学ディスクドライブなど）、フラッシュメモリカード、ネットワークカード（PXEを使用）などがある。古いPCではフロッピーディスクドライブ、SCSIデバイス、ZIPドライブ、LS-120ドライブなどに限定されていた。
一般にユーザーがBIOSでブート順を設定することができる。1番目をDVDドライブ、2番目をハードディスクと設定した場合、BIOSはまずDVDドライブからのブートを試みる。そしてDVDがセットされていないなどの理由でブートに失敗するとローカルなハードディスクからのブートを試みる。DVDにLinuxの Live CD を入れておけば、ハードディスクにLinuxをインストールしなくともLinuxを起動することができる。これがマルチブートの一例であり、ユーザーはPOST実行後にどちらのOSを起動するかを選択できる。この場合は、電源投入時に（あるいはリセット時に）CDを入れておくか否かで起動するOSを選択しているが、一般的にはキーボードを使ってBIOSメニューを表示させて選択する（一般に F11 または ESC を押下）。

IBM PC互換機のブート手順

電源投入直後、ないしリセットにより、x86は、まずBIOSの存在する 0xFFFF0 番地のメモリにある命令を実行する（ここはx86を使用するどんなコンピュータでも同じである）。このメモリ位置は（リアルモードでの）システムメモリのほぼ最後尾にあたる。そこにはBIOSの初期プログラムの位置へのジャンプ命令が含まれていて、BIOSに制御が渡る。BIOS初期プログラムは Power On Self Test (POST) を実行して必要な機器が正常に動作するかをチェックする。また、同時にそれら周辺機器の初期化も行う。次にBIOSは事前に設定されたデバイスリストを順にあたって、ブート可能な周辺機器を探す。ブート可能デバイスとは、読み込みが可能で、第1セクタの最後尾に 0xAA55 というワード（ブートシグニチャ）があるデバイスである。
そのようなデバイスが見つからない場合、エラーが発生してブート処理は停止する。BIOSがブート可能デバイスを発見すると、そのブートセクタを 0x7C00 というアドレス（Segment:Offset形式では 0000:7C00 だが、一部のBIOSでは 07C0:0000 を使用）にロードして実行する。ハードディスクドライブの場合、ブートセクタはマスターブートレコード (MBR) と呼ばれ、その内容はオペレーティングシステムには依存しない。MBRのコードはパーティションテーブルを調べてアクティブなパーティションを探す。それが見つかったら、MBRのコードはパーティションのブートセクタをロードして実行する。ブートセクタはオペレーティングシステムに依存することが多いが、その機能はカーネルをロードして実行することである。カーネルはさらに初期化処理を続行する。アクティブなパーティションがなかったり、アクティブなパーティションのブートセクタが不正だった場合、MBRは第二ブートローダをロードして制御を渡す。第二ブートローダは（多くの場合ユーザーに入力してもらって）パーティションを選択して、そのブートセクタをロードする。パーティションのブートセクタは一般にオペレーティングシステムのカーネルをロードする。
一部システム（特に最近のMacintoshや Microsoft Windows）はインテルのEFIを採用している。EFI準拠のファームウェアを持つ比較的新しいシステムでは、MBR か GPT のあるドライブからブートでき、標準のMBRブートローダを使わない。また、corebootもシステムマネジメントモードを使った過剰に複雑なファームウェア/BIOSを使わずにブート可能である。古い16ビットBIOSインタフェースは一部のx86用OS（Windows 3.1/95/98など）で必要とされていただけだが、そういった古いBIOSシステムをサポートするためブートローダーは16ビットサポートを続けていることが多い。
多くのPCはBIOSチップを搭載していれば、BIOSチップメーカー名、著作権、そのチップのIDなどを起動時に表示する。同時に利用可能なメモリ容量など、そのコンピュータに関する情報も表示する。

IBM の Initial Program Load

IBM ではブート処理を IPL (Initial Program Load) と呼ぶ。System/360の設計に由来する用語であり、今でも使われている。System/360の場合、オペレータが16進3桁のデバイスアドレス (CUu; C=I/O Channel address, U=Control unit address, u=Device address) を指定し、LOAD ボタンを押下する。System/370と以降のシステムでは、スイッチ群とLOADボタンの代わりに、グラフィックス・コンソール上の選択エリアを使用する。グラフィックス・コンソールとしては IBM 2250 系と IBM 3270 系がある。例えば System/370 Model 158 では、"07X" とキーボードから入力すると入力エリアにキー入力したデバイスアドレスからのIPLが実行される。Amdahl 470V/6 などは16進4桁でデバイスアドレスを指定する。
System/360 の IPL はオペレータ指定のデバイスか事前定義されたデバイスのゼロ番地の位置から24バイトをロードする。そのうち2番目と3番目の8バイトグループがチャネルコマンドワード(CCW)として解釈され、さらに続けてスタートアッププログラムがロードされる。I/Oチャネルコマンドが完了すると、1番目の8バイトグループをステータスレジスタ(PSW)にロードし、指定された位置からスタートアッププログラムの実行を開始する。System/360 やその後継のシステムでは、IPL はハードウェア機能であり、システム上で動作するプログラムではない。事前に定義されたI/Oチャネルコマンドが起動され、デバイスを直接選択し、スタートアッププログラムをメモリ上にロードする。同じプロシージャがディスク装置だけでなく、テープドライブやカードリーダなどからもスタートアッププログラムをロードする。
指定されたデバイスは実際のオペレーティングシステムを主たるストレージからロードする専用プログラムを格納していなければならない。これを "IPL Text" と呼び、ディスクにこれを置くには DASDI (Direct Access Storage Device Initialization) プログラムかそれと等価なプログラムをOS上で実行する。なお、IPL対応の磁気テープやカードデッキは "IPL Text" が存在する状態で配布されている。

バロースのテープからのブート

バロース B1700 では、ブートストラップROMもハードウェアIPLも持たない。その代わり、システムをリセットすると、フロントパネルに装着されたテープから機械語を読み込んで、これがRAM上のブートローダとなる。この方式では、装着するテープを診断プログラムに代えれば、通常のOSも立ち上げられないほどの障害が発生している状況でシステムの診断が可能となる。

クイックブート

Linux（例えばSplashtopなど）をOSとして採用している各種機器にはクイックブートと呼ばれる素早い起動が可能なものもある。

エラー

Windows では、ブート処理中に解決できないエラーが発生すると、いわゆるブルースクリーン状態になる。