PC・Windowsの起動についてメモ
結構前に書いたメモなので情報が古い可能性あり。
ブートストラップローダーまでの作業は機種依存。
ブートローダー起動以降はWindowsのバージョンに依存。
ここではWindows Vistaを対象としている。
☆ハードウェア主体の動作
0. CPUが主役になるまで
・実は電源オフの状態でも、コンセントに繋いでいる限りATX電源は常に5V電源(+5VSB)をマザーボードに供給している。
電源スイッチ、オンタイマー機能、LANデバイス(やPCIカード)からPME信号を検知(Wake on LAN)、などをきっかけにマザーボードはATX電源コネクタの16番ピンをGNDに接続。
16番ピンはATX電源側では+5Vに保たれているが、このピンがGNDレベルになったことを検知すると+12Vや他のラインの電源供給を始める。
・電源が入ると各デバイス・チップセットが自身を初期化(ハードウェアリセット)
・各プロセッサが自己診断(BIST : Built-In Self Test)を実行
・マルチプロセッサ(コア)環境であればOSカーネル起動までの処理を行うプロセッサ(BSP : Bootstrap Processor)を1つ決める
BSPに選ばれなかった他のプロセッサ(AP : Application Processor)はOSカーネルが有効にするまで停止。
・自作PCなどの一部のマザーボードではこの時点でCPUの異常を検知すると、安定動作する設定を読み込んでから再度リセットする。
・仕様上CPUは電源オンやリセット後、レジスタ CS.BASEをFFFF0000h EIPを0000FFF0h に設定する。
つまりCPU(BSP)はアドレス 0xFFFFFFF0h (リセットベクタ) に置かれている命令を最初に、順次実行してゆく。
このアドレスの周辺にはチップセットによってBIOS ROMがマッピングされており、通常は複数のジャンプ命令を経てPOSTに移る。
----------[BIOS]---------
1. POST
まずBIOSの初期化&診断プログラム(POST : Power-On Self Test)が実行される。
あくまでPOSTを実行するのはCPU。つまりこの時点で既にCPUが主役であり、CPU自身が動かないとPOSTも実行できない。
・割り込みベクタ、割り込みコントローラ(PIC)の設定
・BIOSが使用するメモリ(0~64KBの範囲?)の検出および簡易テストを行う(メモリを全く積んでいないとここでストップ。)
・BIOS自身に異常がないかどうか、BIOS ROMのチェックサムを確認
・RT/CMOSのチェックサムを確認
・ビデオデバイスを検出したらVGA BIOSをメモリに読み込んで実行(ビデオデバイスを初期化)
ここでディスプレイへの画面出力が始まる
・残りのメモリの簡易テストを行う
・デバイスの検出、初期化、登録
・必要ならば、個々のデバイス(例えばRAIDコントローラとか)の拡張ROM BIOSに制御を渡す
・ブート可能なデバイスを特定し、選択する
POST中にエラーが起きるとほとんどのBIOSはPOSTコードを発する。
POSTコードの通知方法はディスプレイへの表示以外にもビープ音、音声メッセージ、マザーボード上の7セグメントLED、電源/HDDアクセスランプやキーボードのLEDの点灯点滅などがあり、機種によってさまざま。
2. MBRを読み取る
BIOSが起動デバイスの先頭にMBR(Master Boot Record)があることを確認、これを読み取ってメモリに格納する。
3. ブートストラップローダーを起動
メモリに格納されたMBR内にあるブートストラップローダーに制御を移す。BIOSがメインとなる作業はここで終わる。
----[ブートストラップローダー]----
4. パーティションテーブルを探索
ブートストラップローダは同じMBR内のパーティションテーブルを参照し、アクティブのフラグが立っているパーティションを探す。
そしてアクティブパーティションのブートセクタにあるブートローダーを実行する。
ブートローダーは利用するOSによって異なる。
☆Windowsが主体の動作
---[Windowsブートマネージャー]---
1. Windowsブートマネージャー(Bootmgr)の処理
まずはブート構成データストア(BCD : Boot Configuration Data)の内容を読み取る。ここで必要に応じてブートメニューを表示。
ユーザーの選択によって次のように分岐
Windowsを通常起動する場合
- %SystemRoot%\System32フォルダーからOSローダー(Winload.exe)を起動
Windowsを休止状態から再開する場合
- Winresume.exeが実行され、以前の環境が復元される。
「以前のバージョンのWindows」を選択した場合
- Ntldr(Windows XP以前のブートローダー)に制御を移す
--------[windows]--------
2. OSローダー(Winload.exe)の処理(通常起動時)
・まずカーネルの実行やデバッグに必要となるファイル Bootvid.dll, Ntoskrnl.exe, Hal.dll, Kdcom.dll, Ci.dll, Clfs.sys, Pshed.dllなどを読み込む
・レジストリハイブ(SYSTEM)や最小限必要なドライバーを読み込む
・Ntoskrnl.exeに制御を移す
3. カーネル(Ntoskrnl.exe)を実行
・デバイスの制御をHal.dllに任せる
・ドライバーの検証ツールを初期化
・カーネルデバッガーを起動(kdcom.dll, ブートオプションで指定があった場合のみ)
・System Idle Processを生成
・Windowsロード中の画面を表示(Bootvid.dll)
・Winload.exeを通してレジストリハイブ(HARDWARE ,SYSTEM)が読み込まれる
・各種システムデバイスを初期化
・デバイスドライバーを初期化
・Windowsセッションマネージャー(Smss.exe)を起動
4. Windowsセッションマネージャー(Smss.exe)を実行
・必要に応じてチェックディスクを実行(Autochk.exe)
・Windows更新プログラムやサービスパック、その他インストーラーの後処理(ファイルの変更や削除など)
・仮想記憶のページファイルを作成
・レジストリハイブ(SAM, SECURITY, SOFTWARE)や登録済みのDLLを読み込む。
・画面モードをVGAモード(テキストモード)からOSやドライバーが指定する解像度(グラフィックモード)に切り替える
5. Smss.exeが複数のCsrss.exeを起動することでセッション 0(カーネルモード空間)とセッション 1、2、…(ユーザーモード空間)を作成
セッション 0でWindowsスタートアップアプリケーション(Wininit.exe)を起動。
さらにWininit.exeがログオンに必要となるローカルセキュリティ機関(Lsass.exe)、サービスコントロールマネージャー(Services.exe)を起動。
また、ローカルセッションマネージャー(Lsm.exe)も起動する。
その間に別セッションでWinlogon.exeを起動。まもなくログオンできる状態になる。
6. ログオンプロセス(Winlogon.exe)の処理
・LogonUI.exe(ログオン画面を表示するプログラム)を実行。
ここでユーザーが入力したユーザー名とパスワードは別セッション(セッション 0)上のLsass.exeで認証確認される。
・認証に成功したら、ログオン中のユーザーのレジストリ(HKCU)を読み込む
・Userinit.exeを実行
7. ログオン後の処理(Userinit.exe)
・スタートアッププロセスの起動など
・HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shellに指定されているシェル(通常はexplorer.exe)を起動
(必ずしもシェルが最後に起動するとは限らない。プロセスの起動順序はWindowsが自動で決定。)
これにてWindowsの起動シークエンスは終わり