ブート

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内, 検索
ブート中のパソコン画面


ブート: boot)または ブートストラップ: bootstrap)は、コンピュータシステムの電源を入れたときにオペレーティングシステムを起動するまでの処理の流れをいう。また、ブートローダ: boot loader)とは、ブート処理を行うソフトウェアを意味する。

目次

[編集] ブートローダ

多くのコンピュータシステムでは、メモリ(ROMまたはRAM)上の実行コードだけを実行できる。しかし、最近のオペレーティングシステムはハードディスクドライブLiveCDフラッシュメモリUSBメモリなど)に格納されている。つまり、コンピュータの電源を入れた直後、メモリ上にはオペレーティングシステムは存在しない。コンピュータのハードウェアだけではオペレーティングシステムがやっているような複雑なことはできないので、ディスクからプログラムをロードするというようなことはできない。ここで『オペレーティングシステムをメモリにロードするためには、オペレーティングシステムがメモリに存在していなければならない』というパラドックスが生じる。

このパラドックスの解決法は、ブートローダ(またはブートストラップローダ)と呼ばれる特殊な小さいプログラムを使うことである。このプログラムはオペレーティングシステムの全ての機能を持っているわけではないが、オペレーティングシステムをロードして起動するための別のプログラムをロードするには十分な機能を持っている。多段階のブートローダがよく使われ、ある小さなプログラムから別の小さなプログラムを呼び出すということを繰り返して、最終的にオペレーティングシステムが起動される。ブートストラップローダ: bootstrap loader)という名前は、ブーツのつまみ革(: strap)を自分で引っ張って自分を持ち上げようとするイメージから来ている。

初期のプログラム可能なコンピュータは、トグルスイッチがフロントパネルに並んでいて、それを操作することによってブートローダをプログラム格納域に置いてからCPUを起動するようになっていた。そうするとCPUはブートローダを実行して、オペレーティングシステムを外部記憶メディア(例えば紙テープあるいは磁気ディスク装置)からロードすることができた。

ブートローダの擬似アセンブラコードは以下の8個の命令に単純化できる。

0: P レジスタに 8 をセット
1: 紙テープ読取装置の準備ができているかチェック
2: もし準備できていなかったら、1 へジャンプ
3: 紙テープ読取装置からアキュムレータに 1バイト読み込む
4: テープが終了したら 8 へジャンプ
5: アキュムレータの内容を P レジスタが指すアドレスに書き込む
6: P レジスタに 1 を加算
7: 1 へジャンプ

次の例は 1970年代のニコレット・インストゥルメント社[1]のミニコンピュータに基づいている。二次ローダが紙テープから逆の順番に読み込まれることに注意。

0: P レジスタに 106 をセットする
1: 紙テープ読取装置の準備ができているかチェック
2: もし準備できていなかったら、1 へジャンプ
3: 紙テープ読取装置からアキュムレータに 1バイト読み込む
4: アキュムレータの内容を P レジスタが指すアドレスに書き込む
5: P レジスタから 1 を減算
6: 1 へジャンプ

二次ローダの長さは、ちょうど最後に 6 番地を上書きする長さになっている。5 番地の命令を実行した後、6 番地から二次ローダを実行し始める。二次ローダはオペレーティングシステムが書いてあるもっと長いテープが紙テープ読取装置にセットされるのを待つ。ブートローダと二次ローダの違いは紙テープ読取装置がエラーを発生したときに対処できるかどうかである。当時のハードウェアでは紙テープ読取装置は頻繁にエラーを起こした。

マイコンと呼ばれた時代の初期のパーソナルコンピュータ、だいたい16ビット時代の初期の頃までのマシンでは、フロッピーディスクが標準の装備でなかったこともあり、最初からメモリ空間にROMとして展開されて存在する、ほとんどにおいてはBASIC(ROM BASIC)が起動されるというものがもっぱらで、外部記憶装置からシステムを読み込むブートシーケンスは存在しなかった。クリーンコンピュータを標榜したシャープの一部のパソコンのように例外もある。

最近のコンピュータではブート処理はCPUがROM内のソフトウェア(例えば、BIOSEFI)を既定のアドレスから実行することで開始される(CPUはリセットされると外部からの助け無しにこのソフトウェア実行をするよう設計されている)。そのソフトウェアはブートに使用できる各種デバイスを探し、最も優先順位の高いデバイスの特殊な領域(一般にはブートセクタ)から小さなプログラムを読み込む。

ブートローダには特有の制限、特にそのサイズの制限がある。例えば IBM PC や互換機では、一次ブートローダは必ず 512 バイトであり、最後が 0xAA55 という値で終わっていなければならない(BIOS はその値を見て正しいブートローダであると判断する)。

