Windows NT啟動過程詳解
我們每天都在和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為例做介紹。
基本上,作業系統的啟動過程是從電腦POST(Power On Self Test)完成之後開始進行的,而這一過程又可以細分為預啟動、啟動、載入核心、初始化核心,以及登錄這五個階段。
在繼續閱讀之前,首先請注意下圖,這是Windows XP的作業系統結構,其中包括了一些在背景工作的組件以及經常和我們打交道的程式。
在了解Windows XP的啟動過程之前,對系統結構有一個初步概念是很重要的。
預啟動執行環境(Preboot eXecution Environment,PXE) 階段
當我們打開電腦電源後,預啟動過程就開始執行了。在這個過程中,電腦硬體首先要完成通電自檢(Power-On Self Test,POST),這一步主要會對電腦所安裝的處理器、記憶體等硬體進行檢測,如果一切正常,則會繼續下面的過程。
如果您的電腦BIOS(內建在主板上晶片中的一些程式)是支援即插即用的(基本上,現階段能夠買到的電腦和硬體都是支持這一標準的),
而且所有硬體設備都已經被自動辨識和配置,接下來電腦將會定位啟動設備(例如:第一顆硬碟,設備的啟動順序可以在BIOS設置中修改),然後從啟動設備中讀取並執行主開機紀錄(Master Boot Record,MBR)。至此,預啟動階段成功完成。
啟動階段
啟動階段又可以分為:
1) 初始化啟動載入程式、
2) 作業系統選擇、
3) 硬體檢測、
4) 硬體配置檔案選擇,這四個步驟。
在這一過程中需要使用的檔案包括: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的啟動過程就算全部完成了
留言列表