WindowsXPのブートプロセス


WindowsXPのブートプロセス、PCのスイッチを入れてからユーザログオ ンが終了するまでの話を多少詳しく説明しています。
この記事にはプロセッサという言葉が何度か出てくると思います。コンピュータはプロセッサの集合体です、必ずしもCPUを意味していません。

    PCの電源スイッチを入れる。

      スイッチが入るとPC内の電源(部品)はセルフテストを行い、電圧と電流が一定レベルに到達していることを確認するセルフテストを実行します。この結果が満足されるものであれば、電源はタイマーチップ・マイクロプロセッサに対し”Power Good”というシグナルを送ります。

    タイマーチップ・マイクロプロセッサが”Power Good”シグナルを受けとる。

      PCのスイッチを入れると、電源のセルフテストにかかわらずパワーはコンピュータ内にいきわたります。そこで、CPUは起動処理を開始しようとするのです が、電源のセルフテストが終了していません。それまでCPUの行動を制御するためタイマーチップはCPUにリセットシグナルを送り続けています。タイマー チップは"PowerGood"シグナルを受け取ると、CPUに対するリセットシグナルの送信を停止します。制御を解放されたCPUは起動処理に入りま す。

    CPUはROM BIOSコードの実行を開始する。

      CPUはROMメモリの先頭から16byteのROM BIOSをロードします。これにはBIOSコードがメモリの何処にあるかという実際のメモリアドレスと、そこにジャンプするようにという指示が含まれてい ます。

    ROM BIOSは主要なハードウェアの基本機能検証のためベーシックテストを実行する。

      ブートプロセス中のこの段階でエラーが発生した場合はビープ音が鳴ります。これは、ビデオサブシステムが未だ初期化されていないためです。ビープ音の鳴り 方は"Beep Code"で定められていて、鳴り方でエラーの内容が解ります。

    ROM BIOSはハードウェア固有のROM BIOS ルーチンをロードする必要のあるアダプタを検索する。

      ビデオアダプターはアダプターROM BIOSの最も一般的なソースを提供しています。スタートアップBIOSルーチンはビデオROMを見つけるために、メモリをスキャンします。いかなるアダ プターROMのローディングエラーも、以下の形で表示されます。
        XXXX ROM ERROR
      XXXXは、失敗したモジュールのセグメント・アドレスを表わしています。

    ROM BIOSは、現在の起動が"Cold-Start"か"Warm-Start"かをチェックする。

      この記事は、「PCのスイッチを入れる」ところから始まっていますが、このように電源OFFの状態からの起動をCold-Startと呼びます。他方、起 動していたOSを再起動させるような場合をWarm-Startと呼びます。Cold-StartかWarm-Startかを判別するためにROM BIOS スタートアップルーチンはメモリの 0000:0472 に位置する2バイトの値をチェックします。この値が1234h(16進数で1234)であればWarm-Start、それ以外の値であればCold- Startと判定されます。

    POST(Power On Self Test)の実行。

      POSTは三つのコンポーネント(ビデオテスト、BIOS同定、メモリテスト)より構成されています。Cold-Startの場合はPOSTの全てのテス トが実行されます。Warm−Startの場合はメモリテストは省略されます。
      ビデオテストはビデオアダプタを初期化し、ビデオカードとビデオメモリをテストします。そして、設定情報とあらゆるエラーを表示します。
      BIOS同定はBIOSのバージョン、製作者、日付を表示します。
      メモリテストはメモリチップをテストし搭載されているメモリの稼動しているメモリの合計を表示します。

      【補足】コンピュータを起動直後にメモリカウントがモニタ上に表示されますが、それがこの段階です。

      POSTの間に発生したエラーは”Fatal(致命的)”もしくは”non-Fatal (非致命的)”に分類されます。”non-Fatal”エラーの場合はスクリーン上にエ ラーメッセージが表示されます。そして、システムのブートプロセスは継続を許可されています。
      一方、”Fatal”エラーはコンピュータのブートプロセスを停止します。そして、” Beep Code”に基づくビープ音でエラーの発生を報告してきます。

    CMOS設定情報の読み込み。

      CMOS(Complementary Metal-Oxide Semiconductor 相補性金属酸化膜半導体)はマザーボード上に存在する64バイトの小さなメモリ領域で、マザーボード上のボタン電池によって情報は維持されています。 CMOSの設定情報には、マシンにインストールされているディスクの種類、起動時にパスワードが必要か否か、PCの起動にはどのデバイス(フロッピーディ スク、ハードディスク等)が必要か等です。ROM BIOS スタートアップルーチンのために重要なことはCMOSがOSのために検証されるべきドライブの順番を指示することです。

      【余談】BIOSパスワードを設定して、そのパスワードを忘れた場合、OSの起動が出来ません。こういう場合CMOSをリフレッシュすると設定が初期設定 に戻りOSを起動することが出来ます。