1995年以前の Macintosh などでは、OS とハードウェアが非常に密接に関連しており、標準のOS以外でブートすることができない。そのような場合、一般にとられる解決策としては、標準OSに属するプログラムとしてブートローダを設計し、それがシステムをハイジャックして別のOSをロードする。これは例えばアップルがA/UXというUNIX系のOSのブートに使った技法で、それを流用して各種フリーウェアのOSやBeOS Personal Edition 5などがブート可能となっていた。

[編集] 二次ブートローダ

ブートローダが読み込む小さなプログラムは、オペレーティングシステムではなく二次ブートローダであることが多い。NTLDRLILOGRUBなどがある。二次ブートローダは実際のオペレーティングシステム(OS)をロードすることができ、最後にOSを実行する。OSは初期化処理を行い、デバイスドライバをロードし、OSの通常の処理に必要とされる他のプログラムをロードする。

ブート処理はコンピュータがユーザとやりとりできるようになった時点で完了したと見なされる。あるいは、オペレーティングシステムが普通のアプリケーションを実行できるようになった時点で完了と見なすこともできる。典型的なPCのブートは約 1 分ほどかかる。そのうち、15秒ほどが一次ブートローダが費やす時間で、残りはオペレーティングシステムのロードにかかる時間である。一方、大きなサーバでのブートは全てのサービス起動まで何分かかかる。

多くの組み込みシステムではほとんど即座にブートが完了しなければならない。たとえば、テレビが映るまでに 1 分かかったのでは使い物にならない。そのため、オペレーティングシステム全体を ROM やフラッシュメモリに格納して、直接実行できるようにしている。ただし、ROMやフラッシュメモリはRAMに比べると、2007年現在の水準では1000倍と桁違いに遅い為、複合機など高機能な機器ではROMの内容をRAMに書き出して実行している。VxWorksなどではROM上の直接実行形式で用意されたブートストラップローダーがROM上の圧縮されたプログラム本体をRAMに展開して本体プログラムが起動するという実装がとられている。

なお、Windows 9x系ではMS-DOSが二次ブートローダのような役割を果たしている。ただし、MS-DOSを単体で起動することもできる。

[編集] フラッシュブートローダ

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

[編集] ネットワークブート

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

実装としてはPreboot Execution Environment(PXE)などが存在する。

[編集] EDSACのブートローダとその影響

EDSACの起動時実行コードはイニシャルオーダ (: initial orders) と呼ばれ、非常に技巧的なわずか数十語のコードで単純なアセンブラの機能を実現していた。英語版WikipediaのEDSAC#System_softwareを参照。EDSACのプログラム技法は成書「The Preparation of Programs for an Electronic Digital Computer」として広まり、パラメトロンコンピュータPC-1他のイニシャルオーダ (イニシャルインプットルーチンとも) がEDSACのイニシャルオーダの影響を受けて作成された。

[編集] BIOS ブートデバイス

ブートデバイスとはオペレーティングシステムをロードする前に初期化しなければならないデバイス(周辺機器)のことである。これには一つの入力装置キーボード)、ひとつの出力機器(ディスプレイ)、初期プログラムロード用機器(フロッピーディスクドライブハードディスクドライブCD-ROMUSBメモリなど)がある。(初期プログラムロード(IPL = Initial Program Load)用機器とは、オペレーティングシステムを格納し、ブート処理でOSをロードするのに使われる機器であり、他にも単独動作するユーティリティ(例えば、memtest86+)やブートローダが格納されている。古いシステムではこれはフロッピーかハードディスクと限定されていた。)

最近のBIOSでは、ブート用機器の選択肢が大きくなっている。例えばハードディスクドライブフロッピーディスクSCSICD-ROMZIPスーパーディスク(LS-120)、USB(USB-FDD, USB-ZIP, USB-CDROM, USB-HDD)などである。

たとえば、Microsoft Windowsを 1台目のハードディスクにインストールし、Linuxを 2台目にインストールすることができる。BIOSのブート機器の設定を変更することにより、ユーザーはロードするオペレーティングシステムを選択することができる。

[編集] IBM PC互換機のブート手順

