認(rèn)識(shí)WinXP之神秘的引導(dǎo)文件NTLDR
NTLDR一般存放于C盤根目錄下,是一個(gè)具有隱藏和只讀屬性的系統(tǒng)文件。它的主要職責(zé)是解析Boot.ini文件。如果你對(duì)它的理解還不是很清楚,那么下面我們就以Windows XP為例介紹NTLDR在系統(tǒng)引導(dǎo)過(guò)程中的作用。
Windows XP在引導(dǎo)過(guò)程中將經(jīng)歷預(yù)引導(dǎo)、引導(dǎo)和加載內(nèi)核三個(gè)階段,這與Windows 9X直接讀取引導(dǎo)扇區(qū)的方式來(lái)啟動(dòng)系統(tǒng)是完全不一樣的,NTLDR在這三個(gè)階段的引導(dǎo)過(guò)程中將起到至關(guān)重要的作用。
1.預(yù)引導(dǎo)階段
在預(yù)引導(dǎo)階段里計(jì)算機(jī)所做的工作有:運(yùn)行POST程序,POST將檢測(cè)系統(tǒng)的總內(nèi)存以及其他硬件設(shè)備的狀況,將磁盤第一個(gè)物理扇區(qū)加載到內(nèi)存,加載硬盤主引導(dǎo)記錄并運(yùn)行,主引導(dǎo)記錄會(huì)查找活動(dòng)分區(qū)的起始位置。接著活動(dòng)分區(qū)的引導(dǎo)扇區(qū)被加載并執(zhí)行,最后從引導(dǎo)扇區(qū)加載并初始化NTLDR文件。
2.引導(dǎo)階段
在引導(dǎo)階段中,Windows XP將會(huì)依次經(jīng)歷初始引導(dǎo)加載器階段、操作系統(tǒng)選擇階段、硬件檢測(cè)階段以及配置選擇階段這四個(gè)小的階段。
(1)在初始引導(dǎo)加載器階段中,NTLDR將把計(jì)算機(jī)的微處理器從實(shí)模式轉(zhuǎn)換為32位平面內(nèi)存模式,在實(shí)模式中,系統(tǒng)會(huì)為MS-Dos預(yù)留640KB大小的內(nèi)存空間,其余的內(nèi)存都被看做是擴(kuò)展內(nèi)存,在32位平面模式中系統(tǒng)將所有內(nèi)存都視為可用內(nèi)存,然后NTLDR執(zhí)行適當(dāng)?shù)男⌒臀募到y(tǒng)驅(qū)動(dòng)程序,這時(shí)NTLDR可以識(shí)別每一個(gè)用NTFS或FAT格式的文件系統(tǒng)分區(qū),至此初始引導(dǎo)加載器階段結(jié)束。
(2)當(dāng)初始引導(dǎo)加載器階段結(jié)束后將會(huì)進(jìn)入操作系統(tǒng)選擇階段,如果計(jì)算機(jī)上安裝了多個(gè)操作系統(tǒng),由于NTLDR加載了正確的Boot.ini文件,那么在啟動(dòng)的時(shí)候?qū)?huì)出現(xiàn)要求選擇操作系統(tǒng)的菜單,NTLDR正是從boot.ini文件中查找到系統(tǒng)文件的分區(qū)位置。如果選擇了NT系統(tǒng),那么NTLDR將會(huì)運(yùn)行NTDETECT.COM文件,否則NTLDR將加載BOOTSECT.DOS,然后將控制權(quán)交給BOOTSECT.DOS。如果Boot.ini文件中只有一個(gè)操作系統(tǒng)或者其中的timeout值為0,那么將不會(huì)出現(xiàn)選擇操作系統(tǒng)的菜單畫面,如果Boot.ini文件非法或不存在,那么NTLDR將會(huì)嘗試從默認(rèn)系統(tǒng)卷啟動(dòng)系統(tǒng)。
小提示:NTLDR啟動(dòng)后,如果在系統(tǒng)根目錄下發(fā)現(xiàn)有Hiberfil.sys文件且該文件有效,那么NTLDR將讀取Hiberfil.sys文件里的信息并讓系統(tǒng)恢復(fù)到休眠以前的狀態(tài),這時(shí)并不處理Boot.ini文件。
(3)當(dāng)操作系統(tǒng)選擇階段結(jié)束后將會(huì)進(jìn)入硬件檢測(cè)階段,這時(shí)NTDETECT.COM文件將會(huì)收集計(jì)算機(jī)中硬件信息列表,然后將列表返回到NTLDR,這樣NTLDR將把這些硬件信息加載到注冊(cè)表“HKEY_LOCAL_MacHINE”中的Hardware中。
(4)硬件檢測(cè)階段結(jié)束后將會(huì)進(jìn)入配置選擇階段,如果有多個(gè)硬件配置列表,那么將會(huì)出現(xiàn)配置文件選擇菜單,如果只有一個(gè)則不會(huì)顯示。
3.加載內(nèi)核階段
在加載內(nèi)核階段中,NTLDR將加載NTOKRNL.EXE內(nèi)核程序,然后NTLDR將加載硬件抽象層(HAL.dll),接著系統(tǒng)將加載注冊(cè)表中的“HKEY_MACHINESystem”鍵值,這時(shí)NTLDR將讀取“HKEY_MACHINESystemselect”鍵值來(lái)決定哪一個(gè)ControlSet將被加載。所加載的ControlSet將包含設(shè)備的驅(qū)動(dòng)程序以及需要加載的服務(wù)。再接著NTLDR加載注冊(cè)表“HKEY_LOCAL_MACHINESystemservice”下的start鍵值為0的底層設(shè)備驅(qū)動(dòng)。當(dāng)ControlSet的鏡像CurrentControlSet被加載時(shí),NTLDR將把控制權(quán)傳遞給NTOSKRNL.EXE,至此引導(dǎo)過(guò)程將結(jié)束。
小提示:如果在啟動(dòng)的時(shí)候按F8鍵,那么我們將會(huì)在啟動(dòng)菜單中看到多種選擇啟動(dòng)模式,這時(shí)NTLDR將根據(jù)用戶的選擇來(lái)使用啟動(dòng)參數(shù)加載NT內(nèi)核,用戶也可以在Boot.ini文件里設(shè)置啟動(dòng)參數(shù)。