ハードディスク
    最初のブータブルディスク(ブート可能なディスク)がハードディスクの場合、 BIOSはディスクの先頭セクタでマスターブートレコード(MBR)を検査します。
    最初のブータブルディスクがフロッピーディスクの場合、BIOSは先頭セクタでブートレコードを探します。

      ハードディスク上で、MBRはシリンダ 0、ヘッド 0、セクタ 1 の先頭セクタを占有しています。そのサイズは512バイトです。このセクタが発見されると、MBRはメモリアドレス 0000:7C00 のメモリ中にロードされ、シグネチャの正当性テストが行われます。正当なシグネチャは末尾2バイトが55AAh(16進数で55AA)の値を持っていま す。MBRがぶっ飛んでいたり、シグネチャが不正な値だった場合、以下のエラーメッセージが表示され、ブートプロセスは停止します。
        NO ROM BASIC - SYSTEM HALTED
      MBRは二つの部分より構成されています。
      1)パーティションテーブル : ハードディスクのレイアウトを記述しています。
      2)パーティションローダーコード : ブートプロセスの継続指示を含んでいます。

マスターブートレコード(MBR)
    512バイトのMBRの大部分はパーティションローダーコードで占められています。正当なMBRがメモリにロードされるとBIOSトランスファはパーティ ションローダーコードのためにブートプロセスを制御します。

      一台のPC上に複数のOSがインストールされている場合(マルチブートといいます)、プロセスは次の段階でロードするハードディスクをユーザに選択させる 必要があります。そこで通常はオリジナルのパーティションローダコードをブートローダプログラムで置き換えます。

パーティションテーブル
    パーティションローダ(もしくはブートローダ)はパーティションテーブル中にアクティブパーティションを検査します。次にパーティションローダはアクティ ブパーティションの先頭セクタにブートレコードを検索します。

      アクティブパーティションというのはOSをブートできる領域のことで、ハードディスクに必ず一つだけ存在していなければなりません。ハードディスクパー ティションの話もいつか書くこともあろうかと思います。

      ブートレコードも512バイトで、パーティションの特徴(単位セクタ当たりのバイト数、単位クラスタ当たりのセクタ数等)を記述しているテーブルを含んで います。また、OSファイル群の先頭にあるIO.SYSへのジャンプコードも含んでいます。
      IO.SYSというファイルは基本的なハードウェアの入出力(ディスプレイへの出力、ディスクの入出力やキーボードからの入力等)を担当しているファイル です。

オペレーティングシステム

ブートレコード
    アクティブパーティションのブートレコードはシグネチャの正当性に関しチェックされます。正当性が確認されると、ブートセクタコードはプログラムとして実 行されます。

      WindowsXPのローディングはNTLDRと呼ばれるファイルによって制御されています。NTLDRは隠し属性のシステムファイルで、システムパー ティションのルートディレクトリ中に存在しています。
      NTLDRはXPを4段階でロードしていきます。

      1) ブートローダフェーズの初期化
      2) オペレーティングシステムの選択
      3) ハードウェア検知
      4) ハードウェアプロファイル設定の選択

NTLDR − 初期化フェーズ
    初期化フェーズの間、NTLDRはプロセッサをリアルモードからプロテクトモードに切り替えます。プロセッサは32ビットメモリモードになり、必要なデー タをできるだけ迅速に入手できるようにする方法であるメモリページングがオンになります。次に、適切にフォーマットされたファイルシステム(但し、XPに よってサポートされていること)からファイルのロードをNTLDRに許可するために、適切なミニファイルシステムドライバがロードされます。

      WindowsXPがサポートしているパーティションフォーマットは FAT-16、FAT-32、NTFSです。

NTLDR − BOOT.INIによるOS選択
    ルートディレクトリ中にBOOT.INIが存在すると、NTLDRはBOOT.INIの内容をメモリ中に読み込みます。BOOT.INIに複数のOSの情 報が含まれていると(デュアルブート、マルチブートと呼ばれる状態です)、NTLDRはこの時点でブートシークエンスを停止し、OS選択画面をユーザに表 示し、ユーザにOSを選択させるため一定時間待ちます。

      BOOT.INIファイルがルートディレクトリ中に存在しない場合、NTLDRは最初のディスクの最初のパーティション(通常は、C:\)からXPをロー ドするためブートシークエンスを続行します。

