パソコン実習室
ブート ストラップ - パソコンの起動 by BIOS
≪ previous next ≫

W.Windows の起動

 WindowsをインストールしたMBRやブートセクターには、Microsoftのブートローダーが書き込まれています。システムBIOSがメモリの0x07C00にMBRをロードしCPUの制御が渡されると、Windowsの起動がスタートします。その動作シーケンスは概ね下図のようになります。


名称役割
Ntldr(NT Loader)ハードウェアの構成を検査・記録し、NTOSKRNLをロードする。
NTOSKRNL(NT OS Kernel)OSの基礎モジュールを構築する。


W.1.Boot Strap Loaderの動作

 システムBIOSがロードしたMBRの構成は次のようになっています。

位置(offset)適用サイズ(バイト)
0x0000Boot Strap Loader446
0x01BEパーティション テーブル116
0x01CEパーティション テーブル 216
0x01DEパーティション テーブル 316
0x01EEパーティション テーブル 416
0x01FEboot signature2
※ 詳細は [ハードディスクの構造とパーティション] の [W.MBR(Master Boot Recode)] を参照
  して下さい。

 MBR(Master Boot Recode)の先頭446バイトの領域は、ブート ストラップ ローダー(Boot Strap Loader)を置く領域となっています。
※ Boot Strap Loaderは、マスター ブートローダー、イニシャル プログラム ローダー とも呼ばれて混乱し
  ています。



 ブート ストラップ ローダーは、一緒にロードされたMBR内にあるパーティション テーブルを参照してアクティブ(OS起動可能)なパーティションを検出し、そのパーティションのブートセクターをロードする役目を担います。

 システムBIOSの far ジャンプによって動作を開始したブート ストラップ ローダーは、概ね下記のような処理を実行します。
  1. メモリ上の0x07C00から始まる512バイト(システムBIOSにロードされたMBR自身)を、0x00600を先頭とする領域に移動します。
    (0x07C00以降をブートセクターのロード用に空けておきます)
  2. 次処理用の命令があるアドレス0x0061Dへジャンプします。
  3. ※ 次に実行すべき命令が存在するアドレスは0x07C1Dだったのですが、移動したためその命令のある
      アドレスは0x0061Dに変更になっています。
  4. MBRデータ内のパーティション テーブル1のアドレス0x007BEと、エントリー数(パーティション テーブルの数) "4" をレジスターに設定します。
    BP=0x07BE(パーティション テーブル1のアドレス)CL=0x04(エントリー数)
    ※ パーティション テーブル1のアドレスは、MBR先頭のメモリアドレス0x00600にパーティション
      テーブル1のオフセット値(MBR先頭からのバイト数)0x01BEを加えることで算出できます。
  5. パーティション テーブルのアクティブ フラグ(先頭の1バイト)を検査します。
    その値によって処理が分かれます。
    • [アクティブ フラグが 0x80 の場合]
      アクティブ(OS起動可能)な基本パーティションであると判定。
      そのパーティション情報をセーブし、ブートセクター(パーティションの先頭セクター)の位置をパラメーターに設定して次項(残りパーティションの検査)に移ります。
    • [アクティブ フラグが 0x00 の場合]
      アクティブではない(OS起動不可)パーティションと判定。
      エントリー数(レジスターCLの値)を1つ減算します。
      エントリー数の計算結果によって次の処理を行います。
      • エントリー数が 0(アクティブな基本領域がない)の場合
        ソフトウェア割り込みINT 18H を実行して動作を停止します。
      • エントリー数が 0 以外の場合
        レジスターBPの値に0x10を加算(次のテーブル アドレスに更新)して本項を再実行(アクティブ フラグの検査を継続)します。
    • [アクティブ フラグが 0x80 でも 0x00 でもない場合]
      不正なパーティションと判定。
      "Invalid partition table" を表示して停止します。
  6. アクティブな基本パーティションを検出したら、残りパーティションのアクティブ フラグがすべて0x00であることを確認します。
    0x00以外の値があった場合は、"Invalid partition table" を表示して停止します。
  7. ※ Windowsは、唯一のアクティブな基本パーティションでないと起動できません。
  8. レジスターに下記パラメーターをセット後、INT 13H を実行してアクティブ パーティションのブートセクターをメモリアドレス "0000:7C00"にロードします。
    BX=0x7C00(ロードアドレス)AX=0x0201(1セクター読み込み)
    ※ ディスクのアクセス位置(ブートセクター)は、前々項 [アクティブ フラグが 0x80 の場合] で設定
      済みです。
  9. ロードしたブートセクター(512バイト)の末尾2バイトに、正常なブートセクターであることを示すBoot Signature(0x55AA)があることを確認します。
    ※ Boot Signature が正常でない場合、"Error loading operating system" を表示して停止します。
  10. ロードしたブートセクターの先頭位置 "0000:7C00" へジャンプします。
 これでブート ストラップ ローダーの役目は終わり、新たに0x07C00にロードされたIPLに動作が移ります。


