ブート
多くのコンピュータシステムでは、メインメモリ上の実行コードだけを実行できる。しかし、最近のオペレーティングシステムはハードディスクドライブやLive CD、フラッシュメモリ(USBメモリなど)に格納されている。つまり、コンピュータの電源を入れた直後、メモリ上にはオペレーティングシステムは存在しない。コンピュータのハードウェアだけではオペレーティングシステムがやっているような複雑なことはできないので、ディスクから任意のプログラムをロードするというようなことはできない。ここで『オペレーティングシステムをメモリにロードするためには、オペレーティングシステムがメモリに存在していなければならない』というジレンマが生じる。
このパラドックスの解決法は、ブートローダ(またはブートストラップローダ)と呼ばれるROM上にある特殊な小さいプログラムを使うことである。このプログラムはオペレーティングシステムの全ての機能を持っているわけではないが、オペレーティングシステムをロードして起動するための別のプログラムをロードするには十分な機能を持っている。多段階のブートローダがよく使われ、ある小さなプログラムから別の小さなプログラムを呼び出すということを繰り返して、最終的にオペレーティングシステムが起動される。
初期のプログラム可能なコンピュータは、トグルスイッチがフロントパネルに並んでいて、それを操作することによってブートローダをプログラム格納域に置いてからCPUを起動するようになっていた。
製造時にそのようなインタフェースを使ってブートコードを不揮発性メモリに書き込む。システムをリセットすると、マイクロコントローラが自動的に不揮発性メモリ上のプログラムを実行開始する。例えば Atmel AVR などがこの方式である。この際のインタフェースはハードウェアで実装されていることが多い。ブートROMを持つプロセッサの場合、ブートROM上のソフトウェアでGPIOピンをそのようなインタフェースに使うこともできる。
多くのデジタルシグナルプロセッサ (DSP) には以下のようなブートモードがある。
シリアルモードブート
パラレルモードブート(HPIブートなど)
DSPはマイクロプロセッサやマイクロコントローラが別に存在するシステム設計ということが多く、それらがシステム全体の動作、割り込み処理、外部イベント処理、ユーザインタフェースなどを担当しており、DSPは信号処理だけを扱う。その場合DSPは別のプロセッサからブートすることができ、そのプロセッサを「ホストプロセッサ」とも呼ぶ。ホストプロセッサは「マスター」とも呼ばれる。DSPは自前のブート用メモリを持たないことが多く、必要なコードをホストプロセッサから供給してもらう必要がある。携帯電話、モデム、オーディオプレイヤー、ビデオプレイヤーなどがそのような構成を採用していることが多い。
FPGAチップは、電源を入れるとその回路構成情報を外部EEPROMからロードする。
例えば IBM PC や互換機では、一次ブートローダは必ず446バイト(Windows NT では、ディスクシグニチャがオフセット440の位置にあるため、440バイト)でマスターブートレコードになければならず、その後に64バイトのパーティションテーブルが続き、最後が 0xAA55 という値で終わっていなければならない(BIOS はその値を見て正しいブートローダであると判断する)。
1995年以前の Macintosh などでは、OS とハードウェアが非常に密接に関連しており、標準のOS以外でブートすることができない。そのような場合、一般にとられる解決策としては、標準OSに属するプログラムとしてブートローダを設計し、それがシステムをハイジャックして別のOSをロードする。これは例えばアップルがA/UXというUnix系のOSのブートに使った技法で、それを流用して各種フリーウェアのOSや BeOS Personal Edition 5 などがブート可能となっていた。90年代によく使われていたMS-DOS環境からLinuxを起動するloadlin(w:Loadlin)も同様のものである(もっともMS-DOSには保護がないので、ハイジャックというほど大袈裟なものでもない)。
一般的な一次ブートローダーとしては、以下のものがある。
BIOS
EFI
OpenBIOS(英語版)
OpenBoot