close


作者:吳翠鳳 (Linda Wu)
適用於 Win2000/XP/2003。


從電源開啟後的 POST,到 Windows 開機完成的詳細過程,包含圖解,
相當完整精彩的資料。




 

"開機" 萬言書 - PART III(本篇有版權, 不宜公開)


核心載入階段(Kernel Load Phase)
當 結束了上面的設定檔選擇程式後,你將會看到如下的顯示螢幕,此時 NTLDR 將會載入 W2K 的核心程式 - Ntoskrnl.exe 到記憶體,但並未將其做初始化(Initialize)的動作,此時也正式進入了核心載入階段,接下來就會載入硬體抽象層(Hardware Abstraction Layer) - Hal.dll 的程式碼至記憶體。



各 位讀者對硬體抽象層這個名詞可能會感到很陌生,硬體抽象層是介於實際硬體裝置和 W2K 作業系統核心之間的一個仲介角色,除了系統核心(Kernel)和小部份的系統核心服務可以直接跟硬體溝通外,至於在其他的狀況下要跟硬體溝通,則需透過 硬體抽象層來負責當之間的媒介。這樣處理的好處在於作業系統可以相容於不同的硬體平臺上,因為不同的硬體裝置會有不同的處理模式,例如 Intel x86 系統和 RISC系統就有差別,如果沒有硬體抽象層這個中間角色存在,那同一套作業系統可能要寫很多版本,以因應不同的硬體作業平臺或裝置,所以當硬體裝置不同 時,只要替換硬體抽象層即可。其實裝置驅動式(Device Driver)就是一個硬體抽象層的典型代表,例如印表機裝置就會因應不同的作業系統而撰寫不同的印表機驅動程式。你也可以把硬體抽象層想像成是轉換插 頭,因為插座型式可能有很多種(二孔式、三孔式、圓孔、方孔),可是電線的插頭只會配一種型式,那此時只好利用轉換插頭來相容不同的插座孔了。

當 硬體抽象層程式碼載入記憶體後,NTLDR 從 \WINNT\system32\config\SYSTEM 載入 HKEY_LOCAL_MACHINE\SYSTEM 的註冊機碼值(Registry)資料,並從其中的 [Select] Key(機碼)來決定所要載入的控制集(Control Set)為何。在控制集(Control Set)中定義了要如何控制系統的設定資料,例如裝置驅動程式和那些服務是要載入啟動的,那些裝置驅動程式和服務是要先啟動?那些裝置驅動程式和服務是要 後啟動?這些服務和裝置之間的相依性關係為何?預設一定會有超過一個以上的控制集存在,以防預設的控制集無法正常運作時,還有一個備援可以派上用場。以下 圖為例,我們來看看在 [Select] 機碼中所定義的一些內容各是代表什麼意思:





至 於 CurrentControlSet 這個控制集又是扮演著什麼樣的角色呢?其可算是一個指標(Pointer),此指標指向 [Select] 機碼中 Current 所定義的控制集。以下圖為例,Current 的值為1,所以 CurrentControlSet 這個指標指向的是 ControlSet001 這個控制集,也因此當你展開 CurrentControlSet 下的樹狀結構所看到的一切內容,其實就是 ControlSet001 下的樹狀結構內容。這樣做的目的是因為控制集太多,為了讓管理者在成功開機後,若想修改目前成功開機所使用的控制集中之註冊機碼(Registry)時, 不至於修改到其他的控制集內容,同時使用者也不須去瞭解 [Select] 機碼下各個值所定義的內容及其含義為何,故用 CurrentControlSet 這名稱來代表是目前正在使用的控制集,這有點像防呆措施。因此當你用註冊機碼編輯器或控制臺來更改電腦設定時,都是針對 CurrentControlSet 的內容在做變更,其實也代表你改的是 ControlSet001 的內容。

下圖是控制集的變化過程,我們稍微來瞭解一下這些變化是如何產生的:



當系統安裝好後,若沒有選擇過「上次的良好設定(LastKnownGood)」開機,則控制集的狀態會一直維持跟 圖一 一樣。而 LastKnownGood 所指的 ControlSet002 之內容會因每次使用者開機成功後被最新的設定給覆蓋。
一旦在開機時選擇了「上次的良好設定」,則控制集將會變成 圖二 的模樣。



Current 使用了 圖一 LastKnownGood 所指的 ControlSet002 控制集,而 Failed 則變成了 圖一 Current 所指的 ControlSet001 控制集,至於 LastKnowGood 則重新另起爐灶變成了 ControlSet003 控制集,即代表這次使用者成功開機時的設定。
若從此以後再也沒有選擇過「上次的良好設定」開機,則控制集的狀態會一直維持跟 圖二 一樣,一旦在開機時選擇了「上次的良好設定」,則控制集將會變成 圖三 的模樣。



Current 使用了 圖二 LastKnownGood 所指的 ControlSet003 控制集,而 Failed 則變成了 圖二 Current 所指的 ControlSet002 控制集,至於 LastKnowGood 則重新另起爐灶變成了 ControlSet004 控制集,即代表這次使用者成功開機時的設定。
若從此以後再也沒有選擇過「上次的良好設定」開機,則控制集的狀態會一直維持跟 圖三 一樣,一旦在開機時選擇了「上次的良好設定」,則控制集將會變成 圖四 的模樣。



Current 使用了圖三 LastKnownGood 所指的 ControlSet004 控制集,而 Failed 則變成了 圖三 Current 所指的 ControlSet003 控制集,至於 LastKnowGood 則重新循環使用了 ControlSet001 控制集,這個 ControlSet001 控制集和 圖一 的 ControlSet001 控制集是不一樣的,只是名稱相同,但裡面的內容則是不一樣的。

接 下來 NTLDR 會去掃瞄在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 註冊機碼下所有定義的裝置驅動程式子機碼(SubKey),並載入 [Start] 值為 0 的裝置驅動程式(如下圖所示),但並未去啟動這些裝置。一般來說這是一些低階的裝置驅動程式,例如硬碟、ACPI(Advanced Configuration Power Interface)等。同時註冊機碼 [ImagePath] 值也定義了這些裝置驅動程式是擺放在硬碟的什麼地方,以方便 NTLDR 找到並載入。至於這些裝置驅動程式的載入順序,則是由 [Group] 值來決定。



在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServicesGroupOrder 機碼中的 [List] 值就定義了這些不同 [Group] 值所代表的載入順序為何,如下圖所示:



此時 NTLDR 也就可以退朝讓位給 W2K 的核心程式了。

在進入下一個階段之前,我們再來看看在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 註冊機碼下各個裝置驅動程式或服務子機碼(SubKey)中所定義的一些內容各是代表什麼意思:




定義裝置驅動程式或服務的啟動類型(Start)介紹:



定義裝置驅動程式或服務類型(Type)介紹:




----------------

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Estar007 的頭像
    Estar007

    Never give up!永不放棄

    Estar007 發表在 痞客邦 留言(0) 人氣()