W.2.IPL の動作

 ブート ストラップ ローダーによってロードされたブートセクター(パーティションの先頭セクター)の構成は次の通りです。

位置(offset)適用
0x0000IPLへのジャンプ命令
0x0003ディスクパラメータ、 BPB(拡張BPBを含む)
0x0054付近(※1)IPL
0x01FEboot signature
(※1) ディスクパラメーやIPLのサイズがOSの種類やパージョンによって異なるため一律ではありま
  せん。
※ 詳細は [ハードディスクの構造とパーティション] の [Y.ブートセクタ(Boot Sector)] を参照して
  下さい。

 ブートセクターにはWindowsのインストーラーによって当該Windowsをロードするためのプログラム(IPLコード)が書き込まれています。ただしWindowsのバージョン(98、NT、XP、・・・)によってその内容は異なっています。

 IPLの役目はNTFS(Windowsのファイルシステム)で管理されているNtldr(NT Loader)を検索し、ハードディスク上の記録位置(セクター)を読み取ってロードすることにあります。
 そのためIPLのサイズは大きくならざるを得ず、ブートセクター(512 バイト)のIPL領域には入り切りません。

 そこでブートセクターのIPL領域には機能の少ない小さなコードを配し、IPLの本体ともいうべき大きなサイズのコードはブートセクターに続く複数のセクターに配置して、小さなコードで大きなコードを呼び出すという手法を執っています。

 ここでは便宜上ブートセクターのプログラムを "IPL phase1"、2段目の大きなプログラムを "IPL phase2" と呼ぶ事にします。
 プログラムの動作順序は "IPL phase1" が "IPL phase2" をロードし、"IPL phase2" が "Ntldr" をロードすることになります。

 IPLの動作概要は次のようになります。
  1. IPL phase1はソフトウェア割り込み INT 13H を用いてディスク パラメーターの取得、LBA対応の確認を行います。
    ※ INT 13H はディスクへの書き込み、読み出しの外、ディスクに関する確認等を実行します。
      何を行うかはレジスター AH にセットするパラメーターで決まります。
    ※ ソフトウェア割り込みはBIOSコールとも呼ばれています。
  2. ロードアドレス(読み出したデータを格納するメモリアドレス)を "0x0D00:0x0000" に設定し、ブートセクターに続く複数のセクター(2〜7の6セクター)からIPL phase2をロードします。
    ※ ここでも INT 13H を使用します。パラメーターは次のようになります。
      AH=0x02(読み出し), AL=0x06(セクター数), BX=0x0D00(ロードアドレス),
      CL=0x02(セクター番号), ・・・・
  3. NTFSを解釈できるIPL phase2は、NTFS を参照してNtldrを検索します。
    ※ ファイル システム(NTFS)上からNtldrを発見できない、ロードできない等のエラーがあった場合は
      下記メッセージを表示して停止します。
      "A disk read error occurred NTLDR is missing ・・・"
  4. 検出したNtldrのディスク上の記録位置(セクター)を取得してレジスターにセットし、ソフトウェア割り込み INT 13H を実行してロードします。
  5. Ntldrに制御を渡します(Ntldrをロードした先頭アドレスへジャンプ)。


W.3.Ntldrの動作

【 ご注意 】
 Windows Vista以降、Windowsのローダーは Ntldr から bootmgr(Boot Manager) に代わり、ブート手順や参照・起動するファイルも以下の説明とは異なっています。


 IPL phase2によってメモリにロードされ処理を開始したNtldrは、概ね次のような動作を行います。
  1. プロセッサーの動作モードを、リアル モードからプロテクトモード(※1)に切り替えます。
  2. ルート ディレクトリに boot.ini が存在していれば、それを読み込みます。
    boot.ini に複数のOS情報が含まれていた場合、NtldrはOS選択画面を表示してユーザーの選択を一定時間待ちます。
    ※ boot.ini がルート ディレクトリに存在しない場合は、そのまま処理を続行(現在のパーティション
      からWindowsをブート)します。
  3. この時点で [F8] キーが押されると、ブート オプション選択画面を表示します。
    ブート オプションには [セーフモード]、[前回正常起動時の構成] 等があります。
    ※ 正常に起動した時のドライバの組み合わせとシステム設定が、"Last Known Good Configuration
      (前回正常起動時の構成)" として保存されています。
  4. ハードウェア検出プログラムである NTDETECT.COM をロードします。
    NTDETECT.COM はハードウェア コンポーネントのリストを集め、そのデータは最終的に HKLM\hardware キーの下に保存されます。
  5. ハードウェア プロファイルの定義が複数存在する場合、Ntldrは次のメッセージを表示してユーザーのハードウェア プロファイル選択を待ちます。
       "Hardware Profiles / Configuration Recovery"
    ハードウェア プロファイルが一つも無い場合は、この段階はスキップします。
  6. NTOSKRNL.EXE (NT OS Kernel) をロードします。
  7. HAL.DLL をロードします。
    ※ HAL.DLL(Hardware Abstraction Layer)は、ハードウェアとソフトウェアの仲立ちをします。
  8. ブートデバイスとして設定されているデバイス ドライバをロードします。
  9. ※ 全てのドライバは HKLM\SYSTEM\Service にサブキーエントリーを持っています。
      このサブキーエントリーのStart値に SERVICE_BOOT_START が設定されているドライバは、ブー
      ト時のスタートアップ デバイスとみなされます。
  10. NTOSKRNL に制御を渡します(NTOSKRNL.EXE をロードした先頭アドレスへジャンプ)。

