Windows啓動詳解

我們每天都在和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爲例向您介紹。
 
  基本上,操作系統的引導過程是從計算機通電自檢完成之後開始進行的,而這一過程又可以細分爲預引導、引導、載入內核、初始化內核,以及登錄這五個階段。
 
  在繼續閱讀之前,首先請注意下圖,這是Windows XP的操作系統結構,其中包括了一些在後臺工作的組件以及經常和我們打交道的程序。在瞭解Windows XP的啓動過程之前,對系統結構有一個初步概念是很重要的。
 
 
 
1.預引導階段

  當我們打開計算機電源後,預引導過程就開始運行了。在這個過程中,計算機硬件首先要完成通電自檢(Power-On Self Test,POST),這一步主要會對計算機中安裝的處理器、內存等硬件進行檢測,如果一切正常,則會繼續下面的過程。
 
    如果您的計算機BIOS(固化在計算機主板上芯片中的一些程序)是支持即插即用的(基本上,現階段能夠買到的計算機和硬件都是支持這一標準的),而且所有硬件設備都已經被自動識別和配置,接下來計算機將會定位引導設備(例如第一塊硬盤,設備的引導順序可以在計算機的BIOS設置中修改),然後從引導設備中讀取並運行主引導記錄(Master Boot Record,MBR)。至此,預引導階段成功完成。
 
2.引導階段

  引導階段又可以分爲:初始化引導載入程序、操作系統選擇、硬件檢測、硬件配置文件選擇這四個步驟。在這一過程中需要使用的文件包括:Ntldr、Boot.ini、Ntdetect.com、Ntoskrnl.exe、Ntbootdd.sys、Bootsect.dos(非必須)。
 
2.1.初始化引導載入程序

  在這一階段,首先出場的是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也認不出來的。
 
  讀取了文件系統驅動,併成功找到硬盤上的分區後,引導載入程序的初始化過程就已經完成了,隨後我們將會進行到下一步。
 
2.2.操作系統選擇

  這一步並非必須的,只有在您計算機中安裝了多個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盤。很奇怪的規定,保存了引導系統所需文件的分區被叫做“系統盤”,反而保存了操作系統文件的分區被叫做“引導盤”,正好顛倒了。不過微軟就是這樣規定的。
 
2.3.硬件檢測

  這一過程中主要需要用到Ntdetect.com和Ntldr。當我們在前面的操作系統選擇階段選擇了想要載入的Windows系統之後,Ntdetect.com首先要將當前計算機中安裝的所有硬件信息收集起來,並列成一個表,接着將該表交給Ntldr(這個表的信息稍後會被用來創建註冊表中有關硬件的鍵)。這裏需要被收集信息的硬件類型包括:總線/適配器類型、顯卡、通訊端口、串口、浮點運算器(CPU)、可移動存儲器、鍵盤、指示裝置(鼠標)。至此,硬件檢測操作已經成功完成。
 
2.4.配置文件選擇

  這一步也不是必須的。只有在計算機(常用於筆記本電腦)中創建了多個硬件配置文件的時候才需要處理這一步。
 
小知識:什麼是硬件配置文件?爲什麼要用它?
 
  這個功能比較適合筆記本電腦用戶。如果您有一臺筆記本電腦,主要在辦公室和家裏使用,在辦公室的時候您可能會使用網卡將其接入公司的局域網,公司使用了DHCP服務器爲客戶端指派IP地址;但是回到家之後,沒有了DHCP服務器,啓動系統的時候系統將會用很長時間尋找那個不存在的DHCP服務器,這將延長系統的啓動時間。在這種情況下就可以分別在辦公室和家裏使用不同的硬件配置文件了,我們可以通過硬件配置文件決定在某個配置文件中使用哪些硬件,不使用哪些硬件。例如前面列舉的例子,我們可以爲筆記本電腦在家裏和辦公室分別創建獨立的配置文件,而家庭用的配置文件中會將網卡禁用。這樣,回家後使用家用的配置文件,系統啓動的時候會直接禁用網卡,也就避免了尋找不存在的DHCP服務器延長系統啓動時間。
 
   如果Ntldr檢測到系統中創建了多個硬件配置文件,那麼它就會在這時候將所有可用的配置文件列表顯示出來,供用戶選擇。這裏其實和操作系統的選擇類似,不管系統中有沒有創建多個配置文件,Ntldr都會進行這一步操作,不過只有在確實檢測到多個硬件配置文件的時候纔會顯示文件列表。
 
3.載入內核階段

  在這一階段,Ntldr會載入Windows XP的內核文件:Ntoskrnl.exe,但這裏僅僅是載入,內核此時還不會被初始化。隨後被載入的是硬件抽象層(hal.dll)。
 
  硬件抽象層其實是內存中運行的一個程序,這個程序在Windows XP內核和物理硬件之間起到了橋樑的作用。正常情況下,操作系統和應用程序無法直接與物理硬件打交道,只有Windows內核和少量內核模式的系統服務可以直接與硬件交互。而其他大部分系統服務以及應用程序,如果想要和硬件交互,就必須透過硬件抽象層進行。
 
