我們每天都在和Windows打交道,很多人可能每天都要面對多次Windows的啟動過程,可是您知道在Windows的啟動過程背後,隱藏著什麼秘密嗎?在這一系列過程中都用到了哪些重要的系統檔案?系統的啟動分為幾個步驟?在這些步驟中電腦中發生了什麼事情?這些就是本文試圖告訴您的。
本文的適用範圍隨著技術的發展,我們能夠見到的電腦硬體種類越來越多。以電腦上最重要的組件CPU來說,目前就有很多選擇。當然,這裡的選擇並不是說AMD或者Intel這種產品品牌,而是指其內部的體繫結構。目前常見的CPU體繫結構主要基於複雜指令集(Complex Instruction Set Computing,CISC)或者精簡指令集(Reduced Instruction Set Computing,RISC),我們常用的Intel的Pentium、Celeron系列以及AMD的Athlon、Sempron系列都是基於複雜指令集的,而這些基於複雜指令集的CPU還有32位和64位的寄存器資料頻寬區別。關於這些指令集以及寄存器資料頻寬之間的區別等內容比較繁雜,而且不是本文的重點,感興趣的朋友可以自己在網上搜尋相關內容。因為CPU種類的不同,在不同CPU的系統中啟動並執行Windows的啟動過程也有一些小的不同。本文將會以目前來說最普遍的,在x86架構的系統上安裝的32位Windows XP Professional為例向您介紹。 基本上,作業系統的引導過程是從電腦通電自檢完成之後開始進行的,而這一過程又可以細分為預引導、引導、載入核心、初始化核心,以及登入這五個階段。 在繼續閱讀之前,首先請注意圖1,這是Windows XP的作業系統結構,其中包括了一些在後台工作的組件以及經常和我們打交道的程式。在瞭解Windows XP的啟動過程之前,對系統結構有一個初步概念是很重要的。
預引導階段當我們開啟電腦電源後,預引導過程就開始運行了。在這個過程中,電腦硬體首先要完成通電自檢(Power-On Self Test,POST),這一步主要會對電腦中安裝的處理器、記憶體等硬體進行檢測,如果一切正常,則會繼續下面的過程。 如果您的電腦BIOS(固化在電腦主板上晶片中的一些程式)是支援隨插即用的(基本上,現階段能夠買到的電腦和硬體都是支援這一標準的),而且所有硬體裝置都已經被自動識別和配置,接下來電腦將會定位引導裝置(例如第一塊硬碟,裝置的引導順序可以在電腦的BIOS設定中修改),然後從引導裝置中讀取並運行主引導記錄(Master Boot Record,MBR)。至此,預引導階段成功完成。
引導階段引導階段又可以分為:初始化引導載入程式、作業系統選擇、硬體檢測、硬體設定檔選擇這四個步驟。在這一過程中需要使用的檔案包括:Ntldr、Boot.ini、Ntdetect.com、Ntoskrnl.exe、Ntbootdd.sys、Bootsect.dos(非必須)。
初始化引導載入程式在這一階段,首先出場的是ntldr,該程式會將處理器由實模式(Real Mode)切換為32位平坦記憶體模式(32-bit Flat Memory Mode)。不使用實模式的主要原因是,在實模式下,記憶體中的前640 KB是為MS-DOS保留的,而剩餘記憶體則會被當作擴充記憶體使用,這樣Windows XP將無法使用全部的實體記憶體。而32位平坦記憶體模式下就好多了,Windows XP自身將能使用電腦上安裝的所有記憶體(其實最多也只能用2 GB,這是32位作業系統的設計缺陷。關於大記憶體的問題因為和本文的內容關係不大,因此這裡不表,日後有機會再單獨撰文介紹)。 接下來ntldr會尋找系統內建的一個微型的檔案系統驅動。大家都知道,DOS和Windows 9x作業系統是無法讀寫NTFS檔案系統的分區的,那麼Windows XP的安裝程式為什麼可以讀寫NTFS分區?其實這就是微型檔案系統驅動的功勞了。只有在載入了這個驅動之後,ntldr才能找到您硬碟上被格式化為NTFS或者FAT/FAT32檔案系統的分區。如果這個驅動損壞了,就算您的硬碟上已經有分區,ntldr也認不出來的。 讀取了檔案系統驅動,並成功找到硬碟上的分區後,引導載入程式的初始化過程就已經完成了,隨後我們將會進行到下一步。
作業系統選擇這一步並非必須的,只有在您電腦中安裝了多個Windows作業系統的時候才會出現。不過無論您的電腦中安裝了幾個Windows,電腦啟動的過程中,這一步都會按照設計運行一遍,只有在確實安裝了多個系統的時候,系統才會顯示一個列表,讓您選擇想要引導的系統。但如果您只有一個系統,那麼引導程式在判斷完之後會直接進入到下一階段。 如果您已經安裝了多個Windows作業系統(泛指Windows 2000/XP/2003這類較新的系統,不包括Windows 9x系統),那麼所有的記錄都會被儲存在系統硬碟根目錄下一個名為boot.ini的檔案中。ntldr程式在完成了初始化工作之後就會從硬碟上讀取boot.ini檔案,並根據其中的內容判斷電腦上安裝了幾個Windows,它們分別安裝在第幾塊硬碟的第幾個分區上。如果只安裝了一個,那麼就直接跳過這一步。但如果安裝了多個,那麼ntldr就會根據檔案中的記錄顯示一個作業系統挑選清單,並預設持續30秒。只要您做出選擇,ntldr就會自動開始裝載被選擇的系統。如果您沒有選擇,那麼30秒後,ntldr會開始載入預設的作業系統。至此作業系統選擇這一步已經成功完成。 小知識:系統硬碟(System Volume)和引導盤(Boot Volume)有什麼區別?
這是兩個很容易被人搞混的概念,因為根據微軟對這兩個名詞的定義,很容易令人產生誤解。根據微軟的定義,系統硬碟是指儲存了用於引導Windows的檔案(根據前面的介紹,我們已經清楚,這些檔案是指ntldr、boot.ini等)的硬碟分區/卷;而引導盤是指儲存了Windows系統檔案的硬碟分區/卷。如果只有一個作業系統的話,我們通常會將其安裝在第一個物理硬碟的第一個主要磁碟分割(通常被識別為C盤)上,那麼系統硬碟和引導盤屬於同一個分區。但是,如果您將您的Windows安裝到了其他分區中,例如D盤中,那麼系統硬碟仍然是您的C盤(因為儘管Windows被安裝到了其他盤,但是引導系統所用的檔案還是會儲存在C盤的根目錄下),但您的引導盤將會變成是D盤。很奇怪的規定,儲存了引導系統所需檔案的分區被叫做“系統硬碟”,反而儲存了作業系統檔案的分區被叫做“引導盤”,正好顛倒了。不過微軟就是這樣規定的。
硬體檢測這一過程中主要需要用到Ntdetect.com和Ntldr。當我們在前面的作業系統選擇階段選擇了想要載入的Windows系統之後,Ntdetect.com首先要將當前電腦中安裝的所有硬體資訊收集起來,並列成一個表,接著將該表交給Ntldr(這個表的資訊稍後會被用來建立註冊表中有關硬體的鍵)。這裡需要被收集資訊的硬體類型包括:匯流排/適配器類型、顯卡、通訊連接埠、串口、浮點運算器(CPU)、抽取式存放裝置器、鍵盤、指示裝置(滑鼠)。至此,硬體檢測操作已經成功完成。
設定檔選擇這一步也不是必須的。只有在電腦(常用於膝上型電腦)中建立了多個硬體設定檔的時候才需要處理這一步。 小知識:什麼是硬體設定檔?為什麼要用它?
這個功能比較適合膝上型電腦使用者。如果您有一台膝上型電腦,主要在辦公室和家裡使用,在辦公室的時候您可能會使用網卡將其接入公司的區域網路,公司使用了DHCP伺服器為用戶端指派IP地址;但是回到家之後,沒有了DHCP伺服器,啟動系統的時候系統將會用很長時間尋找那個不存在的DHCP伺服器,這將延長系統的啟動時間。在這種情況下就可以分別在辦公室和家裡使用不同的硬體設定檔了,我們可以通過硬體設定檔決定在某個設定檔中使用哪些硬體,不使用哪些硬體。例如前面列舉的例子,我們可以為膝上型電腦在家裡和辦公室分別建立獨立的設定檔,而家庭用的設定檔中會將網卡禁用。這樣,回家後使用家用的設定檔,系統啟動的時候會直接禁用網卡,也就避免了尋找不存在的DHCP伺服器延長系統啟動時間。 如果Ntldr檢測到系統中建立了多個硬體設定檔,那麼它就會在這時候將所有可用的設定檔列表顯示出來,供使用者選擇。這裡其實和作業系統的選擇類似,不管系統中有沒有建立多個設定檔,Ntldr都會進行這一步操作,不過只有在確實檢測到多個硬體設定檔的時候才會顯示檔案清單。
載入核心階段在這一階段,Ntldr會載入Windows XP的核心檔案:Ntoskrnl.exe,但這裡僅僅是載入,核心此時還不會被初始化。隨後被載入的是硬體抽象層(hal.dll)。 硬體抽象層其實是記憶體中啟動並執行一個程式,這個程式在Windows XP核心和物理硬體之間起到了橋樑的作用。正常情況下,作業系統和應用程式無法直接與物理硬體打交道,只有Windows核心和少量核心模式的系統服務可以直接與硬體互動。而其他大部分系統服務以及應用程式,如果想要和硬體互動,就必須透過硬體抽象層進行。 小知識:為什麼要使用硬體抽象層
硬體抽象層的使用主要有兩個原因:1,忽略無效甚至錯誤的硬體調用。如果沒有硬體抽象層,那麼硬體上發生的所有調用甚至錯誤都將會反饋給作業系統,這可能會導致系統不穩定。而硬體抽象層就像工作在物理硬體和作業系統核心之間的一個過濾器,可以將認為會對作業系統產生危害的調用和錯誤全部過濾掉,這樣直接提高了系統的穩定性;2,多平台之間的轉換翻譯。這個原因可以列舉一個形象的例子,假設每個物理硬體都使用不同的語言,而每個作業系統組件或者應用程式則使用了同樣的語言,那麼不同物理硬體和系統之間的交流將會是混亂而且很沒有效率的。如果有了硬體抽象層,等於給軟硬體之間安排了一位翻譯,這位翻譯懂所有硬體的語言,並會將硬體說的話用系統或者軟體能夠理解的語言原意轉達給作業系統和軟體。通過這個機制,作業系統對硬體的支援可以得到極大的提高。 硬體抽象層被載入後,接下來要被核心載入的是HKEY_LOCAL_MACHINE\System註冊表鍵。Ntldr會根據載入的Select鍵的內容判斷接下來需要載入哪個Control Set註冊表鍵(圖2),而這些鍵會決定隨後系統將載入哪些裝置驅動或者啟動哪些服務。這些註冊表鍵的內容被載入後,系統將進入初始化核心階段,這時候ntldr會將系統的控制權交給作業系統核心。
初始化核心階段當進入到這一階段的時候,電腦螢幕上就會顯示Windows XP的標誌了,同時還會顯示一條滾動的進度條,這個進度條可能會滾動若干圈(圖3)。從這一步開始我們才能從螢幕上隊系統的啟動有一個直觀的印象。在這一階段中主要會完成這四項任務:建立Hardware註冊表鍵、對Control Set註冊表鍵進行複製、載入和初始化裝置驅動,以及啟動服務。
建立Hardware註冊表鍵首先要在註冊表中建立Hardware鍵,Windows核心會使用在前面的硬體檢測階段收集到的硬體資訊來建立HKEY_LOCAL_MACHINE\Hardware鍵,也就是說,註冊表中該鍵的內容並不是固定的,而是會根據當前系統中的硬體設定情況動態更新。
對Control Set註冊表鍵進行複製如果Hardware註冊表鍵建立成功,那麼系統核心將會對Control Set鍵的內容建立一個備份。這個備份將會被用在系統的進階啟動菜單中的“最後一次正確配置”選項。例如,如果我們安裝了一個新的顯卡驅動,重啟動系統之後Hardware註冊表鍵還沒有建立成功系統就已經崩潰了,這時候如果選擇“最後一次正確配置”選項,系統將會自動使用上一次的Control Set註冊表鍵的備份內容重建Hardware鍵,這樣就可以撤銷掉之前因為安裝了新的顯卡驅動對系統設定的更改。
載入和初始化裝置驅動在這一階段裡,作業系統核心首先會初始化之前在載入核心階段載入的底層裝置驅動,然後核心會在註冊表的HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services鍵下尋找所有Start索引值為“1”的裝置驅動(圖4)。這些裝置驅動將會在載入之後立刻進行初始化,如果在這一過程中發生了任何錯誤,系統核心將會自動根據裝置驅動的“ErrorControl”鍵的數值進行處理。“ErrorControl”鍵的索引值共有四種,分別具有如下含義: 0,忽略,繼續引導,不顯示錯誤資訊。1,正常,繼續引導,顯示錯誤資訊。2,恢複,停止引導,使用“最後一次正確配置”選項重啟動系統。如果依然出錯則會忽略該錯誤。3,嚴重,停止引導,使用“最後一次正確配置”選項重啟動系統。如果依然出錯則會停止引導,並顯示一條錯誤資訊。
啟動服務系統核心成功載入,並且成功初始化所有底層裝置驅動後,會話管理器會開始啟動高層子系統和服務,然後啟動Win32子系統。Win32子系統的作用是控制所有輸入/輸出裝置以及訪問顯示裝置。當所有這些操作都完成後,Windows的圖形介面就可以顯示出來了,同時我們也將可以使用鍵盤以及其他I/O裝置。 接下來會話管理器會啟動Winlogon進程,至此,初始化核心階段已經成功完成,這時候使用者就可以開始登入了。
登入階段在這一階段,由會話管理器啟動的winlogon.exe進程將會啟動本地安全性授權(Local Security Authority,lsass.exe)子系統。到這一步之後,螢幕上將會顯示Windows XP的歡迎介面(圖5)或者登入介面,這時候您已經可以順利進行登入了。不過與此同時,系統的啟動還沒有徹底完成,後台可能仍然在載入一些非關鍵的裝置驅動。
隨後系統會再次掃描HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services註冊表鍵(還記得第一次掃描這裡是在啟動進行到那一步的時候嗎?),並尋找所有Start鍵的數值是“2”或者更大數位服務。這些服務就是非關鍵服務,系統直到使用者成功登入之後才開始載入這些服務。 小知識:為什麼Windows XP的啟動速度要比Windows 2000快目前所有Windows作業系統中,可能Windows 2000的啟動速度是最慢的,這並不是因為電腦硬體的效能不夠,而是因為Windows 2000的設計“先天不足”。為了彌補這一不足,微軟在開發Windows XP的時候想出了一個新方法,那就是,所有不重要的裝置驅動和服務都將在使用者登入系統之後才載入和運行。也就是說,在系統啟動過程中,載入和啟動並執行程式全部都是運行系統所必需的,這樣才能用最短的時間顯示出登入介面,供使用者登入。而使用者登入後系同才開始載入非關鍵組件。可以說,Windows XP啟動速度的加快實際上是一種“投機取巧”的作法,不過這種作法確實相當有效。然而這種設計也帶來了一些問題,例如有些朋友反映,為什麼自己的系統已經成功登入了,可是非要過好幾分鐘之後案頭上才會顯示出工作列以及案頭表徵圖等內容。其實這就是因為在等待的這幾分鐘裡,系統正在忙於處理那些不重要的服務和組件。如果需要處理的內容太多,或者電腦的硬體設定不夠強大,就有可能產生這種現象。 小知識:如何控制非關鍵服務的啟動順序您已經知道了,非關鍵服務是在使用者成功登入之後才載入的,那麼我們能否人為控制這些服務載入的順序?這其實是很簡單的。服務的啟動順序也是靠各自Start註冊表鍵的數值以及每個服務之間的依存關係決定的,假設服務A的運行必須依靠服務B,那麼在服務B正常啟動之前,服務A都無法成功啟動。假設服務C的Start鍵數值是3,而服務D的Start鍵數值是6,那麼服務C將會優先於服務D啟動(數值越小優先順序越高)。 到這裡,Windows XP的啟動過程就算全部完成了。