 琳達!你的電腦開機到底要開到什麼時候啊?你該升級 CPU 和增加記憶體了。各位讀者,別急躁!連續劇的最終結局總是大家急於知道的,而你們今天也終於可看到 W2K 成功完成開機流程的全貌了。 接下來我們就來繼續探討 W2K 機的核心初始化階段: |
核心初始化階段(Kernel Initiation Phase) |
- 建立HARDWARE註冊機碼(Creating the HARDWARE Registry key)
- 複製Current Control Set 註冊機碼(Creating Clone Current Control Set)
- 裝置驅動程式的載入和初始化(Loading and Initializing Device Drivers)
- 啟動服務(Starting Services)
|
在核心初始化階段的開始,微軟 W2K 作業系統的標幟就會顯示在螢幕上。 |
|
建立HARDWARE 註冊機碼(Creating the HARDWARE Registry key) |
根據 Ntdetect.com 在開機載入階段(Boot Loader Phase)回報給 NTLDR 的硬體清單資料,在註冊機碼(Registry)資料庫中建立 HKEY_LOCAL_MACHINE\HARDWARE 之階層架構(如下圖所示),在 HARDWARE 架構下存放著電腦中有關實體硬體相關資訊,例如系統主機板上的硬體組件、特定硬體設備的中斷控制、系統資源的分配情形等。 |
 |
當你執行 Regedit.exe(註冊機碼編輯器)所看到的整個註冊機碼樹狀架構,其實在 \WINNT\system32\config 目錄下都有相對的檔案來儲存其資料(如下圖所示),而 HKEY_LOCAL_MACHINE\HARDWARE 機碼下所有階層的資料,則是每次開機時由 Ntdetect.com 收集硬體資料後轉交 NTLDR 重建該階層架構下的所有數據,因此對其做任何修改也是沒有意義,故其在 \WINNT\system32\config 也沒有對應的檔案來儲存該階層架構下的數據。 |
 |
 在 \WINNT\system32\config 目錄中的這些檔案是否只要備份起來後,當這些檔案損毀或遺失了,就可直接還原到這個目錄即可? |
|
|
複製Current Control Set註冊機碼(Creating Clone Current Control Set) |
核心初始化階段的第二項工作就是將 NTLDR 所載入的控制集(即 CurrentControlSet)複製一份起來,這份複製的資料不會去做任何的修改,只是保留到登錄階段(Logon Phase)時使用,當使用者成功開機登入後,則這個複製的控制集將一無所用,也因此當你登入 W2K 作業系統後,根本在註冊機碼的樹狀架構中看不到這個複製的控制集。 |
|
裝置驅動程式的載入和初始化(Loading and Initializing Device Drivers) |
將 W2K 核心程式和在核心載入階段(Kernel Load Phase)載入的低階裝置驅動程式正式初始化(Initialize)啟動,接下來核心程式(Kernel)搜尋 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 註冊機碼下所有的裝置驅動程式及服務,並載入 [Start] 值為 1 的裝置驅動程式,例如網路協定(Network Protocol),這些裝置驅動程式一載入記憶體便做初始化的動作,如果有錯誤發生,核心程式將會根據該裝置驅動程式下所定義的 [ErrorControl] 值來決定接下來的處理動作為何?如下圖所示: |
 |
接下來我們來看看不同的 [ErrorControl] 值會採取的動作是什麼? |
ErrorControl |
說 明 |
0 = Ingore |
假如此裝置驅動程式或服務無法載入或初始化時,並不顯示任何的錯誤訊息繼續往下執行開機流程 |
1 = Normal |
假如此裝置驅動程式或服務無法載入或初始化時,則會顯示錯誤訊息及將該錯誤記錄在事件檢視器(Event Viewer)中的系統記錄(System Log),但仍會繼續往下執行開機流程 |
2 = Severe |
當此裝置驅動程式或服務在啟動時發生錯誤,表示對系統開機過程來講是一個嚴重的錯誤,故其會將該錯誤記錄在事件檢視器中的系統記錄,然後重新開機利用 LastKnownGood 控制集進行開機流程,如果開機流程已是利用 LastKnownGood 開機,則忽略所發生的錯誤並繼續往下執行開機流程,但仍然會將錯誤記錄在事件檢視器。 |
3 = Critical |
當此裝置驅動程式或服務在啟動時發生錯誤,表示對系統開機過程來講是一個關鍵性的錯誤,故其會將該錯誤記錄在事件檢視器中的系統記錄,然後重新開機利用 LastKnownGood 控制集進行開機流程,如果開機流程已是利用 LastKnownGood 開機,則停止往下執行開機流程並顯示錯誤訊息。 |
|
|
啟動服務(Starting Services) |
當核心程式載入並啟動低階裝置驅動程式(Low-Level Device Drivers)後,則會話管理員(Session Manager)程式 - Smss.exe 將會啟動,會話管理員的資訊都記載在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 註冊機碼中,其中定義了在載入服務之前要執行那些程式,並透過會話管理員來啟動高階子系統(Higher-Order Subsystems)和服務、Win32 子系統程式(控制所有的 I/O 裝置和螢幕的顯示) - Csrss.exe,及建立分頁檔(Page File)等動作。 |
|
接下來我們就詳細研究一下會話管理員(Session Manager)到底處理了那些事情,並可從那裡看到蛛絲馬跡。首先我們先來看看會話管理員在載入服務之前要先執行那些程式,這是定義在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 下的 BootExecute 項目(如下圖所示),其預設值是 "autocheck autocheck *",但可定義超過一個以上的程式,下圖即為一例。 |
 |