小知識:爲什麼要使用硬件抽象層?
 
  硬件抽象層的使用主要有兩個原因:1,忽略無效甚至錯誤的硬件調用。如果沒有硬件抽象層,那麼硬件上發生的所有調用甚至錯誤都將會反饋給操作系統,這可能會導致系統不穩定。而硬件抽象層就像工作在物理硬件和操作系統內核之間的一個過濾器,可以將認爲會對操作系統產生危害的調用和錯誤全部過濾掉,這樣直接提高了系統的穩定性;2,多平臺之間的轉換翻譯。這個原因可以列舉一個形象的例子,假設每個物理硬件都使用不同的語言,而每個操作系統組件或者應用程序則使用了同樣的語言,那麼不同物理硬件和系統之間的交流將會是混亂而且很沒有效率的。如果有了硬件抽象層,等於給軟硬件之間安排了一位翻譯,這位翻譯懂所有硬件的語言,並會將硬件說的話用系統或者軟件能夠理解的語言原意轉達給操作系統和軟件。通過這個機制,操作系統對硬件的支持可以得到極大的提高。
 
  硬件抽象層被載入後,接下來要被內核載入的是HKEY_LOCAL_MACHINE\System註冊表鍵。Ntldr會根據載入的Select鍵的內容判斷接下來需要載入哪個Control Set註冊表鍵,而這些鍵會決定隨後系統將載入哪些設備驅動或者啓動哪些服務。這些註冊表鍵的內容被載入後,系統將進入初始化內核階段,這時候ntldr會將系統的控制權交給操作系統內核。
 
4.初始化內核
 
    當進入到這一階段的時候,計算機屏幕上就會顯示Windows XP的標誌了,同時還會顯示一條滾動的進度條,這個進度條可能會滾動若干圈。從這一步開始我們才能從屏幕上隊系統的啓動有一個直觀的印象。在這一階段中主要會完成這四項任務:創建Hardware註冊表鍵、對Control Set註冊表鍵進行復制、載入和初始化設備驅動,以及啓動服務。
 
4.1.創建Hardware註冊表鍵

  首先要在註冊表中創建Hardware鍵,Windows內核會使用在前面的硬件檢測階段收集到的硬件信息來創建HKEY_LOCAL_MACHINEHardware鍵,也就是說,註冊表中該鍵的內容並不是固定的,而是會根據當前系統中的硬件配置情況動態更新。
 
4.2.對Control Set註冊表鍵進行復制

  如果Hardware註冊表鍵創建成功,那麼系統內核將會對Control Set鍵的內容創建一個備份。這個備份將會被用在系統的高級啓動菜單中的“最後一次正確配置”選項。例如,如果我們安裝了一個新的顯卡驅動,重啓動系統之後Hardware註冊表鍵還沒有創建成功系統就已經崩潰了,這時候如果選擇“最後一次正確配置”選項,系統將會自動使用上一次的Control Set註冊表鍵的備份內容重新生成Hardware鍵,這樣就可以撤銷掉之前因爲安裝了新的顯卡驅動對系統設置的更改。
 
4.3.載入和初始化設備驅動

  在這一階段裏,操作系統內核首先會初始化之前在載入內核階段載入的底層設備驅動,然後內核會在註冊表的HKEY_LOCAL_MACHINE\System\CurrentControl\SetServices鍵下查找所有Start鍵值爲“1”的設備驅動。這些設備驅動將會在載入之後立刻進行初始化,如果在這一過程中發生了任何錯誤,系統內核將會自動根據設備驅動的“ErrorControl”鍵的數值進行處理。“ErrorControl”鍵的鍵值共有四種,分別具有如下含義:
  0,忽略,繼續引導,不顯示錯誤信息。
  1,正常,繼續引導,顯示錯誤信息。
  2,恢復,停止引導,使用“最後一次正確配置”選項重啓動系統。如果依然出錯則會忽略該錯誤。
  3,嚴重,停止引導,使用“最後一次正確配置”選項重啓動系統。如果依然出錯則會停止引導,
      並顯示一條錯誤信息。
 
4.4.啓動服務

  系統內核成功載入,並且成功初始化所有底層設備驅動後,會話管理器會開始啓動高層子系統和服務,然後啓動Win32子系統。Win32子系統的作用是控制所有輸入/輸出設備以及訪問顯示設備。當所有這些操作都完成後,Windows的圖形界面就可以顯示出來了,同時我們也將可以使用鍵盤以及其他I/O設備。
 
    接下來會話管理器會啓動Winlogon進程,至此,初始化內核階段已經成功完成,這時候用戶就可以開始登錄了。

5.登錄階段

  在這一階段,由會話管理器啓動的winlogon.exe進程將會啓動本地安全性授權(Local Security Authority,lsass.exe)子系統。到這一步之後,屏幕上將會顯示Windows XP的歡迎界面或者登錄界面,這時候您已經可以順利進行登錄了。不過與此同時,系統的啓動還沒有徹底完成,後臺可能仍然在加載一些非關鍵的設備驅動。
 
    隨後系統會再次掃描HKEY_LOCAL_MACHINE\System\CurrentControl\SetServices註冊表鍵(還記得第一次掃描這裏是在啓動進行到那一步的時候嗎?),並尋找所有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的啓動過程就算全部完成了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章