我們每天都在和Windows打交道,很多人甚至可能在一天當(dāng)中要面對多次Windows的啟動過程,可是你知道在Windows的啟動過程背后隱藏著什么秘密嗎?在這一系列過程中都用到了哪些重要的系統(tǒng)文件?系統(tǒng)的啟動分為幾個步驟?在這些步驟中計算機中發(fā)生了什么事情?本文將試圖為你解釋上述的疑惑。
隨著技術(shù)的發(fā)展,我們能夠見到的計算機硬件種類越來越多。以計算機上最重要的組件CPU來說,目前就有很多選擇。目前常見的CPU體系結(jié)構(gòu)主要基于復(fù)雜指令集(Complex Instruction Set Computing,CISC)或者精簡指令集(Reduced Instruction Set Computing,RISC),我們常用的英特爾的Pentium、Celeron系列以及AMD的Athlon、Sempron系列處理器都是基于復(fù)雜指令集的,而這些基于復(fù)雜指令集的CPU還有32位和64位的寄存器數(shù)據(jù)帶寬的區(qū)別。因為CPU種類的不同,在不同CPU的系統(tǒng)中運行的Windows系統(tǒng)其啟動過程也有一些小的不同。本文將會以目前來說最普遍的,在x86架構(gòu)的系統(tǒng)上安裝的32位Windows XP Professional為例向你介紹。
基本上,操作系統(tǒng)的引導(dǎo)過程是從計算機通電自檢完成之后開始進行的,而這一過程又可以細分為預(yù)引導(dǎo)、引導(dǎo)、載入內(nèi)核、初始化內(nèi)核,以及登錄這五個階段。