(※1) プロテクトモード (Protected Virtual Address Mode)
 intelが 80286 以降のCPUで採用している動作モードで、大容量メモリの利用、マルチタスク、メモリ保護、特権管理等の機能を搭載しています。
 複数のプログラムが同時に稼働(マルチタスク)するようになると、他のプログラムが使用中のメモリ領域を侵害しない仕組み(メモリ保護機能)を備えることが重要で、それは保護仮想アドレスモード(Protected Virtual Address Mode)と呼ばれています。


W.4.NTOSKRNLの動作

 NTOSKRNL(NT OS Kernel)はOSの基礎となる部分を次々と構築します。この時、ディスプレイにはWindowsのロゴが表示されます。

  1. NTOSKRNL は以下のサブシステムやマネージャをロードして初期化します。
    • Object Manager
      Executive 内部でのオブジェクトの生成や管理、削除を行います。
    • Executive
      各種カーネル サービスを提供するコンポーネントの集積体です。
    • Microkernel
      カーネルの最も基本的な処理を行うコンポーネントで、スレッドのスケジューリングや割り込み及び例外処理などを行います。
    • Security Reference Monitor
      ローカルのセキュリティ ポリシーに従って、オブジェクトに対するアクセス権の検査や監査、メッセージの生成などを行います。
    • Memory Manager
      メモリシステムを管理します。
    • Cache Manager
      ディスクやネットワークの入出力を監視し、キャッシュ機能を提供します。
    • LPCS
      アプリケーションとサブシステム間の通信メカニズムを提供します。
    • I/O Manager
      ディスクやネットワークの入出力を統合的に管理します。
    • Process Manager
      プロセスの生成と終了、プロセス オブジェクトやスレッド オブジェクトのトラッキングを行います。
  2. 初期化された I/O Manager は優先順にドライバのリストを集め、順々にロードします。
  3. SMSS.EXE (Session Manager Subsystem) を起動します。
    SMSS は Winlogon, Win32 (Csrss.exe) プロセスの起動やシステム変数の設定などを行います。


W.5.Windows ブートの完成

  1. SMSS(Session Manager Subsystem)は Win32k.sys(グラフィック サブシステムを実現するデバイス ドライバ)をロードします。
  2. ロードされた Win32k.sys は直ちにスクリーンをグラフィック モードに切り替えます。
  3. サービス サブシステムは、自動起動と指定されている全てのサービスを起動します。
  4. 全てのデバイスとサービスが開始されるとブートは成功したと判断され、この時点のドライバの組み合わせとシステム設定が "Last Known Good Configuration" に保存されます。
    ※ "Last Known Good Configuration" は、新しくインストールしたデバイスが原因で起動できない
      (ブート失敗)ような状態になった場合に、正常起動できた時の設定を用いて起動させるためのもの
      です。[F8]キーによるブート オプションで使用します。
  5. サービスとして起動された Winlogon.exe によってログオン プロセスが開始され、LSASS.EXE(Local Setting Authority)に引き継がれてログオン ダイアログボックスが表示されます。


W.6.ドライブレター

 MicrosoftのOSは "アクティブな基本パーティションが必ず一つのみ存在" することが大前提となっています。

 Windowsのブートシーケンス(ブートセクターのIPL -> Ntldr -> NTOSKRNL -> ・・・)はこの領域を "Cドライブ" と認識して進行し、他の領域には以下の順序で "D" 以降のドライブ レターを割り振ります。

アクティブな基本領域 (C)論理領域非アクティブな基本領域

 Windows では
   第 1 ハードディスクのアクティブな基本パーティションを C ドライブとする
 ことが決められています。

 仮に "非アクティブな基本パーティション" や "論理パーティション" から起動するような細工をした場合、各パーティションのブートセクターのロードまではできても、その先のシーケンスでは Ntldr や NTOSKRNL といったOSロード用のファイルを Cドライブ(アクティブな基本パーティション)から読み込もうとするため、ロードに失敗するかアクティブな基本パーティションのOSが起動されてしまうことになります。

 そこで、Windows系OSのマルチブートを行うブートローダーは、選択されたパーティションをアクティブに変更する(MBR のパーティション テーブルを書き換える)機能を持っています。




≪ previous [[ ブート ストラップ - パソコンの起動 by BIOS ]] next ≫