我們每天都在和Windows打交道,很多人甚至可能在一天當(dāng)中要面對多次Windows的啟動(dòng)過程,可是你知道在Windows的啟動(dòng)過程背后隱藏著什么秘密嗎?在這一系列過程中都用到了哪些重要的系統(tǒng)文件?系統(tǒng)的啟動(dòng)分為幾個(gè)步驟?在這些步驟中計(jì)算機(jī)中發(fā)生了什么事情?本文將試圖為你解釋上述的疑惑。
隨著技術(shù)的發(fā)展,我們能夠見到的計(jì)算機(jī)硬件種類越來越多。以計(jì)算機(jī)上最重要的組件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ū)別。因?yàn)镃PU種類的不同,在不同CPU的系統(tǒng)中運(yùn)行的Windows系統(tǒng)其啟動(dòng)過程也有一些小的不同。本文將會(huì)以目前來說最普遍的,在x86架構(gòu)的系統(tǒng)上安裝的32位Windows XP Professional為例向你介紹。
基本上,操作系統(tǒng)的引導(dǎo)過程是從計(jì)算機(jī)通電自檢完成之后開始進(jìn)行的,而這一過程又可以細(xì)分為預(yù)引導(dǎo)、引導(dǎo)、載入內(nèi)核、初始化內(nèi)核,以及登錄這五個(gè)階段。

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