この項目では、コンピュータの動作について説明しています。インドの悪霊については「ブータ」を、ブート盤については「海賊盤」をご覧ください。
「ブート」の語義については、ウィクショナリーの「ブート
」の項目をご覧ください。ブート(英: boot)またはブートストラップ(英: bootstrap)は、コンピュータシステムの電源投入時、あるいはシステムのリセット後、モニタやOSなどなんらかの基本的なシステムソフトウェアを主記憶に展開し、ユーザプログラムを実行できるようにするまでの処理の流れをいう。ブートローダ(英: boot loader)は、以上のプロセスで使われるローダ、すなわち不揮発性の補助記憶にある目的のプログラムを読み出し、揮発性の主記憶に書き込むプログラムのことである。
電源投入時のブートのことを「コールドブート」、リセットされたことによるブートを「ウォームブート」という。ウォームブートでは、コールドブートにおける最初のほうの手続きのいくつかが必要無い場合もあり、そういった手続きを省略することもある。
ブートストラップまたはブートストラップローダ(英: bootstrap loader)という名前は、ブーツを履くことはまずどんな仕事のはじめにもやる事で、さらにブーツのつまみ革(英: strap)を自分で引っ張って自分を持ち上げようとするイメージから来ている[1]。つまり、コンピュータはプログラムをロードしないと動作できないが、プログラムをロードするプログラムはどうロードするのだ? というパラドックスに着目した呼称である[2]。 初期の電子計算機のひとつであるENIACは、いわゆるノイマン型コンピュータではなく、プログラムはパッチボードを利用した配線によっておこなわれ、また解決したい問題の計算式の初期値などを最初から設定して計算を行うような計算機であった。 ノイマン型として実用的に稼働したとされる初期のコンピュータのEDSAC(1949年稼働)では、イニシャルオーダ (英: initial orders) と呼ばれたプログラムが、ロータリースイッチで実現された一種のROMからハードウェア的に主記憶に書き込まれる。イニシャルオーダは非常に技巧的なわずか数十語のコードで単純ながらアセンブラ的機能を実現しており、紙テープを読み込んでそれを機械語に変換し主記憶の残りの部分に書き込む(英語版WikipediaのEDSAC#System_software
歴史
EDSACの技法は成書として公刊されたため、同様のローダーがこの時代の多くのコンピュータで開発・使用されたが、そのローダをどうロードするか、という点では各種の手法があった[NB 1]。当時はそれらのうちの1つの手法を「ブートストラップ方式」と呼んでいた。ILLIAC Iの方式がブートストラップである。[3]
1950年代の IBM 701 以降[4]、何らかのブート処理でプログラムやOSを主記憶にロードするようになった。IBMのメインフレームではこれを "Initial Program Load" と称している。Load Card、Load Tape、Load Drum などと表示されたボタンを押下するとハードウェアの論理回路が対応する周辺機器からブートプログラムを読み込み、それを実行する。するとブートプログラムがより大きなプログラムを自動的にロードする[5][6]。「ブート」という言葉は1958年からこの意味で使われている[7]。
言葉の歴史としては、自分自身で自分のための土台を用意する、といったような意味では、電子回路の分野にもブートストラップという手法がある。またロバート・A・ハインラインの1941年の中篇SFの題By His Bootstraps[NB 2]も、そのような意味でブートストラップという語を使っている。
DEC PDP-8 以降のミニコンピュータでは、フロントパネルにあるスイッチ群を操作して短いプログラムを入力する方法が採用された。初期のミニコンピュータは磁気コアメモリを使っており、電源を切っても情報は失われない。従ってブートローダーは消去されない限りメモリ上に存在し続けるが、バグのあるプログラムを実行して全メモリの内容を上書きしてしまうこともある。PDP-11でも同様の手法を採用したが、後にDECはオプションで32ワード(64バイト)のブートプログラムを格納したROMを追加できるようにした。このROMは集積回路ではなく、M792というUnibus用カードであり、32×16のダイオードアレイで回路を構成している。ダイオードが通電する部分のビットは1になり、通電しないようダイオードを除くと対応するビットが0になる。DECは様々な周辺機器からのブートに対応するため、同様のカードを BM792-Yx シリーズとして販売した[8][9]。 IBM 701 (1952?1956) には "load" ボタンがあり、それによってパンチカード、磁気テープ、磁気ドラム装置のいずれかから先頭の36ビットワードを読み込む。そのうち先頭の18ビットは命令として実行され、通常はメモリに追加のワード群を読み込む命令になっている[10]。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 ボタンがある[11]。 Multics (1967) にはブートコマンドがあった[12][13]。 UNIXでは、The Unix Programmer's Manual 第1版(1971年11月3日)に boot への言及がある[14]。 1975年、CSELT 以上で述べたような古い時代において、電源投入直後の機能があれこれと話題になったことには、いくつかの原因がある。 古いコンピュータは、 等の理由から、この過程を技巧的なブートシーケンスにせざるをえなかったのである。 集積回路によるROM、具体的にはマスクROM、PROM、EPROM、フラッシュメモリの時代になると、以上のような制限はかなり緩和され、ファームウェアとしてメモリ空間の一部にブートプログラムを存在させ、電源投入後やリセット後、プロセッサは単にそのアドレスから実行を始めればよい、というようになった。その結果、一般的なユーザのブート時の関心事は、ハードディスク上のファイルシステムにあるOSを、どうロードして実行するか、というような点に移った。組込みシステムやゲーム機などでは、最初からROMに実行イメージを展開しておき、ブートしたらそのまま目的のシステムが実行される、というような形態もある。 Appleの最初のコンピュータ 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内のファームウェアで、キーボードからプログラムを入力し、表示し、デバッグできる)と宣伝している[16]。これはそれ以前の Altair 8800 などに対比してアピールしているのである。 Atari ST などのホームコンピュータは、電源を入れるとROM上のOSがすぐさま起動する。そのため、二次記憶装置からOSをロードする機能が省かれている。システムのカスタマイズやアクセサリ、サポートソフトウェアなどはフロッピードライブからブート時に自動的にロードされる。電源投入から一定時間フロッピーがセットされない場合やフロッピー内に追加コンポーネントが見つからない場合、それらのロード処理はタイムアウトする。
集積回路のROMが登場する以前
集積回路によるROMの時代
メモリ空間が狭いことが多く、その空間を少しでも自由に使える主記憶のRAMに当てたい
ROMにあたる記憶装置が特殊な装置であったりして容量も少なく、また主記憶と同様に読み出しができるものではなかった