技術(shù)學(xué)習(xí)
我曾經(jīng)在有一個(gè)Windows XP的機(jī)器上另裝一個(gè)Windows 2000,結(jié)果2000裝完后XP不能啟動(dòng)了。后來(lái)上網(wǎng)看了一些資料,又幾經(jīng)試驗(yàn),解決了這個(gè)問(wèn)題。這里總結(jié)一下其中的原理,這個(gè)現(xiàn)象很容易在重裝低版本系統(tǒng)后出現(xiàn),而且弄清原理以后,我們可以更自由地處理多系統(tǒng)安裝的問(wèn)題。單個(gè)操作系統(tǒng)的引導(dǎo)過(guò)程是這樣的:首先,主引導(dǎo)記錄(MBR)被加載到內(nèi)存運(yùn)行,它讀取磁盤(pán)分區(qū)表(DPT),查找第一個(gè)活動(dòng)分區(qū)(可引導(dǎo)分區(qū)),該分區(qū)的引導(dǎo)扇區(qū)存放著操作系統(tǒng)的引導(dǎo)記錄。然后,系統(tǒng)引導(dǎo)記錄被加載到內(nèi)存運(yùn)行,它從系統(tǒng)安裝目錄讀取系統(tǒng)的啟動(dòng)文件,將其加載執(zhí)行,控制隨后的啟動(dòng)過(guò)程。
這里面涉及到一些程序和數(shù)據(jù),它們存放在不同的地方,在不同階段運(yùn)行。第一段程序MBR,它的數(shù)據(jù)是DPT,它們存放在磁盤(pán)的主引導(dǎo)扇區(qū)。第二段程序是系統(tǒng)引導(dǎo)記錄,存放在系統(tǒng)所在分區(qū)的引導(dǎo)扇區(qū)。第三段程序是系統(tǒng)啟動(dòng)文件,存放在系統(tǒng)所在分區(qū)系統(tǒng)安裝目錄中。這三段程序像接力跑一樣,前一段程序的工作就是加載后一段程序,并把控制交給它。 引導(dǎo)記錄和啟動(dòng)文件隨操作系統(tǒng)而不同, 是在安裝時(shí)形成的,每個(gè)系統(tǒng)的安裝程序都把其引導(dǎo)記錄寫(xiě)入安裝分區(qū)的引導(dǎo)扇區(qū),而啟動(dòng)文件是系統(tǒng)的一部分。 上面的引導(dǎo)過(guò)程有一個(gè)基本缺陷,就是只能引導(dǎo)一個(gè)系統(tǒng),并且只能引導(dǎo)裝在第一活動(dòng)分區(qū)的系統(tǒng)。如果一個(gè)操作系統(tǒng)不在活動(dòng)分區(qū),那么該系統(tǒng)要被引導(dǎo)有三種辦法,改寫(xiě)MBR,改寫(xiě)第一活動(dòng)分區(qū)引導(dǎo)記錄,或把所在分區(qū)設(shè)為第一活動(dòng)分區(qū)。最后一種做法是不方便的,系統(tǒng)通常會(huì)改寫(xiě)前兩段引導(dǎo)程序,那么它在解決自身引導(dǎo)問(wèn)題的同時(shí),也不能破壞其他系統(tǒng)的引導(dǎo),這就引出了多系統(tǒng)地引導(dǎo)問(wèn)題。常見(jiàn)的做法是系統(tǒng)提供一個(gè)啟動(dòng)管理器接管引導(dǎo)過(guò)程。啟動(dòng)管理器能夠獲得機(jī)器上多個(gè)系統(tǒng)的引導(dǎo)記錄,從而可以根據(jù)用戶選擇啟動(dòng)不同的系統(tǒng)。系統(tǒng)在安裝時(shí)改寫(xiě)磁盤(pán)第一活動(dòng)分區(qū)的引導(dǎo)記錄,使啟動(dòng)管理器被作為第三段程序加載。如果啟動(dòng)管理器能夠知道機(jī)器上每個(gè)系統(tǒng)所在的分區(qū),就能獲得該系統(tǒng)的引導(dǎo)記錄,從而可以引導(dǎo)該系統(tǒng)。但實(shí)際上,啟動(dòng)管理器所屬系統(tǒng)的引導(dǎo)記錄是不能再次被加載的,必須特殊對(duì)待。同一系列的系統(tǒng),也可能有類似的問(wèn)題。所以啟動(dòng)管理器可能要了解機(jī)器上每個(gè)系統(tǒng)具體如何啟動(dòng),相應(yīng)進(jìn)行引導(dǎo)。這樣只有讓高版本的系統(tǒng)提供啟動(dòng)管理器,因?yàn)榈桶姹镜膯?dòng)管理器無(wú)法啟動(dòng)高版本系統(tǒng)。2000/XP的啟動(dòng)管理器是OS Loader。它對(duì)98和2000/XP的引導(dǎo)就是不同的,對(duì)98是加載98引導(dǎo)記錄的鏡像文件,對(duì)2000/XP是加載HAL.DLL等文件。OS Loader在引導(dǎo)多系統(tǒng)時(shí),對(duì)于windows系列的引導(dǎo)有特殊性,必須向下兼容。
OS Loader的載體是ntldr文件,它運(yùn)行時(shí)還會(huì)讀取一個(gè)配置文件boot.ini,兩個(gè)文件都存放在磁盤(pán)第一活動(dòng)分區(qū)根目錄。boot.ini記錄了每個(gè)系統(tǒng)所在的分區(qū),每個(gè)版本的windows在安裝時(shí)都會(huì)在boot.ini中填寫(xiě)有關(guān)自身的一項(xiàng)。2000/XP在安裝時(shí)都會(huì)更新OS Loader和重寫(xiě)第一活動(dòng)分區(qū)的引導(dǎo)記錄,后安裝者的兩個(gè)程序才會(huì)被保留。如果后裝2000,由于前述的OS Loader版本問(wèn)題,就可能無(wú)法引導(dǎo)XP。
Powered by: C++博客 Copyright © 依舊的博客