autocheck 這支程式主要功能是在開機時會對所有的硬碟分割區進行檢查的動作,如果發現某分割區有問題(例如:可能是上一次不正常停機所造成資料的寫入錯誤),則會對該分割區執行 chkdsk /f 的動作,以修復分割區上的錯誤。所以當系統開機發現分割區上資料有問題時,則你會在這個階段看見類似如下畫面所顯示的訊息: |
 |
當會話管理員執行完 BootExecute 項目所指定的程式後,W2K 核心程式將會從 \WINNT\system32\config 目錄下載入其他的註冊機碼。接下來會話管理員就會執行以下幾個動作,而這些動作都有定義在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 下的子機碼中: |
|
- 建立符號連結(Create Symbolic Link)
會話管理員將會根據 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 下的 [DOS Devices] 機碼中所定義的資訊建立符號連結(Symbolic Links),所謂符號連結指的是用一簡單的"符號名稱"來代表一個檔案系統下的裝置元件,通常用在命令提示字元(Command Prompt)環境下。以下圖為例:我們用 "PRN" 來代表安裝在我們電腦上LPT1 埠的印表機,因此當我們在命令提示字元環境下可輸入 "copy qoo.txt prn" 時,即代表將 qoo.txt 列印到電腦 LPT1 埠所連接到的印表機裝置上。
|
- 建立系統環境變數(Create System Environment Variables)
接下來再根據 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 下的 [Environment] 機碼中所定義的資訊建立系統環境變數(如下圖所示)。
|
- 建立虛擬記憶體 - 分頁檔(Create Virtual Memory - Page File)
會話管理員會根據 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 下的 [Memory Management] 機碼中所定義的資訊建立分頁檔(Page File)- pagefile.sys,如下圖所示。
|
- 啟動 Windows 子系統 - \WINNT\System32\Win32k.sys 和 \WINNT\System32\Csrss.exe
會話管理員會載入 Windows 子系統(Subsystem)的核心模式(Kernel Mode) - Win32k.sys 和使用者模式(User Mode) - Csrss.exe 這二支程式,Windows 子系統控制了所有的 I/O 裝置和螢幕的顯示,其相關資訊定義在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 下的 [SubSystems] 機碼中,如此一來 W2K 將會從文字操作模式(Text Mode)轉換至圖形介面操作模式(Graphical User Interface),鍵盤和其他的輸出入裝置(Input/Output Device)也就可以開始運作了。
|
接下會話管理員還會繼續啟動其他定義在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 下的 [SubSystems] 機碼中的其他子系統,每個子系統各有其負責的工作,我們不在此多做介紹,我們以下圖來表示 W2k 的系統架構,看完這個圖,我相信各位讀者會有更進一步的認知。 |
|
同時我們順便來了解一下使用者模式(User Mode)的程序(Processes)和核心模式(Kernel Mode)的程序之間的差別在那?一般來說,作業系統元件和驅動程式是執行在核心模式下,在核心模式下執行的程序是可以和系統硬體、記憶體或裝置驅動程式 直接溝通,所以講求效能的驅動程式和服務擺在核心模式下執行,可讓這些程序和硬體溝通上較有效率。而應用程式和相關子系統的程序是在使用者模式下執行運作 的,在使用者模式下執行的程序是無法和系統硬體、記憶體或裝置驅動程式直接溝通,目的是為了防止這些程序會危害到系統的完整性。當其要使用系統資源,則會 將其需求轉交到核心模式,由核心模式下的程序來做掌控及分配的處理。同時當作業系統需要較多的記憶體處理工作時,它會將使用者模式下的程序從記憶體移轉到 硬碟,即我們俗稱的虛擬記憶體,那是因為使用者模式下的程序之優先等級(Priority)較核心模式下的程序來的低之緣故。 |
 |
