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