F8キー
    ロードされているOSがWindows NT、2000、XPの場合であれば、ブートシークエンスのこの時点でF8キーを押すとブートオプション選択画面が表示されます。ブートオプションには "Safe Mode" や "Last Known Good Configuration" 等が存在しています。

      OSのブートシークエンスが成功すると、XPは現在のドライバの組み合わせとシステム設定をコピーし、"Last Known Good Configuration" として、この設定を保存します。
      "Last Known Good Configuration" として保存された設定は、新しいデバイスのインストレーションがブートの失敗を発生させた場合に、代わりにそのシステムをブートするために使用されます。

NTLDR − ハードウェア検出
    選択されたOSがXPであれば、NTLDRはハードウェア検出プログラムであるNTDETECT.COM(DOSベースのプログラム)をロードしてブート プロセスを続行します。

      NTDETECT.COMは現在インストールされているハードウェアコンポーネントのリストを集めます。ここで集められたハードウェアコンポーネントのリ ストは最終的にレジストリのHKEY_LOCAL_MACHINE\HARDWARE キーの下に戻されます。

NTLDR − ハードウェアプロファイルの選択
    ハードウェアプロファイルの定義が複数存在する場合、NTLDRはユーザにハードウェアプロファイルを選択させるため "Hardware Profiles/Configuration Recovery" メニューを表示します。

      様々なハードウェア構成でブートを行うと、複数のハードウェアプロファイルが作成されます。XPでは、「システムのプロパティ」のハードウェア タブを開 きハードウェアプロファイルのボタンをクリックするとダイアログボックスが開き「利用できるハードウェアプロファイル」の一覧が表示されます。
      ハードウェアプロファイル画面の「ハードウェアプロファイルの選択」セクションで「ハードウェアプロファイルをユーザーが選択するまで待つ」を選択する と、起動時の"Hardware Profiles/Configuration Recovery" メニューでハードウェアプロファイルを選択するまでWindows XPは起動しなくなります。

      ハードウェアプロファイルが一つも無い場合は、NTLDRはこの段階をスキップします。当然メニューは表示されません。

Kernelのロード
    ハードウェアプロファイルを選択後(必要に応じてではありますが)、NTLDRはXP Kernel (NTOSKRNL.EXE)のロードを開始します。

      Kernelの初期化が完了するまで、NTLDRは依然としてコンピュータの制御を維持しています。スクリーンはクリアされ、画面下の方では白い矩形の進 行表示が行われています。この時点で、NTLDRはハードウェアからKernelを隔離するHAL.DLL(Hardware Abstraction Layer :  アプリケーションソフトとハードウェアの間に入り、ハードウェアごとの挙動の違いを吸収するソフトウェア)をロードする。
      両方のファイル共に \system32 ディレクトリ上に存在する。

NTLDR − ブートデバイスドライバ
    NTLDRはブートデバイスの印がつけられているデバイスドライバをここでロードします。これらドライバのローディングで、NTLDRはコンピュータに対 する制御を放棄します。

      全てのドライバはレジストリのHKEY_LOCAL_MACHINE\SYSTEM\Servicesにサブキーエントリを持っています。このサブキーエ ントリのStart値にSERVICE_BOOT_STARTが設定されているドライバはブート時にスタートアップデバイスとみなされます。