- 啟動登入管理員 - \WINNT\System32\Winlogon.exe
會話管理員會去啟動 Winlogon 程式,如此一來便結束了核心初始化階段(Kernel Initiation Phase),而進入了最後的登錄階段(Logon Phase)流程。
登錄階段(Logon Phase) |
- 開始登錄(Begin Logon)
- 服務控制管理員(Service Control Manager)
- 複製控制集(Clone Control Set)
- 執行啟動程式(Run Startup Programs)
|
|
開始登錄(Begin Logon) |
當 WIN32 子系統啟動後,會話管理員就會自動啟動了 Winlogon.exe,而 Winlogon.exe 就會去啟動服務子系統(Service Subsystem) - 服務控制管理員(Service Control Manager,SCM)程式 Services.exe 和本機安全管理程序(Local Security Authority,W2K 安全系統的核心元件)- Lsass.exe,而此時 Ctrl+Alt+Del 的登錄對話畫面就會出現了,當使用者同時按下 Ctrl、Alt、Del三個按鍵後,便會出現要求使用者輸入使用者帳號及密碼的登入畫面,而當使用者此輸入了使用者帳號及密碼以後,系統便會將使用者所 輸入的資訊傳給本機安全管理程序負責處理使用者認證的問題,一旦認證通過,使用者便可登入系統了。 |
|
服務控制器(Service Controller) |
雖然使用者登入進到了 W2K 作業系統,但此時你可能會發現系統會有短暫的時間沒有反應,那是因為服務控制管理員程式 - Services.exe 正在進行最後一次的註冊機碼資料庫搜尋,搜尋在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 註冊機碼下所有的裝置驅動程式及服務,並載入 [Start] 值為 2 的服務(例如 Computer browser、Workstation、Server、Spooler、Netlogon等服務),至於載入的順序則決定於這些服務的依存性 (dependency),這些服務的依存性則定義在 [DependOnGroup] 及 [DependOnService] 這兩個值中(如下圖所示),DependOnGroup 是在定義當啟動這個驅動程式或服務之前至少須先載入那一個 Group 中的一個驅動程式或服務。以下圖為例,RemoteAccess 這個服務就必須依賴 NetBIOSGroup 這個群組之一的服務存在,如果 NetBIOSGroup 這個群組沒有一個服務起來,則 RemoteAccess 服務也無法啟動成功。而 DependOnService 則是在定義當啟動這個驅動程式或服務之前,那些驅動程式或服務必須己經載入啟動了,否則這個驅動程式或服務是無法啟動了。以下圖為 例,RemoteAccess 這個服務就必須依賴 RpcSS 這個服務的存在,如果 RpcSS 這個服務沒有起來,則 RemoteAccess 服務也無法啟動成功。 |
 |
再以一個大家所熟悉的 Netlogon 服務為例,由下圖可得知 Netlogon 這個服務就必須依賴 LanmanWorkstation 和 LanmanServer 這二個服務存在,如果這二個服務沒有起來,則 Netlogon 服務也無法啟動成功。 |
 |
複製控制集(Clone Control Set) |
當使用者成功的登入至 W2K 作業系統後,系統此時認為「開機」這件事終於大功告成,所以核心程式會將複製的控制集(CLONE control set)拷貝到 LastKnownGood 控制集中,以備不時之需。但從這邊我們也可提醒使用者另一件事,若下次開機你所選擇的項目是使用「上次的良好設定(LastKnownGood)」時,則你這次開機成功到下次重新開機這段期間對 CurrentControlSet 所做的設定都將會遺失掉。 |
 LastKnownGood 這個選項通常可用在什麼時機? |
|
|
執行啟動程式(Run Startup Programs) |
當 LastKnownGood 控制集複製完成後,基本上己算 W2K 開機成功了,但我們還是來稍微看一下 W2K 作業系統還會做些什麼事倩。W2K 作業系統將會執行屬於該使用者的登入設定檔(Logon Script)及定義在以下註冊機碼中預定要執行的程式或服務: |
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Runonce
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
- \WINNT\Documents and Settings\All Users\Start Menu\Programs\Startup
- \WINNT\Documents and Settings\\Start Menu\Programs\Startup
|
哇!"開機"萬言書終於在漫漫長月下可以劃下一個句點了!經過一個月的洗禮,不知各位讀者對"開機"這件事是否有了新的認知,往往一件看似簡單的事,裡面卻蘊含著無數的未知數及多少人的努力,讓我們大家共勉之。 |