在繼續(xù)閱讀之前,首先請注意圖1,這是Windows XP的操作系統(tǒng)結(jié)構(gòu),其中包括了一些在后臺工作的組件以及經(jīng)常和我們打交道的程序。在了解Windows XP的啟動過程之前,對系統(tǒng)結(jié)構(gòu)有一個初步概念是很重要的。
預(yù)引導(dǎo)階段
當(dāng)我們打開計算機電源后,預(yù)引導(dǎo)過程就開始運行了。在這個過程中,計算機硬件首先要完成通電自檢(Power-On Self Test,POST),這一步主要會對計算機中安裝的處理器、內(nèi)存等硬件進行檢測,如果一切正常,則會繼續(xù)下面的過程。
如果計算機BIOS是支持即插即用的(基本上,現(xiàn)階段能夠買到的計算機和硬件都是支持這一標(biāo)準(zhǔn)的),而且所有硬件設(shè)備都已經(jīng)被自動識別和配置,接下來計算機將會定位引導(dǎo)設(shè)備(例如第一塊硬盤,設(shè)備的引導(dǎo)順序可以在計算機的BIOS設(shè)置中修改),然后從引導(dǎo)設(shè)備中讀取并運行主引導(dǎo)記錄(Master Boot Record,MBR)。至此,預(yù)引導(dǎo)階段成功完成。
引導(dǎo)階段
引導(dǎo)階段又可以分為:初始化引導(dǎo)載入程序、操作系統(tǒng)選擇、硬件檢測、硬件配置文件選擇這四個步驟。在這一過程中需要使用的文件包括:Ntldr、Boot.ini、Ntdetect.com、Ntoskrnl.exe、Ntbootdd.sys、Bootsect.dos(非必須)。
初始化引導(dǎo)載入程序
在這一階段,首先出場的是ntldr,該程序會將處理器由實模式(Real Mode)切換為32位平坦內(nèi)存模式(32-bit Flat Memory Mode)。不使用實模式的主要原因是,在實模式下,內(nèi)存中的前640KB是為MS-DOS保留的,而剩余內(nèi)存則會被當(dāng)作擴展內(nèi)存使用,這樣Windows XP將無法使用全部的物理內(nèi)存。而32位平坦內(nèi)存模式下就好多了,Windows XP自身將能使用計算機上安裝的所有內(nèi)存(其實最多也只能用2GB,這是32位操作系統(tǒng)的設(shè)計缺陷)。
接下來ntldr會尋找系統(tǒng)自帶的一個微型的文件系統(tǒng)驅(qū)動。大家都知道,DOS和Windows 9x操作系統(tǒng)是無法讀寫NTFS文件系統(tǒng)分區(qū)的,那么Windows XP的安裝程序為什么可以讀寫NTFS分區(qū)?其實這就是微型文件系統(tǒng)驅(qū)動的功勞了。只有在載入了這個驅(qū)動之后,ntldr才能找到硬盤上被格式化為NTFS或者FAT/FAT32文件系統(tǒng)的分區(qū)。如果這個驅(qū)動損壞了,就算硬盤上已經(jīng)有分區(qū),ntldr也認(rèn)不出來。
讀取了文件系統(tǒng)驅(qū)動,并成功找到硬盤上的分區(qū)后,引導(dǎo)載入程序的初始化過程就已經(jīng)完成了,隨后我們將會進行下一步。
操作系統(tǒng)選擇
這一步并非必須,只有在計算機中安裝了多個Windows操作系統(tǒng)的時候才會出現(xiàn)。不過無論計算機中安裝了幾個Windows,計算機啟動的過程中,這一步都會按照設(shè)計運行一遍,但只有在確實安裝了多個系統(tǒng)的時候,系統(tǒng)才會顯示一個列表,讓你選擇想要引導(dǎo)的系統(tǒng)。
如果已經(jīng)安裝了多個Windows操作系統(tǒng),那么所有的記錄都會被保存在系統(tǒng)盤根目錄下一個名為boot.ini的文件中。ntldr程序在完成了初始化工作之后就會從硬盤上讀取boot.ini文件,并根據(jù)其中的內(nèi)容判斷計算機上安裝了幾個Windows,它們分別安裝在第幾塊硬盤的第幾個分區(qū)上。如果只安裝了一個,那么就直接跳過這一步。但如果安裝了多個,那么ntldr就會根據(jù)文件中的記錄顯示一個操作系統(tǒng)選擇列表,并默認(rèn)持續(xù)30秒。如果你沒有選擇,那么30秒后,ntldr會開始載入默認(rèn)的操作系統(tǒng)。至此操作系統(tǒng)選擇這一步已經(jīng)成功完成。
小知識:系統(tǒng)盤(System Volume)和引導(dǎo)盤(Boot Volume)
這是兩個很容易被人搞混的概念。根據(jù)微軟的定義,系統(tǒng)盤是指保存了用于引導(dǎo)Windows的文件(根據(jù)前面的介紹,我們已經(jīng)清楚,這些文件是指ntldr、boot.ini等)的硬盤分區(qū)/卷;而引導(dǎo)盤是指保存了Windows系統(tǒng)文件的硬盤分區(qū)/卷。如果只有一個操作系統(tǒng)的話,我們通常會將其安裝在第一個物理硬盤的第一個主分區(qū)(通常被識別為C盤)上,那么系統(tǒng)盤和引導(dǎo)盤屬于同一個分區(qū)。但是,如果Windows安裝到了其他分區(qū)中,例如D盤中,那么系統(tǒng)盤仍然是C盤(因為盡管Windows被安裝到了其他盤,但是引導(dǎo)系統(tǒng)所用的文件還是會保存在C盤的根目錄下),但您的引導(dǎo)盤將會變成是D盤。很難理解保存了引導(dǎo)系統(tǒng)所需文件的分區(qū)被叫做“系統(tǒng)盤”,而保存了操作系統(tǒng)文件的分區(qū)被叫做“引導(dǎo)盤”,不過這是出自微軟的定義。
硬件檢測
這一過程中主要需要用到Ntdetect.com和Ntldr。當(dāng)我們在前面的操作系統(tǒng)選擇階段選擇了想要載入的Windows系統(tǒng)之后,Ntdetect.com首先要將當(dāng)前計算機中安裝的所有硬件信息收集起來,并列成一個表,接著將該表交給Ntldr(這個表的信息稍后會被用來創(chuàng)建注冊表中有關(guān)硬件的鍵)。這里需要被收集信息的硬件類型包括:總線/適配器類型、顯卡、通訊端口、串口、浮點運算器(CPU)、可移動存儲器、鍵盤、指示裝置(鼠標(biāo))。至此,硬件檢測操作已經(jīng)成功完成。
配置文件選擇
這一步也不是必須的。只有在計算機(常用于筆記本電腦)中創(chuàng)建了多個硬件配置文件的時候才需要處理這一步。
小知識:硬件配置文件
這個功能比較適合筆記本電腦用戶。如果你有一臺筆記本電腦,主要在辦公室和家里使用,在辦公室的時候可能會使用網(wǎng)卡將其接入公司的局域網(wǎng),公司使用了DHCP服務(wù)器為客戶端指派IP地址;但是回到家之后,沒有了DHCP服務(wù)器,啟動系統(tǒng)的時候系統(tǒng)將會用很長時間尋找那個不存在的DHCP服務(wù)器,這會延長系統(tǒng)的啟動時間。在這種情況下就可以分別在辦公室和家里使用不同的硬件配置文件了,我們可以通過硬件配置文件決定在某個配置文件中使用哪些硬件,不使用哪些硬件。例如前面的例子,我們可以為筆記本電腦在家里和辦公室分別創(chuàng)建獨立的配置文件,而家庭用的配置文件中會將網(wǎng)卡禁用。這樣,回家后使用家用的配置文件,系統(tǒng)啟動的時候會直接禁用網(wǎng)卡,也就避免了尋找不存在的DHCP服務(wù)器延長系統(tǒng)啟動時間。
如果Ntldr檢測到系統(tǒng)中創(chuàng)建了多個硬件配置文件,那么它就會在這時候?qū)⑺锌捎玫呐渲梦募斜盹@示出來,供用戶選擇。這里其實和操作系統(tǒng)的選擇類似,不管系統(tǒng)中有沒有創(chuàng)建多個配置文件,Ntldr都會進行這一步操作,不過只有在確實檢測到多個硬件配置文件的時候才會顯示文件列表。
載入內(nèi)核階段
在這一階段,ntldr會載入Windows XP的內(nèi)核文件:Ntoskrnl.exe,但這里僅僅是載入,內(nèi)核此時還不會被初始化。隨后被載入的是硬件抽象層(hal.dll)。
硬件抽象層其實是內(nèi)存中運行的一個程序,這個程序在Windows XP內(nèi)核和物理硬件之間起到了橋梁的作用。正常情況下,操作系統(tǒng)和應(yīng)用程序無法直接與物理硬件打交道,只有Windows內(nèi)核和少量內(nèi)核模式的系統(tǒng)服務(wù)可以直接與硬件交互。而其他大部分系統(tǒng)服務(wù)以及應(yīng)用程序,如果想要和硬件交互,就必須通過硬件抽象層進行。
小知識:硬件抽象層
硬件抽象層的使用主要有兩個原因:第一,忽略無效甚至錯誤的硬件調(diào)用。如果沒有硬件抽象層,那么硬件上發(fā)生的所有調(diào)用甚至錯誤都將會反饋給操作系統(tǒng),這可能會導(dǎo)致系統(tǒng)不穩(wěn)定。而硬件抽象層就像工作在物理硬件和操作系統(tǒng)內(nèi)核之間的一個過濾器,可以將認(rèn)為會對操作系統(tǒng)產(chǎn)生危害的調(diào)用和錯誤全部過濾掉,這樣直接提高了系統(tǒng)的穩(wěn)定性;第二,多平臺之間的轉(zhuǎn)換翻譯。這個原因可以列舉一個形象的例子,假設(shè)每個物理硬件都使用不同的語言,而每個操作系統(tǒng)組件或者應(yīng)用程序則使用了同樣的語言,那么不同物理硬件和系統(tǒng)之間的交流將會是混亂而且很沒有效率的。如果有了硬件抽象層,等于給軟硬件之間安排了一位翻譯,這位翻譯懂所有硬件的語言,并會將硬件說的話用系統(tǒng)或者軟件能夠理解的語言原意轉(zhuǎn)達給操作系統(tǒng)和軟件。通過這個機制,操作系統(tǒng)對硬件的支持可以得到極大的提高。
硬件抽象層被載入后,接下來要被內(nèi)核載入的是HKEY_LOCAL_MACHINE\System注冊表鍵。Ntldr會根據(jù)載入的Select鍵的內(nèi)容判斷接下來需要載入哪個Control Set注冊表鍵(圖2),而這些鍵會決定隨后系統(tǒng)將載入哪些設(shè)備驅(qū)動或者啟動哪些服務(wù)。這些注冊表鍵的內(nèi)容被載入后,系統(tǒng)將進入初始化內(nèi)核階段,這時候ntldr會將系統(tǒng)的控制權(quán)交給操作系統(tǒng)內(nèi)核。
初始化內(nèi)核階段
當(dāng)進入到這一階段的時候,計算機屏幕上就會顯示W(wǎng)indows XP的標(biāo)志了,同時還會顯示一個滾動的進度條,這個進度條可能會滾動若干次(圖3)。從這一步開始我們才能從屏幕上對系統(tǒng)的啟動有一個直觀的印象。在這一階段中主要會完成四項任務(wù):創(chuàng)建Hardware注冊表鍵、對Control Set注冊表鍵進行復(fù)制、載入和初始化設(shè)備驅(qū)動,以及啟動服務(wù)。
創(chuàng)建Hardware注冊表鍵
首先要在注冊表中創(chuàng)建Hardware鍵,Windows內(nèi)核會使用在前面的硬件檢測階段收集到的硬件信息來創(chuàng)建HKEY_LOCAL_MACHINE\Hardware鍵。也就是說,注冊表中該鍵的內(nèi)容并不是固定的,而是會根據(jù)當(dāng)前系統(tǒng)中的硬件配置情況動態(tài)更新。
對Control Set注冊表鍵進行復(fù)制
如果Hardware注冊表鍵創(chuàng)建成功,那么系統(tǒng)內(nèi)核將會對Control Set鍵的內(nèi)容創(chuàng)建一個備份。這個備份將會被用在系統(tǒng)的高級啟動菜單中的“最后一次正確配置”選項。例如,如果我們安裝了一個新的顯卡驅(qū)動,重啟動系統(tǒng)之后Hardware注冊表鍵還沒有創(chuàng)建成功系統(tǒng)就已經(jīng)崩潰了,這時候如果選擇“最后一次正確配置”選項,系統(tǒng)將會自動使用上一次的Control Set注冊表鍵的備份內(nèi)容重新生成Hardware鍵,這樣就可以撤銷掉之前因為安裝了新的顯卡驅(qū)動對系統(tǒng)設(shè)置的更改。
載入和初始化設(shè)備驅(qū)動
在這一階段里,操作系統(tǒng)內(nèi)核首先會初始化之前在載入內(nèi)核階段載入的底層設(shè)備驅(qū)動,然后內(nèi)核會在注冊表的HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services鍵下查找所有Start鍵值為“1”的設(shè)備驅(qū)動(圖4)。這些設(shè)備驅(qū)動將會在載入之后立刻進行初始化,如果在這一過程中發(fā)生了任何錯誤,系統(tǒng)內(nèi)核將會自動根據(jù)設(shè)備驅(qū)動的“ErrorControl”鍵的數(shù)值進行處理。“ErrorControl”鍵的鍵值共有四種,分別具有如下含義:
0 忽略,繼續(xù)引導(dǎo),不顯示錯誤信息。
1 正常,繼續(xù)引導(dǎo),顯示錯誤信息。
2 恢復(fù),停止引導(dǎo),使用“最后一次正確配置”選項重啟動系統(tǒng)。如果依然出錯則會忽略該錯誤。
3 嚴(yán)重,停止引導(dǎo),使用“最后一次正確配置”選項重啟動系統(tǒng)。如果依然出錯則會停止引導(dǎo),并顯示一條錯誤信息。
啟動服務(wù)
系統(tǒng)內(nèi)核成功載入,并且成功初始化所有底層設(shè)備驅(qū)動后,會話管理器會開始啟動高層子系統(tǒng)和服務(wù),然后啟動Win32子系統(tǒng)。Win32子系統(tǒng)的作用是控制所有輸入/輸出設(shè)備以及訪問顯示設(shè)備。當(dāng)所有這些操作都完成后,Windows的圖形界面就可以顯示出來了,同時我們也將可以使用鍵盤以及其他I/O設(shè)備。
接下來會話管理器會啟動Winlogon進程,至此,初始化內(nèi)核階段已經(jīng)成功完成,這時候用戶就可以開始登錄了。
登錄階段
在這一階段,由會話管理器啟動的winlogon.exe進程將會啟動本地安全性授權(quán)(Local Security Authority,lsass.exe)子系統(tǒng)。到這一步之后,屏幕上將會顯示W(wǎng)indows XP的歡迎界面(圖5)或者登錄界面,這時候你已經(jīng)可以順利進行登錄了。不過與此同時,系統(tǒng)的啟動還沒有徹底完成,后臺可能仍然在加載一些非關(guān)鍵的設(shè)備驅(qū)動。
隨后系統(tǒng)會再次掃描HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services注冊表鍵,并尋找所有Start鍵的數(shù)值是“2”或者更大數(shù)字的服務(wù)。這些服務(wù)就是非關(guān)鍵服務(wù),系統(tǒng)直到用戶成功登錄之后才開始加載這些服務(wù)。
到這里,Windows XP的啟動過程就算全部完成了。
小知識:為什么Windows XP的啟動速度要比Windows 2000快
目前所有Windows操作系統(tǒng)中,可能Windows 2000的啟動速度是最慢的,這并不是因為計算機硬件的性能不夠,而是因為Windows 2000的設(shè)計“先天不足”。為了彌補這一不足,微軟在開發(fā)Windows XP的時候想出了一個新方法,那就是,所有不重要的設(shè)備驅(qū)動和服務(wù)都將在用戶登錄系統(tǒng)之后才加載和運行。也就是說,在系統(tǒng)啟動過程中,加載和運行的程序全部都是運行系統(tǒng)所必需的,這樣才能用最短的時間顯示出登錄界面,供用戶登錄。而用戶登錄后系統(tǒng)才開始加載非關(guān)鍵組件。可以說,Windows XP啟動速度的加快實際上是一種“投機取巧”的作法,不過這種作法確實相當(dāng)有效。然而這種設(shè)計也帶來了一些問題,例如有些朋友反映,為什么自己的系統(tǒng)已經(jīng)成功登錄了,可是非要過好幾分鐘之后桌面上才會顯示出任務(wù)欄以及桌面圖標(biāo)等內(nèi)容。其實這就是因為在等待的這幾分鐘里,系統(tǒng)正在忙于處理那些不重要的服務(wù)和組件。如果需要處理的內(nèi)容太多,或者計算機的硬件配置不夠強大,就有可能產(chǎn)生這種現(xiàn)象。