ブート

del.icio.us del.icio.us
Digg Digg
Furl Furl
Reddit Reddit
Rojo Rojo
Add to OnlyWire
Windows XPをロード中のインターネット公衆電話
Windows XPをロード中のインターネット公衆電話

ブート(またはブートストラップbootbootstrap)は、コンピュータシステムの電源を入れたときにオペレーティングシステムを起動するまでの処理の流れをいう。また、ブートローダ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年代の Nicolet Instrument Corporation 社のミニコンピュータに基づいている。二次ローダが紙テープから逆の順番に読み込まれることに注意。

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

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

かつて8/16ビットマシンの場合、フロッピーディスクが搭載されていない機種には原則的にブートシーケンスが存在しなかった。例外はクリーンコンピュータを標榜していたシャープのパソコンの一部であった。

最近のコンピュータではブート処理は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 分かかったのでは使い物にならない[1]。そのため、オペレーティングシステム全体を ROM やフラッシュメモリに格納して、直接実行できるようにしている。ただし、ROMやフラッシュメモリはRAMに比べると桁違いに(2007年現在の水準では1000倍)遅い為、複合機など高機能な機器ではROMの内容をRAMに書き出して実行している。VxWorksなどではROM上の直接実行形式で用意されたブートストラップローダーがROM上の圧縮されたプログラム本体をRAMに展開して本体プログラムが起動するという実装がとられている。

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

フラッシュブートローダ

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

ネットワークブート

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

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互換機のブート手順

ブート中のパソコン画面
ブート中のパソコン画面

まず、パーソナルコンピュータCPUBIOSの存在する 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. ^ ブラウン管テレビは本来映るまで1分以上かかった。その時間を短縮する為に様々な努力が行われた。現代のデジタルテレビは放送波のスキャンからPSI/SI情報の取得、映像の受信まで3分以上かかる。この時間を短縮する為に、ブートを高速化するのではなく、即受像できる状態でスタンバイしている。
  2. ^ a b z/Architecture Principles of Operation. IBM, Chapter 17 2007年4月14日閲覧. 

外部リンク

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.


Giant Panda

Mercedes Car
James Bond Guide
This site monitored by SitePinger.net