我們每天都在和windows打交道,很多人可能每天都要面對多次Windows的啟動過程,可是您知道在Windows的啟動過程背后,隱藏著什么秘密嗎?在這一系列過程中都用到了哪些重要的系統(tǒng)文件?系統(tǒng)的啟動分為幾個步驟?在這些步驟中計算機中發(fā)生了什么事情?這些就是本文試圖告訴您的。
隨著技術(shù)的發(fā)展,我們能夠見到的計算機硬件種類越來越多。以計算機上最重要的組件CPU來說,目前就有很多選擇。當(dāng)然,這里的選擇并不是說AMD或者Intel這種產(chǎn)品品牌,而是指其內(nèi)部的體系結(jié)構(gòu)。目前常見的CPU體系結(jié)構(gòu)主要基于復(fù)雜指令集(Complex Instruction Set Computing,CISC)或者精簡指令集(Reduced Instruction Set Computing,RISC),我們常用的Intel的Pentium、Celeron系列以及AMD的Athlon、Sempron系列都是基于復(fù)雜指令集的,而這些基于復(fù)雜指令集的CPU還有32位和64位的寄存器數(shù)據(jù)帶寬區(qū)別。關(guān)于這些指令集以及寄存器數(shù)據(jù)帶寬之間的區(qū)別等內(nèi)容比較繁雜,而且不是本文的重點,感興趣的朋友可以自己在網(wǎng)上搜索相關(guān)內(nèi)容。因為CPU種類的不同,在不同CPU的系統(tǒng)中運行的Windows的啟動過程也有一些小的不同。
基本上,操作系統(tǒng)的引導(dǎo)過程是從計算機通電自檢完成之后開始進行的,而這一過程又可以細分為預(yù)引導(dǎo)、引導(dǎo)、載入內(nèi)核、初始化內(nèi)核,以及登錄這五個階段。
系統(tǒng)引導(dǎo)的不同階段所引用的文件如下:
預(yù)引導(dǎo):
這個過程就是當(dāng)用戶按下電源開關(guān)進行冷啟動所要完成的各種初始化工作,在這文檔中,并不打算很祥細的講解硬件方面的初始化,如果讀者有興趣的話,可以查閱相關(guān)資料,我覺得 《電腦及操作系統(tǒng)的啟動過程》這個還是不錯的。
MBR(MAIn BootRecord):
好了,我們跳過加電自檢,繼續(xù),當(dāng)計算機完成了加電自檢之后,系統(tǒng)BIOS根據(jù)用戶配置的指定順序從相關(guān)的介質(zhì)啟動,當(dāng)然,我們這里分析的是硬盤的。計算機就會檢查磁盤的第0磁道0磁頭1扇區(qū),如果發(fā)現(xiàn)它以0xAA55結(jié)尾,則BIOS認為它是一個引導(dǎo)扇區(qū)(所以主引導(dǎo)扇區(qū)位于整個硬盤的0磁道0磁頭1扇區(qū)),然后將這512B的內(nèi)容加載到內(nèi)存0000:7c00處執(zhí)行。
Windows操作系統(tǒng)獲得控制權(quán)應(yīng)該就是從這里開始的吧,一般MBR是在WindowsSetup程序在安裝Windows時填充的。
其實主引導(dǎo)記錄的作用就是檢查分區(qū)表是否正確以及判別哪個分區(qū)為可引導(dǎo)分區(qū),并在程序結(jié)束時把該分區(qū)的啟動程序(也就是操作系統(tǒng)引導(dǎo)扇區(qū))調(diào)入內(nèi)存加以執(zhí)行。
在真正開始看MBR的代碼時,我們先來了解一下MBR的結(jié)構(gòu)。
如圖:
上面提到了Windows磁盤簽名,這里講解一下,Windows磁盤簽名是Windows系統(tǒng)在對硬盤做初始化時寫入的一個標簽,它是MBR扇區(qū)不可或缺的一個組成部分。Windows系統(tǒng)依靠這個簽名來識別硬盤,如果硬盤的簽名丟失,Windows系統(tǒng)就會認為該硬盤沒有初始化。
因為MBR代碼部分會對DPT(分區(qū)表)進行解析,所以這里再講一下DPT的結(jié)構(gòu):
看到上面這表,可能讀者會問,為啥用了10位來記錄柱面號呢?
其實這是歷史問題了,早期的硬盤是通過磁頭、柱面、扇區(qū)對硬盤進行訪問的,磁頭數(shù)表示硬盤總共有幾個磁頭,也就是有幾張盤,最大為255(剛好一個字節(jié)可以存下,8位),柱面數(shù)表示硬盤每一面盤片上有幾條柱面,最大為1023(10位了),扇區(qū)數(shù)表示每一條磁道上有幾個扇區(qū),最大為63(6位)。
MBR代碼分析:
這一段代碼實現(xiàn)了將內(nèi)存中的MBR搬到安全的內(nèi)存地址處,并通過push以及retf指令實現(xiàn)跳轉(zhuǎn),將執(zhí)行權(quán)交給MBR繼續(xù)執(zhí)行。不過這里做了一個小小的優(yōu)化,沒有將當(dāng)前正在執(zhí)行、且以后用不到的這個入口函數(shù)給優(yōu)化掉了,在拷備的過程中沒有進行拷備。
這段代碼對分區(qū)表進行檢測,檢測到某分區(qū)表項引導(dǎo)標識符小于0。小于0的話跳去CheckAnother,大于0的話跳去CannotBoot。因為前面的表格已經(jīng)說明了,引導(dǎo)標識符只能為00H或80H,在這里80H其實是負數(shù),所以如果標識符為80H的話,走的是上面CheckAnother分支。如果四個分區(qū)項的標識符都為0的話,就調(diào)用int 18H,跳入ROM BASIC。
DBR:
引導(dǎo)扇區(qū)中的代碼隨硬盤文件系統(tǒng)格式的不同而有所不同,其職責(zé)是,給windows提供有關(guān)該硬盤上卷結(jié)構(gòu)和格式方面的信息,并且從該卷的根目錄中讀入windows的加載程序,即ntldr文件;然后將控制權(quán)交給ntldr的入口函數(shù)。為了能夠從根目錄中讀入加載程序,引導(dǎo)扇區(qū)包含了能理解文件系統(tǒng)結(jié)構(gòu)和讀取文件的代碼,這通常只是文件系統(tǒng)極其簡單的一部分功能,而并非完整的實現(xiàn)。