WindowsをインストールしたMBRやブートセクターには、Microsoftのブートローダーが書き込まれています。システムBIOSがメモリの0x07C00にMBRをロードしCPUの制御が渡されると、Windowsの起動がスタートします。その動作シーケンスは概ね下図のようになります。
システムBIOSがロードしたMBRの構成は次のようになっています。
位置(offset) | 適用 | サイズ(バイト) |
0x0000 | Boot Strap Loader | 446 |
0x01BE | パーティション テーブル1 | 16 |
0x01CE | パーティション テーブル 2 | 16 |
0x01DE | パーティション テーブル 3 | 16 |
0x01EE | パーティション テーブル 4 | 16 |
0x01FE | boot signature | 2 |
MBR(Master Boot Recode)の先頭446バイトの領域は、ブート ストラップ ローダー(Boot Strap Loader)を置く領域となっています。
ブート ストラップ ローダーは、一緒にロードされたMBR内にあるパーティション テーブルを参照してアクティブ(OS起動可能)なパーティションを検出し、そのパーティションのブートセクターをロードする役目を担います。
システムBIOSの far ジャンプによって動作を開始したブート ストラップ ローダーは、概ね下記のような処理を実行します。
- メモリ上の0x07C00から始まる512バイト(システムBIOSにロードされたMBR自身)を、0x00600を先頭とする領域に移動します。
(0x07C00以降をブートセクターのロード用に空けておきます)
- 次処理用の命令があるアドレス0x0061Dへジャンプします。
- MBRデータ内のパーティション テーブル1のアドレス0x007BEと、エントリー数(パーティション テーブルの数) "4" をレジスターに設定します。
BP=0x07BE(パーティション テーブル1のアドレス) | CL=0x04(エントリー数) |
- パーティション テーブルのアクティブ フラグ(先頭の1バイト)を検査します。
その値によって処理が分かれます。
- [アクティブ フラグが 0x80 の場合]
アクティブ(OS起動可能)な基本パーティションであると判定。
そのパーティション情報をセーブし、ブートセクター(パーティションの先頭セクター)の位置をパラメーターに設定して次項(残りパーティションの検査)に移ります。
- [アクティブ フラグが 0x00 の場合]
アクティブではない(OS起動不可)パーティションと判定。
エントリー数(レジスターCLの値)を1つ減算します。
エントリー数の計算結果によって次の処理を行います。
- エントリー数が 0(アクティブな基本領域がない)の場合
ソフトウェア割り込みINT 18H を実行して動作を停止します。
- エントリー数が 0 以外の場合
レジスターBPの値に0x10を加算(次のテーブル アドレスに更新)して本項を再実行(アクティブ フラグの検査を継続)します。
- [アクティブ フラグが 0x80 でも 0x00 でもない場合]
不正なパーティションと判定。
"Invalid partition table" を表示して停止します。
- アクティブな基本パーティションを検出したら、残りパーティションのアクティブ フラグがすべて0x00であることを確認します。
0x00以外の値があった場合は、"Invalid partition table" を表示して停止します。
- レジスターに下記パラメーターをセット後、INT 13H を実行してアクティブ パーティションのブートセクターをメモリアドレス "0000:7C00"にロードします。
BX=0x7C00(ロードアドレス) | AX=0x0201(1セクター読み込み) |
- ロードしたブートセクター(512バイト)の末尾2バイトに、正常なブートセクターであることを示すBoot Signature(0x55AA)があることを確認します。
- ロードしたブートセクターの先頭位置 "0000:7C00" へジャンプします。
これでブート ストラップ ローダーの役目は終わり、新たに0x07C00にロードされたIPLに動作が移ります。
ブート ストラップ ローダーによってロードされたブートセクター(パーティションの先頭セクター)の構成は次の通りです。
位置(offset) | 適用 |
0x0000 | IPLへのジャンプ命令 |
0x0003 | ディスクパラメータ、 BPB(拡張BPBを含む) |
0x0054付近(※1) | IPL
|
0x01FE | boot signature |
ブートセクターには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の動作概要は次のようになります。
- IPL phase1はソフトウェア割り込み INT 13H を用いてディスク パラメーターの取得、LBA対応の確認を行います。
- ロードアドレス(読み出したデータを格納するメモリアドレス)を "0x0D00:0x0000" に設定し、ブートセクターに続く複数のセクター(2〜7の6セクター)からIPL phase2をロードします。
- NTFSを解釈できるIPL phase2は、NTFS を参照してNtldrを検索します。
- 検出したNtldrのディスク上の記録位置(セクター)を取得してレジスターにセットし、ソフトウェア割り込み INT 13H を実行してロードします。
- Ntldrに制御を渡します(Ntldrをロードした先頭アドレスへジャンプ)。
IPL phase2によってメモリにロードされ処理を開始したNtldrは、概ね次のような動作を行います。
- プロセッサーの動作モードを、リアル モードからプロテクトモード(※1)に切り替えます。
- ルート ディレクトリに boot.ini が存在していれば、それを読み込みます。
boot.ini に複数のOS情報が含まれていた場合、NtldrはOS選択画面を表示してユーザーの選択を一定時間待ちます。
- この時点で [F8] キーが押されると、ブート オプション選択画面を表示します。
ブート オプションには [セーフモード]、[前回正常起動時の構成] 等があります。
- ハードウェア検出プログラムである NTDETECT.COM をロードします。
NTDETECT.COM はハードウェア コンポーネントのリストを集め、そのデータは最終的に HKLM\hardware キーの下に保存されます。
- ハードウェア プロファイルの定義が複数存在する場合、Ntldrは次のメッセージを表示してユーザーのハードウェア プロファイル選択を待ちます。
"Hardware Profiles / Configuration Recovery"
ハードウェア プロファイルが一つも無い場合は、この段階はスキップします。
- NTOSKRNL.EXE (NT OS Kernel) をロードします。
- HAL.DLL をロードします。
- ブートデバイスとして設定されているデバイス ドライバをロードします。
- NTOSKRNL に制御を渡します(NTOSKRNL.EXE をロードした先頭アドレスへジャンプ)。
NTOSKRNL(NT OS Kernel)はOSの基礎となる部分を次々と構築します。この時、ディスプレイにはWindowsのロゴが表示されます。
- NTOSKRNL は以下のサブシステムやマネージャをロードして初期化します。
- Object Manager
Executive 内部でのオブジェクトの生成や管理、削除を行います。
- Executive
各種カーネル サービスを提供するコンポーネントの集積体です。
- Microkernel
カーネルの最も基本的な処理を行うコンポーネントで、スレッドのスケジューリングや割り込み及び例外処理などを行います。
- Security Reference Monitor
ローカルのセキュリティ ポリシーに従って、オブジェクトに対するアクセス権の検査や監査、メッセージの生成などを行います。
- Memory Manager
メモリシステムを管理します。
- Cache Manager
ディスクやネットワークの入出力を監視し、キャッシュ機能を提供します。
- LPCS
アプリケーションとサブシステム間の通信メカニズムを提供します。
- I/O Manager
ディスクやネットワークの入出力を統合的に管理します。
- Process Manager
プロセスの生成と終了、プロセス オブジェクトやスレッド オブジェクトのトラッキングを行います。
- 初期化された I/O Manager は優先順にドライバのリストを集め、順々にロードします。
- SMSS.EXE (Session Manager Subsystem) を起動します。
SMSS は Winlogon, Win32 (Csrss.exe) プロセスの起動やシステム変数の設定などを行います。
- SMSS(Session Manager Subsystem)は Win32k.sys(グラフィック サブシステムを実現するデバイス ドライバ)をロードします。
- ロードされた Win32k.sys は直ちにスクリーンをグラフィック モードに切り替えます。
- サービス サブシステムは、自動起動と指定されている全てのサービスを起動します。
- 全てのデバイスとサービスが開始されるとブートは成功したと判断され、この時点のドライバの組み合わせとシステム設定が "Last Known Good Configuration" に保存されます。
- サービスとして起動された Winlogon.exe によってログオン プロセスが開始され、LSASS.EXE(Local Setting Authority)に引き継がれてログオン ダイアログボックスが表示されます。
MicrosoftのOSは "
アクティブな基本パーティションが必ず一つのみ存在" することが大前提となっています。
Windowsのブートシーケンス(ブートセクターのIPL -> Ntldr -> NTOSKRNL -> ・・・)はこの領域を "Cドライブ" と認識して進行し、他の領域には以下の順序で "D" 以降のドライブ レターを割り振ります。
アクティブな基本領域 (C) | | 論理領域 | | 非アクティブな基本領域 |
仮に "非アクティブな基本パーティション" や "論理パーティション" から起動するような細工をした場合、各パーティションのブートセクターのロードまではできても、その先のシーケンスでは Ntldr や NTOSKRNL といったOSロード用のファイルを Cドライブ(アクティブな基本パーティション)から読み込もうとするため、ロードに失敗するかアクティブな基本パーティションのOSが起動されてしまうことになります。
そこで、Windows系OSのマルチブートを行うブートローダーは、選択されたパーティションをアクティブに変更する(MBR のパーティション テーブルを書き換える)機能を持っています。
して下さい。