電源投入直後、ないしリセットにより、x86は、まず、BIOSの存在する FFFF0h 番地のメモリにある命令を実行する(ここはx86を使用するどんなコンピュータでも同じである)。このメモリ位置は(リアルモードでの)システムメモリのほぼ最後尾にあたる。そこにはBIOSの初期プログラムの位置へのジャンプ命令が含まれていて、BIOSに制御が渡る。BIOS初期プログラムはPower On Self Test(POST)を実行して必要な機器が正常に動作するかをチェックする。また、同時にそれら周辺機器の初期化も行う。次にBIOSは事前に設定されたデバイスリストを順にあたって、ブート可能な周辺機器を探す。そのようなデバイスが見つからない場合、エラーが発生してブート処理は停止する。BIOSがブート可能デバイスを発見すると、そのブートセクターをロードして実行する。ハードディスクドライブの場合、ブートセクターはマスターブートレコード(MBR)と呼ばれ、その内容はオペレーティングシステムには依存しない。MBRのコードはパーティションテーブルを調べてアクティブなパーティションを探す。それが見つかったら、MBRのコードはパーティションのブートセクターをロードして実行する。ブートセクターはオペレーティングシステムに依存することが多いが、その機能はカーネルをロードして実行することである。カーネルはさらに初期化処理を続行する。アクティブなパーティションがなかったり、アクティブなパーティションのブートセクターが不正だった場合、MBRは第二ブートローダをロードして制御を渡す。第二ブートローダは(多くの場合ユーザーに入力してもらって)パーティションを選択して、そのブートセクターをロードする。パーティションのブートセクターは一般にオペレーティングシステムのカーネルをロードする。EFI準拠のファームウェアを持つ比較的新しいシステムでは、MBR か GPT のあるドライブからブートでき、標準のMBRブートローダを使わない。

[編集] その他のブート手順

他のプロセッサは異なるブートモードを持つ。多くのデジタルシグナルプロセッサは以下のようなブートモードがある。

  • シリアルモードブート
  • パラレルモードブート
  • HPIブート

[編集] IPL (Initial Program Load)

IBM ではブート処理を IPL (Initial Program Load) と呼ぶ。System/360の設計に由来する用語であり、今でも使われている[2]。System/360 やその後継のシステムでは、IPL はハードウェア機能であり、システム上で動作するプログラムではない。事前に定義されたI/Oチャネルコマンドが起動され、デバイスを直接選択し、スタートアッププログラムをメモリ上にロードする。同じプロシージャがディスク装置だけでなく、ストリーマなどからもスタートアッププログラムをロードする。

System/360 の IPL はオペレータ指定のデバイスか事前定義されたデバイスのゼロ番地の位置から24バイトをロードする。そのうち2番目と3番目の8バイトグループがチャネルコマンドワード(CCW)として解釈され、さらに続けてスタートアッププログラムがロードされる。I/Oチャネルコマンドが完了すると、1番目の8バイトグループをステータスレジスタ(PSW)にロードし、指定された位置からスタートアッププログラムの実行を開始する[2]

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

[編集] ハードリブート

「ハードリブート」(「コールドリブート」、「コールドブート」、「コールドスタート」)は電源を入れ直したときや、特別なリセット信号をCPUに入力したときに行われる。この場合、シャットダウン処理を飛ばして再起動が行われる(多くのOSではファイルシステムが不正な状態になっているため、通常の処理を行う前にその修復が行われる)。ハードリブートの原因としては、電源の瞬断、何らかの事故、致命的なエラー状態/コンピュータウイルス/DoS攻撃などを解決する最後の手段として意図的に行う場合などがある。

[編集] ソフトリブート

「ソフトリブート」(「ウォームリブート」)はソフトウェアの制御下で、電源を入れなおしたりリセット信号を発したりせずにコンピュータを再起動することである。場合によっては、シャットダウンして再起動する通常の処理をソフトリブートと呼ぶこともある。

オリジナルの IBM PC の設計では、Control-Alt-Delete キーの押下によってソフトリブートが行われるようになっていた。

Linux にはオプションで kexec システムコールがあり、現在動作中のカーネルをシャットダウンして別のカーネルを実行する。このとき、システムのファームウェアは使わない。なお、新たにロードされるカーネルはLinuxである必要はない。

[編集] 予期しないリブート

予期しないリブート(random reboot)とは、リブートが予期しない状況で発生することである。この原因として以下のようなことが考えられる。

  • ソフトウェア問題
  • ハードウェア問題
    • ハードウェアの非互換
    • 不正なハードウェア設定
    • 配線(主にプラグ類)の接触不良
      • メモリタイミング不正
    • ハードウェアの故障
    • オーバーヒート
      • CPUのオーバーヒート
  • その他の問題
    • 電気的問題
      • 電源電圧の急変

Windows XP には、解決できない障害が発生したとき、ブルースクリーン状態をスキップして即座に再起動させる機能がある。このため、予期しないリブートが増えたように感じるユーザーもいる。UNIX系のシステムは同様の状況で、いわゆるカーネルパニックを発生させ、こちらもコンピュータを再起動させることがある。

[編集] エラー

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

[編集] 脚注

  1. ^ : Nicolet Instrument Corporation
  2. ^ a b z/Architecture Principles of Operation. IBM. pp. Chapter 17. http://publibz.boulder.ibm.com/epubs/pdf/a2278324.pdf 2007年4月14日閲覧。. 

[編集] 関連項目

[編集] 外部リンク

個人用ツール
名前空間
変種
操作
案内
ヘルプ
ツールボックス
他の言語