Kernel(NTOSKRNL.EXE)の初期化
    NTOSKRNLはブートプロセス中に2段階で仕事をします。それぞれの段階をフェーズ0、フェーズ1と呼びます。フェーズ0はマイクロカーネルとエクゼ クティブサブシステムを初期化する段階です。エグゼクティブサブシステムは初期化の完成のために要求される基本サービスを利用可能にします。この時点で、 システムはローディング状況を示すステータスバーの付いたグラフィカルスクリーンとなります。

      XPはフェーズ0の間割り込みを無効にしています。フェーズ1の直前に割り込みは有効化されます。HAL(Hardware Abstraction Layer)は割り込みコントローラを準備するために呼び出されます。メモリマネージャ、オブジェクトマネージャ、セキュリティ リファレンス モニタ、プロセスマネージャが初期化されます。

      フェーズ1はHALがデバイスからの割り込みを受け入れるために呼び出された時に開始します。もしもプロセッサが二つある場合、追加されたプロセッサはこ の時点で初期化されます。全てのエグゼクティブサブシステムは以下の順で再初期化されます。

      1) Object Manager(オブジェクトマネージャ)
        Executive内部は各コンポーネントがオブジェクト指向で作成されています。Executive内部でのオブジェクトの生成や管理、削除などを行い ます。
      2) Executive(エグゼクティブ)
        各種のカーネルサービスを提供するコンポーネントの集積体です。
      3) Microkernel(マイクロカーネル)
        HALの直上にあります(ハードディスクとマイクロカーネルの間にHALが入ります)。カーネルの最も基本的な処理を行うコンポーネントでスレッドのスケ ジューリングや割り込みおよび例外の処理などを行います。
      4) Security Reference Monitor(セキュリティレファレンスモニタ)
        ローカルのセキュリティポリシーに従って、オブジェクトに対するアクセス権の検査や監査、メッセージの生成などを行います。
      5) Memory Manager(メモリマネージャ)
        メモリシステムを管理するコンポーネントです。メモリマネージャの働きによりOS上で実行される各プロセスは数ギガバイト(32bit)という広大なメモ リ空間を利用できるようになります。
      6) Cache Manager(キャッシュマネージャ)
        カーネルの上位に位置するソフトウェアから見て、I/Oマネージャ内の最上位に位置しているのがキャッシュマネージャです。キャッシュマネージャはファイ ル入出力速度の高速化やハードディスクやネットワーク入出力システム全体に対するファイル入出力を監視し、キャッシュ機能を提供します。
      7) LPCS
        OS上で実行されるアプリケーションと環境サブシステムは、クライアントとサーバの関係にあります。この二つの間でメッセージを交換することでアプリケー ションからサブシステムへの要求や、それに対する応答をやり取りできるようにしています。このようなアプリケーションと環境サブシステムの通信メカニズム を提供しているのがLPCSです。
      8) I/O Manager(I/Oマネージャ)
        ディスクI/OやネットワークI/Oなど入出力を統合的に管理するコンポーネントです。
      9) Process Manager(プロセスマネージャ)
        プロセスの生成と終了およびプロセスオブジェクトやスレッドオブジェクトのトラッキングを受け持っています。
      【余談】フリーズした時、PCのスイッチ長押ししてシャットダウンした後の起動などで、NTOSKRNLが壊れている等と表示され起動できない場合があり ます。このようなときの処置はこちらを参照してください。
      http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B882569

I/O マネージャ
    I/Oマネージャの初期化は全てのシステムドライバファイルのロードプロセスを開始します。このプロセスは、NTLDRが制御を解放した場所から始まり、 まずブートデバイスのロードを終了します。続いて、優先順にドライバのリストを集め、順々にロードしていきます。

      NT上でのドライバのロードの失敗は再起動が行われ、"Last Known Good Configuration" に保存されている値を使用してシステムの開始を試みられます。

SMSS
    Kernelのフェーズ1初期化の最後の仕事が Session Manager Subsystem(SMSS、セッションマネージャサブシステム)を起動することです。SMSSは可視的インターフェースを用意し、ユーザモード環境を 作成します。

      SMSSはユーザモードで稼動しますが、他のユーザモードアプリケーションと異なりSMSSはOSの信頼される部分として考慮されるネイティブアプリケー ション(コア エグゼクティブ機能だけを使用します)です。SMSS.EXE はユーザーセッションの起動を担当しています。システムスレッドにより起動され、Winlogon および Win32(Csrss.exe)プロセスの起動やシステム変数の設定を含む様々な設定を行います。SMSS.EXEはユーザプロセスを起動後、 Winlogon と Csrss のどちらかが終了すれば、シャットダウンを行います。

Win32k.sys
    SMSSはWin32グラフィックサブシステムを実現するWin32k.sysデバイスドライバをロードします。

      Win32k.sysは開始すると直ちにスクリーンをグラフィックモードに切り替えます。サービスサブシステムは、この時点で自動起動として指定されてい る全てのサービスを起動します。全てのデバイスとサービスが開始されるとブートは成功したと判断され、この時点での設定が "Last Known Good Configuration" に保存されます。

ログオン
    XPのブートプロセス自体はユーザがシステムへのログオンが成功するまで完了とはなりません。ログオンプロセスはKernelによってサービスとして起動 されたWINLOGON.EXEによって開始され、Local Setting Authority(LSASS.EXE)に引き継がれログオンダイアログボックスが表示されます。

      ログオンダイアログボックスはサービスサブシステムがネットワークサービスを開始する時点で表示されます。この辺の部分がシステムとユーザの相互作用とい う毎日行われる様々な基本的・内部的仕事の多くの要素を持っているのですが、資料が殆ど見当たりませんので割愛します。