?啟動與關機
引導進程
在描述windows引導進程時,我們將從系統(tǒng)安裝和處理引導支持文件開始。設備驅動是引導進程關鍵部分,所以我們會解釋,在驅動被加載和初始化的時候,引導進程是如何控制每一時間段的方法。然后我們描述執(zhí)行子系統(tǒng)是如何初始化的和內核是如何啟動會話管理進程smss.exe、Windows子系統(tǒng)和登陸進程(Winlogon.exe)來載入用戶模式的。在此過程中,我們將會重點講述那些在屏幕上出現(xiàn)各種文本提示的時間段,以幫助你把你看到的內部進程與你看到的Windows引導過程聯(lián)系起來。
值得注意的是相對在IA64系統(tǒng)與x86和x64系統(tǒng)之間,引導進程早期階段會有所不同。下面一節(jié)將描述x86和x64系統(tǒng)引導進程細節(jié)部分,接著描述IA64引導進程的細節(jié)部分。
x86和x64系統(tǒng)的預啟動(引導前的準備)
當你按下計算機電源或者按下reset鍵時WINDOWS引導進程并不會開始。它是在你給你的計算機安裝WINDOWS系統(tǒng)的時候開始的。在系統(tǒng)安裝程序(Windows Setup program)執(zhí)行期間的某個點上,系統(tǒng)的主硬盤分區(qū)被準備了一些參與引導進程的代碼。在我們深入這些代碼的作用之前,我們先看看WINDOWS是如何把這些代碼放到磁盤上和放在磁盤的什么位置。
從早期的MS-DOS延續(xù)下來一個標準,就是在x86系統(tǒng)上把物理磁盤分割成卷。微軟操作系統(tǒng)把硬盤分割成稱之為分區(qū)(Partitions)的離散區(qū)域,并且用文件系統(tǒng)(即文件格式FAT和NTFS)把每個分區(qū)格式化為一個卷。一個硬盤能最多包含四個主分區(qū)。因為這種分配方式會限制一個磁盤只能劃分成四個卷,所以一個特殊的分區(qū)類型產(chǎn)生了,稱之為擴展分區(qū)(Extended partition),擴展分區(qū)允許每個主分區(qū)里包含最多四個額外的分區(qū)。擴展分區(qū)可以包含還有擴展分區(qū)的擴展分區(qū),并且這個分區(qū)在一個磁盤空間允許的情況下?lián)碛袩o限有效的卷標號碼。圖5-1顯示一個硬盤規(guī)劃的事例,表5-1總述了在x86和x64引導進程的相關文件。
物理硬盤是以扇區(qū)(Sector)為單位來尋址的。在一臺IBM兼容PC上的一個硬盤扇區(qū)是典型的512字節(jié)。用MS-DOS的Fdisk應用程序或者Windows安裝程序,把硬盤準備成卷標定義形式的用途是為了在硬盤的第一個扇區(qū)寫入有一個扇區(qū)數(shù)據(jù)的稱為主引導記錄(MBR)的數(shù)據(jù)代碼(MBR分區(qū)將在第十章進行描述)。這個MBR包含:一個含有可執(zhí)行指令(稱為引導代碼)的固定數(shù)量空間,和一個帶有四個定義為磁盤主分區(qū)位置入口的表(稱為分區(qū)表)。當一個IBM兼容計算機引導時,它執(zhí)行的第一個代碼被稱做BIOS,BIOS是被編碼到計算機的ROM里面的一段程序。BIOS選擇一個引導設備,讀這個設備的MBR到內存,并且把控制權交給在MBR里的這個代碼。
? ? ? ?MBR通過Microsoft分區(qū)工具,像Windows Setup安裝程序里集成的分區(qū)工具和磁盤管理MMC加載件,寫MBR到磁盤也經(jīng)過了讀取進程和傳遞控制的過程。首先,MBR代碼掃描這主分區(qū)表,直到落到這樣一個分區(qū),這個分區(qū)包含一個表示可引導分區(qū)的標簽。當這個MBR找到至少一個這樣的標簽,它會讀這個被標記分區(qū)的第一個扇區(qū)到內存,并且傳輸控制權給這個分區(qū)中的代碼。這類分區(qū)被稱為引導分區(qū)(boot partition),這樣的分區(qū)的第一個扇區(qū)被稱為引導扇區(qū)。定義為引導分區(qū)的卷標被稱為系統(tǒng)卷標(system volume)。
操作系統(tǒng)通常在沒有用戶干預下把引導扇區(qū)寫入磁盤。例如,當Windows安裝程序寫MBR到一個硬盤時,它也寫一個引導扇區(qū)到這個磁盤的第一個可引導扇區(qū)。在安裝MS-DOS,Windows Me,Windows 98,或者Windows 95時,你可能已經(jīng)創(chuàng)建一個MS-DOS引導扇區(qū)。Windows安裝程序檢測這個引導扇區(qū),看這個將被Windows引導扇區(qū)重寫的引導扇區(qū)是否是一個有效的MS-DOS引導扇區(qū)。如果是,Windows安裝程序拷貝這個引導扇區(qū)的內容到一個存在于分區(qū)根目錄下稱為Bootsect.dos的文件中。
在寫入到一個分區(qū)的引導扇區(qū)之前,Windows安裝程序首先確保這個分區(qū)是被你指定的一個Windows支持的(FAT,F(xiàn)AT32,NTFS)文件系統(tǒng)格式化了(以及其他分區(qū)都要做類似格式化過程)。如果分區(qū)已經(jīng)被格式化,你可以指示安裝程序跳過這一步。否則,使用安裝程序格式化了這個引導分區(qū)以后,安裝程序拷貝Windows用在引導分區(qū)的文件(系統(tǒng)卷標)到系統(tǒng)卷中,這些文件包含兩個參與引導序列的文件:Ntldr和Ntdetect.com。
安裝程序的另一角色是創(chuàng)建一個引導菜單文件:Boot.ini,它存在于系統(tǒng)卷標的根目錄。這個文件包含是從安裝程序安裝的這個版本的windows還是一些先前已經(jīng)安裝的Windows選擇引導的一個選項。如果Bootsect.dos包含一個有效的MS-DOS引導扇區(qū),Boot.ini創(chuàng)建的入口之一就是引導到該MS-DOS下。下面輸出的內容顯示了一個在Windows XP之前安裝了MS-DOS雙引導計算機的Boot.ini文件
你會發(fā)現(xiàn)這個示例文件中Windows文件路徑很特別,是使用一種ARC命名規(guī)則的特殊語法。有三個變量被Windows用到這個語法中。第一,在前所述代碼中multi()語法,指示W(wǎng)indows用BIOS INT 13函數(shù)來載入系統(tǒng)文件。因此,這個multi()語法被介紹為,當定位于引導卷標的磁盤有一個支持INT-13的控制器時使用。如下就是multi()的語法:
multi(W)disk(X)rdisk(Y)partition(Z)
W是這個磁盤控制器號(也稱為磁盤序號),通常為0。X在multi()語法中一直是0。Y指定為附在控制器W的的具體物理硬盤。對于ATA控制器,這個數(shù)字介于0-3之間。對于SCSI控制器,這個號碼通常在0-15之間。Z顯示在物理硬盤上相應引導卷標的分區(qū)號碼。第一分區(qū)被指派為號碼1。
Ntbootdd.sys提供支持Windows磁盤的I/O服務,這scsi() ARC語法依靠Ntbootdd.sys來通知windows去訪問在引導卷標的文件。該語法格式如下:
?
scsi(W)disk(X)rdisk(Y)partition(Z)
此語法中,W是控制器號,X是附屬到控制器的物理硬盤,也是介于0-15。Y指定了引導卷標磁盤的SCSI邏輯單元號(LUN),通常為0。最后,Z是相應驅動卷標分區(qū)號,通常從1開始。
這最后一種被Windows使用的語法是signature()語法。它指示W(wǎng)indows定位到括號中匹配第一個值的標號磁盤,不管與磁盤聯(lián)合的控制器號,并且用Ntbootdd.sys去訪問引導卷標。一個磁盤簽名就是一個全局唯一標識符(GUID),Windows安裝程序從MBR中的信息中生成該簽名,并且寫到磁盤上。這個signature()語法如下:
signature(V)disk(X)rdisk(Y)partition(Z)
V是一個32位16進制用于表示該磁盤的磁盤簽名。X是帶有特定簽名的物理硬盤,并且它在系統(tǒng)中能與任何控制器發(fā)生緊密聯(lián)系。Y一直是0。Z就是引導卷標所在的分區(qū)號碼。
Windows使用該語法于下面幾種情況:
1、引導卷標的大小高于7.8GB,并且BIOS擴展的INT-13函數(shù)(用于訪問一個磁盤超過7.8GB的部分)不能訪問整個卷標情況下。
2、BIOS不支持擴展的INT-13函數(shù)情況下。