系統引導環節是操作系統啟動過程中的最重要環節,也是最容易出問題的環節之一。按照個人電腦的硬體標準,引導環節發生在電腦的硬體系統檢測完畢之後。具體的引導工作,是由BIOS完成的。BIOS維持一個可用於引導電腦的硬體設備列表,比如本地硬碟、本地光碟機、網路、USB介面設備等,然後做一個排序。BIOS ...
系統引導環節是操作系統啟動過程中的最重要環節,也是最容易出問題的環節之一。按照個人電腦的硬體標準,引導環節發生在電腦的硬體系統檢測完畢之後。具體的引導工作,是由BIOS完成的。BIOS維持一個可用於引導電腦的硬體設備列表,比如本地硬碟、本地光碟機、網路、USB介面設備等,然後做一個排序。BIOS會試圖從整個序列的第一個設備開始,檢查其狀態和引導能力。比如針對光碟機,則首先會判斷光碟機中是否存在光碟,如果不存在,則跳過光碟機設備,進入下一個設備的檢測過程。如果發現有光碟存在,則試圖讀取光碟的第一個扇區,並檢查這是否是一個可引導扇區(比如通過檢查扇區的最後兩個位元組是不是0x55AA)。如果發現不是一個可引導扇區,則也是跳過光碟,再檢查引導序列中的下一個設備,直到發現一個可引導的扇區為止。如果遍歷完整個引導設備列表,未找到任何可引導的扇區代碼,則引導過程失敗,BIOS會提示無法找到可啟動設備。如果在這個過程中能夠找到一個可引導扇區,則BIOS會把該扇區的內容載入到記憶體,並跳轉到該扇區,執行引導代碼。這個跳轉指令,就是BIOS程式在電腦啟動過程中的最後一條指令,至此,BIOS的工作結束。後續工作,將由引導扇區代碼完成。
由此可見,BIOS在電腦引導過程中的角色是非常重要且複雜的。但是由於其獨立於操作系統的實現,不是我們重點分析的範疇。在本文中,我們重點分析引導扇區被載入到記憶體,並開始執行後的過程。這個過程屬於操作系統的作用範疇,而且是操作系統生命周期的最開始部分。本文將以硬碟為例,首先分析硬碟的邏輯結構和主引導記錄(MBR)的作用,然後再分析不同的文件系統下,操作系統引導扇區的功能差異和實現差異,以及每種實現的功能缺陷。最後給出一種剋服了這些缺陷的一種引導程式製作方法-預置引導法,並以Hello China操作系統的引導程式為實例,說明這種方法的應用。
硬碟邏輯結構及引導扇區的功能
可以在邏輯上把硬碟理解為一個線性數組,這個數組的元素就是扇區。每個扇區按照其在硬碟上的位置進行編號,第一個扇區就是大名鼎鼎的MBR(主引導區,Master Boot Record)。
為了管理上的方便,一個硬碟可以劃分為若幹個邏輯分區,每個分區占據了硬碟上的一部分連續的存儲空間。一般情況下,分區在硬碟上的位置和大小,可用其在硬碟上的起始扇區號、扇區數量進行描述。目前的實現是,一個物理硬碟,最大可以分成四個分區,分區的位置、大小、屬性等信息,記錄在一個只有四個元素的線性表裡,這個表就是分區表。
分區表就存放在MBR中,且在MBR中的固定位置處。因為一般情況下,硬碟的每個扇區的容量是512位元組,如果分區表在MBR中的位置不固定,就無法明確讀出分區表的內容。但分區表卻不是MBR的唯一內容,MBR還存放了引導扇區代碼。BIOS在發現一個可引導的硬碟之後,會把MBR的代碼讀入記憶體,然後跳轉到開始處執行。需要說明的是MBR的代碼一般是操作系統無關的。這可能會引起一些疑惑,下麵稍作解釋。
操作系統是安裝在硬碟分區上的,至少到目前為止,我還不知道有哪個操作系統,不對硬碟進行分區(或者說把整個硬碟看做一個分區),而直接安裝。而操作系統本身特定的引導代碼,是放在其所在分區的第一個扇區上的。比如,一個硬碟被劃分成了兩個分區,一個分區的起始扇區號是2(MBR的扇區號是1),扇區數量是M。另外一個分區的起始扇區號是M+2,扇區數量是N。假設第一個分區上安裝的是WINDOWS操作系統,第二個分區上安裝的是Linux操作系統。這樣,WINDOWS操作系統的引導扇區,是2個物理扇區(第一個分區的第一個扇區),而Linux的引導扇區,則是第M+2個物理扇區。顯然,這兩個(第2個和第M+2個)引導扇區是與操作系統強相關的。
但BIOS最初讀入的是MBR。一旦跳入MBR執行,BIOS就撒手不管了。這時候MBR上的代碼,必須能夠找到Windows或Linux的引導扇區,並把它們讀入記憶體中,完成相應操作系統的引導。因此MBR功能代碼本身,需要完成兩個問題的決策:
1、 在硬碟上有多個分區,每個分區都有可能安裝操作系統的情況下,如何選擇一個分區進行繼續引導?
2、 如果確定了一個分區,如何得到這個分區的引導扇區的物理位置(即扇區在整個物理磁碟上的編號)?
顯然,在第一個問題確定的情況下,第二個問題很容易解決。因為這時候分區編號已經確定,只要讀取分區表,並找到對應的記錄,就可讀出該分區的第一個扇區的編號,這就是引導扇區。對於第一個問題,是通過在分區表中設置一個活動標誌解決的。每個分區表項(對應一個分區)中,都有一個位元組,叫做活動標誌,且四個分區表項中,必須只有一個分區的活動標誌被設置,這個分區就是活動分區。安裝在這個分區上的操作系統會被引導。具體是由誰來設置這個標誌呢?答案是操作系統。在操作系統安裝的時候,會讓你選擇要安裝的分區(比如Windows,會列出硬碟的分區情況,用C:、D:等盤符表示)。一旦選定一個分區,Windows安裝程式就會把該分區對應的分區表項的活動標誌設置為1,同時清除其它分區表項的活動標誌。
按照這種規則,最後安裝的操作系統,往往會“壓制”以前安裝的操作系統,使得先前安裝的操作系統無法引導。但只要知道了這個過程,我們就可以通過一些工具,改變這種情況。比如你最後安裝的是windows操作系統,在啟動到Windows操作系統之後,可以通過運行在Windows操作系統上的工具,把Linux操作系統所在分區修改為活動分區。這樣在下一次啟動的時候,Linux就會被引導。但是為了安全起見,操作系統都提供了對MBR的保護功能,不能直接寫入MBR。這樣就很麻煩了,一旦你安裝了windows,就意味著原有的Linux(與新安裝的windows在不同分區)不能用了。但這也不是絕對的,比如可以通過光碟引導的操作系統,來修改MBR。或者可以在WIN分區上安裝Hello China,由Hello China幫你完成修改活動分區標誌的工作。
再繞回原題,MBR根據活動標誌選擇一個分區,並根據分區表中的分區起始位置確定操作系統引導扇區,然後把該扇區讀入記憶體,並跳轉到起始位置處繼續執行。由此可見,MBR本身,是與特定操作系統無任何關係的。實際上,MBR扇區的可執行代碼,自從DOS開始,就一直沒有改變過。
一個物理硬碟最多有四個分區,某些軟體公司,比如MS,認為這是不夠的。於是又發明瞭一種技術,叫做擴展分區。擴展分區本質上就是一個硬碟分區(四個分區之一),但是在此基礎上,又進行進一步擴展,把一個分區再進行細分,分為更小的分區(這些更小的分區叫邏輯分區),即分區套分區的結構。與硬碟的MBR一樣,邏輯分區的相關信息,被記錄在擴展分區的第一個扇區上。但是與普通分區不一樣的是,擴展分區上的邏輯分區是不能引導操作系統的,即操作系統不能安裝在邏輯分區上。既然操作系統不能安裝在邏輯分區上,那麼肯定也不能安裝在擴展分區上了。因為擴展分區是邏輯分區的“容器”,其本身沒有空間存儲操作系統文件。因此要安裝操作系統,必須要安裝在普通的磁碟分區上。為顯示這種“容納”操作系統的特性,普通分區又被冠以“主要分區”的稱號。
至此,下列一些概念或原理,您應該清楚了:
1、 MBR和分區表;
2、 MBR上的代碼與操作系統無關;
3、 操作系統特定的引導扇區,是其所安裝分區的第一個扇區;
4、 分區活動標誌;
5、 主要分區、擴展分區、邏輯分區;
6、 MBR與操作系統引導扇區的關係。
操作系統引導扇區的功能和局限
接下來我們把目光轉移到操作系統引導扇區上,即操作系統所在分區的第一個扇區。操作系統引導扇區與操作系統密切相關,其主要功能就是,在操作系統分區上,找到引導操作系統內核相關的文件,完成操作系統的載入。這裡說的“引導操作系統相關的文件”,既可能是操作系統核心模塊,也可能是為進一步引導操作系統核心模塊而作准備的一些可執行代碼。畢竟現代操作系統十分複雜,核心模塊很大,無法直接完成引導。這樣就可能有一些輔助的引導模塊,畢竟引導扇區代碼的功能是十分有限的。
但不論如何,引導扇區的代碼必須在操作系統所在分區的文件系統里找到一個模塊(實際上是一個文件),並載入到記憶體。因此下列兩項功能是引導扇區代碼的核心:
1、 在分區的文件系統上,找到一個特定文件;
2、 把這個文件裝入記憶體,並跳轉執行。
第二項工作比較容易,一般情況下,引導扇區還是運行在CPU的實模式下(以PC為例),可以調用BIOS提供的磁碟讀寫服務,很容易把文件讀入記憶體。關鍵是第一項工作,如何在一個文件系統里搜索到一個特定的文件。實際上“搜索到一個文件”也不是關鍵,關鍵是如何以“一個扇區”的代碼、在一個複雜的文件系統里找到一個想要的文件。這裡的兩個因素,形成一對矛盾:
1、 引導扇區代碼尺寸有限,比如只有512位元組,無法適應複雜的計算要求;
2、 文件系統結構複雜,訪問文件系統所需要的代碼量很大。
引導扇區需要很好的平衡這對矛盾,以使得引導過程能夠繼續。一般情況下,有下列幾種方式解決這個問題:
1、 擴展引導扇區大小。一般認為,操作系統引導扇區是512位元組,操作系統的初始引導完全是由這512位元組代碼完成的。實際上不然,很多操作系統,比如Windows,已經大大擴展了引導扇區尺寸。既然整個分區都是操作系統的地盤,那麼每個分區怎麼使用,就完全由操作系統決定了。引導扇區是分區的第一個扇區,這個不能變。那麼我完全可以把第二個、第三個、…第N個扇區也作為引導扇區。第一個扇區只是作為跳板,MBR把第一個扇區讀入記憶體並運行後,第一個扇區再把後面連續的一片扇區讀入記憶體,這些所有的扇區共同組成引導模塊。這樣無論文件系統多麼複雜,我只要多分配幾個扇區,就可以裝下訪問文件系統的代碼了。顯然,這種方式很有效,且被廣泛採用。比如windows操作系統,在NTFS文件系統上的引導扇區,就有16個(0~15號扇區),有8K的代碼空間。這對分析NTFS文件系統並讀取引導文件(比如NTLDR),就足夠了;
2、 引導扇區維持一個不變,但是固定操作系統核心或相關文件在磁碟上的位置。還是那句話,整個地盤都是我的,我願意安排誰在哪裡都行。操作系統可以把引導相關的代碼固定在磁碟的一個特定位置上,比如1024號扇區位置處。這樣引導扇區就無需分析文件系統了,直接從1024號扇區處讀取操作系統核心就行了。這種策略在DOS時代似乎被用過。記得我在上大學的時候,製作了一張DOS啟動軟盤,上面有IO.SYS等文件。有一次把IO.SYS文件刪除了,又重新拷貝了一個進去,結果就不能啟動DOS了。據此推測,DOS可能把IO.SYS等固定在了軟盤的某個位置。一旦刪除再拷貝,其位置變化了,就直接導致不能引導。
上述兩種解決方案都有其局限性。第一種方案,在一個分區上只安裝一個操作系統,或者安裝相同軟體廠商的不同操作系統時是有效的,但如果安裝兩個不同廠商的操作系統,可能就會有問題。假設操作系統A和B都使用的是第一種策略,A先安裝到分區上。在第二個操作系統B安裝的時候,為了能同時引導A系統,B會把A的引導扇區(第一個扇區)備份到一個文件里(比如windows系統下的BOOTSECT.DOS),然後把自己的引導扇區(可能連續幾個)寫入分區的開始處。這樣A操作系統除第一個以外的引導扇區,都被B覆蓋了。顯然,這時候是無法再次引導A系統的。但是如果A和B是同一個軟體公司的產品,比如Windows 98系列和Windows 2000/XP系列,由於都是微軟開發,對引導扇區的結構和數量都是已知的,這樣在windows 98上安裝xp或其它更高版本的OS的時候,更高版本的OS(比如XP)就會把原有系統的所有引導扇區都統一打包到一個文件里,這樣就不會出現覆蓋問題。如果這種打包仍然有問題(比如第一個扇區會調用BIOS服務讀取後續扇區,即使打包了,也無法改變這種動作),xp甚至會用修改已打包後的引導扇區文件。這裡的關鍵就是,最新版本的操作系統,對原有版本的操作系統能夠識別,並作出有效處理。
第二種方案的缺點是,需要文件系統的良好支持。比如你固定了某個文件的位置,而且要求該位置不能變動(除非文件被刪除),這樣就要求文件系統不能隨便改變文件位置(或者針對操作系統文件做單獨處理),否則這種方法就會失效。這顯然是苛刻的,導致的結果就是,由於文件系統不能改變已有文件的位置,會導致大量的磁碟碎片產生。常用的文件系統,比如FAT、NTFS、EXT等,都不提供這種功能。因此第二種方案的應用範圍非常有限。只有早期的一些操作系統會採用,目前大部分操作系統都採用第一種方案進行設計。
至此,下列一些概念或原理,您應該已經清楚:
1、 操作系統的引導扇區可能不止一個;
2、 對於FAT32/NTFS等複雜的文件系統,需要多個引導扇區才能完全容納引導代碼;
3、 可通過固定操作系統核心文件在磁碟上的位置,來確保引導代碼只占一個扇區;
4、 不同廠商操作系統很難共存於同一個分區的原因。
那麼,是否就意味著一定不能在同一個分區上安裝不同生產廠家提供的操作系統呢?我認為答案是否定的,我們可以通過一些設計,來有效協調不同廠商的操作系統,在同一個分區上和諧共存。在Hello China操作系統的設計中,就採用了一種稱為“預置引導法”的策略,有效規避了上述兩個問題。
預置引導法的整體思路是,在操作系統安裝的時候,根據實際硬碟的文件系統情況,預先讀取操作系統核心模塊在磁碟上的物理位置,並直接寫入引導扇區。這樣引導扇區在引導操作系統的時候,就無需再自行分析文件系統、確定操作系統核心文件的位置了,而只要從引導扇區中預先設定的位置中,把文件在磁碟上的物理位置找出來,載入進記憶體即可。可見,預置引導法有一個前提:一旦操作系統核心文件被寫入硬碟,其位置也不能變動。因為核心文件在磁碟上的位置,會被寫入引導扇區。如果文件的位置改變,則仍然無法引導。這顯然也是苛刻的,與固定操作系統在磁碟上的位置的策略有同樣限制(但這兩者有根本不同,預置引導法要求操作系統核心文件在磁碟上的位置不變即可,其位置不固定,具體位置是文件被拷貝到磁碟上時確定的。而固定操作系統核心模塊在磁碟特定位置的做法,則是要求系統文件一定要位於磁碟的某個固定位置,比如1024扇區開始)。
我們可以通過一些策略,來改進預置引導法,使得該方法能夠避免上述局限。總體改進策略就是,在操作系統安裝的時候動態生成(或動態配置)引導扇區內容,把能夠固定的數據,事先寫入引導扇區,避免引導扇區自行計算這些參數,從而降低引導扇區的代碼量。比如,大部分引導扇區都需要計算一個cluster的大小,具體計算方法是根據每個扇區的位元組數,乘以每個cluser的扇區數。顯然,在操作系統安裝的時候,cluster的大小就固定了。因此可直接在引導扇區中設置一個變數(cluster的尺寸),並寫入cluster的尺寸值。這樣引導扇區就無需計算cluster的大小,而直接引用即可。這種方法可大大減少引導扇區代碼量。
下麵以Hello China操作系統的引導程式為例,針對不同的文件系統,來說明預置引導法的設計思想。
預置引導法在FAT32文件系統上的實現
顯然,FAT32文件系統是一個相對複雜的文件系統,一個引導扇區的空間,很難裝載完整的引導代碼,因為即使操作系統核心文件放在根目錄下,也需要搜索整個根目錄,找到操作系統文件,並載入該文件。這個過程需要兩個扇區左右的代碼量。但是通過預置一些變數到引導扇區,可以大大減少FAT32文件系統的引導扇區尺寸,使得能夠容納在一個引導扇區中。比如,下列是標準的引導扇區的佈局:
欄位名稱 欄位偏移 欄位長度 含義
BS_jmpBoot 0 3 跳轉代碼
BS_OEMName 3 8 OEM名字
BPB_BytsPerSec 11 2 每扇區長度(位元組數)
BPB_SecPerClus 13 1 每cluster的扇區數
BPB_RsvdSecCnt 14 2 保留扇區數
BPB_NumFATs 16 16 1 FAT16的數量
BPB_RootEntCnt 17 2 有多少個根目錄
BPB_TotSec16 19 2 FAT32已廢棄
BPB_Media 21 1 媒體類型
BPB_FATSz16 22 2 FAT16文件分配表長度
BPB_SecPerTrk 24 2 每磁軌扇區數
BPB_NumHeads 26 2 磁頭數
BPB_HiddSec 28 4 隱藏扇區數
BPB_TotSec32 32 4 分區總扇區數
……
此後就是可執行的引導代碼。
顯然,這其中的很多信息是無用的,尤其是在FAT32文件系統上。比如BPB_TotSec16等變數。在配置啟動扇區的時候,我們可以把這些變數省略,以騰出更多的空間來安排引導代碼,使得FAT32文件系統的分析功能代碼能夠放到一個扇區內。下麵是經過“預置”處理後的引導扇區結構:
; 3位元組的跳轉指令
JMP SHORT _BOOT_CODE ; 跳轉到真正的引導代碼
NOP ; 空指令以保證位元組數為3
SectorsPerCluster DB 00 ; 每個簇的扇區數 ( 1 2 4 8 16 32 64 128 )
ReservedSectors DW 00 ; 從捲的第一個扇區開始的保留扇區數目;
NumberOfFATs DB 00; 捲上FAT數據結構的數目,該值通常應為2
HiddenSectors DD 00; 包含該FAT捲的分區之前的隱藏扇區數
SectorsPerFAT32 DD 00; 對於FAT32,該欄位包含一個FAT的大小
RootDirectoryStart DD 00; 根目錄的起始簇號,通常為2;
DriveNumber DB 00 ; 用於INT 0x13的驅動器號,0x00為軟盤,0x80為硬碟
此後跟著真正的可執行代碼。
這樣預置後,不但節約了大約20位元組的空間,而且很多變數已經被預置(這些被預置的變數,稱為預置變數),無需計算(比如cluster大小)。而如果按照傳統的引導扇區,則需要安排專門代碼計算這些變數值。這樣綜合下來,可節約大約60位元組的空間。不要小看這60個位元組,在彙編語言實現的引導扇區中,60個位元組可以實現分析FAT32根目錄項的功能,而這是FAT32引導扇區的核心功能。
同時,可以優化啟動扇區的代碼,省略一些不必要的判斷。比如int13號調用功能,目前基本所有BIOS都提供這項功能,就無需判斷BIOS是否支持int13調用了。同時,由於操作系統是運行在32位CPU上,可通過使用CPU的32位寄存器(比如EAX、EBX等)和32位指令增加數據處理範圍,以節約代碼量。
具體實現過程是,在Hello China的安裝過程中,提供一個磁碟分析工具,用於讀取或計算cluster的尺寸等預置變數,然後寫入引導扇區。
經過上述措施後,Hello China實現了在一個引導扇區內,引導FAT32文件系統上的操作系統的功能。而通常情況下,這些功能是需要在兩個以上的扇區內實現的。
而這種實現方法,是不需要操作系統核心文件在硬碟上固定位置的。雖然對某些變數做了預置,但是引導過程並沒有改變,引導扇區還是首先讀入根目錄,在根目錄中搜索操作系統核心文件。找到後再查詢FAT表,找到操作系統核心文件在磁碟上的具體位置,然後依次讀入。因此,即使操作系統核心文件的位置不斷變化,也不會影響操作系統的載入。顯然,這種“預置引導法”既剋服了操作系統引導扇區過大的問題,也規避了固定操作系統核心文件位置的不利之處。
預置引導法在NTFS文件系統上的實現
相比FAT32,NTFS是一個更加複雜的文件系統。我們通過預置引導法,可以勉強將FAT32的引導代碼塞到一個扇區里,但是對NTFS來說,這是絕對不可能的。在MS的windows系列操作系統中,NTFS分區的引導扇區一共用了16個(也就是說,要引導NTFS上的操作系統文件,需要8K的代碼空間)。因此只能更進一步的使用預置引導法。
預置引導法最徹底的用法是,把操作系統核心文件在磁碟上的位置及分佈情況,全部寫入引導扇區。引導扇區不做任何文件系統相關的分析代碼,直接根據寫入的數據讀取磁碟分區即可。比如,操作系統核心文件存儲在磁碟上的佈局如下:
起始扇區號 扇區數量
2048 512
4096 512
8000 256
即操作系統核心文件在磁碟上分成了三部分存儲,第一和第二部分分別占用連續的512個扇區,第三部分占用連續的256個扇區。可以算出,操作系統核心文件的大小是640K。這時候可以把上面的表格,直接寫入引導扇區。比如,如下是引導扇區開始部分的代碼:
JMP SHORT _BOOT_CODE ; 跳轉到真正的引導代碼
NOP ; 空指令以保證位元組數為3
startSectNum1 DD 00
sectorCount1 DD 00
startSectNum2 DD 00
sectorCount2 DD 00
startSectNum3 DD 00
sectorCount3 DD 00
此後緊跟真正的引導代碼。
一旦操作系統在NTFS磁碟分區上安裝完成,操作系統核心文件的位置就固定了(即就是上面表格中的描述)。這時候可以通過一個工具軟體,讀取操作系統核心文件的位置信息,然後寫入引導扇區中startSectNum和sectorCount的位置處。這樣真正的引導扇區代碼,無需做任何NTFS文件系統分析工作,只需要根據startSectNum和sectorCount處的信息,把相應扇區讀入記憶體即可。顯然,這樣的預置變數和磁碟讀取代碼加在一起,絕不可能超過512位元組。
但這樣處理的問題也很明顯,就是要求操作系統核心文件在磁碟上的位置一定要固定。一旦文件系統挪動了操作系統核心文件的位置,則就無法引導。顯然,對NTFS文件系統來說,這幾乎是不可能的。為了充分避免碎片,NTFS可能會定期對文件系統進行掃描和碎片整理,通過移動文件在磁碟上的具體位置,把不連續的磁碟空間鏈接起來。
為避免由於文件位置的變動而導致的無法引導問題,我們需要更進一步,把更加位置更加穩定的內容寫入引導扇區。為了找出位置更加穩定的內容,我們首先從分析NTFS文件系統原理開始。需要說明的是,NTFS文件系統內容非常龐大,在這裡只對幾個關鍵概念進行描述。詳細的NTFS文件系統信息,請參考NTFS文件規範等相關資料。
NTFS文件系統中,分區上任何文件的具體位置,都是記錄在MFT(主文件表)中。而MFT本身的起始位置,則是在引導扇區中存儲。操作系統在處理NTFS文件系統的時候,首先從NTFS分區的引導扇區中獲取MFT的位置,然後讀取MFT的相關內容。對任何文件的查找,NTFS也是根據文件名等關鍵欄位搜索MFT(實際上是從根目錄開始逐級搜索),找到對應的文件記錄,然後獲取到文件在磁碟上的存儲位置(NTFS中叫做數據運行,data run)。一旦一個文件被創建或被拷貝到磁碟上,NTFS文件系統代碼就會在MFT中分配一個記錄,記錄該文件的相關信息。對我們來說,文件的位置信息是最關鍵的。一般情況下,文件記錄在MFT中的位置是固定的。同時,MFT本身的位置也是固定的(雖然從理論上講,MFT本身位置也可以不固定,但是一般NTFS文件系統的實現,MFT的位置都是固定的)。即使文件本身被移動,NTFS文件系統代碼也只是修改文件的MFT記錄,更確切的說,是文件記錄中的數據運行屬性(data run),已反映出文件在分區內的最新位置信息。
因此,從上面的分析來看,只要我們把操作系統核心文件所對應的MFT記錄所在的扇區預先置入引導扇區,就可保證不出問題。假設操作系統核心文件被移動位置,這時候NTFS文件系統代碼會修改對應的MFT記錄,而MFT記錄本身所在位置不會變化。
基於這個原理,在NTFS文件系統上的預置引導法,預先置入引導扇區的是操作系統核心文件所對應MFT記錄所在的位置。這樣引導扇區只要根據這個預置位置,讀取操作系統文件的MFT記錄,然後從記錄中讀出文件的數據運行(即位置信息),再分析數據運行、載入操作系統文件即可。
Hello China操作系統在NTFS文件系統上的引導程式,就是這樣實現的。在Hello China的安裝程式中,安裝程式首先把操作系統核心文件(HCNIMGE.BIN)拷貝到NTFS分區的根目錄下,然後運行一個NTFS文件系統分析工具,讀出HCNIMGE.BIN文件所對應的MFT記錄在磁碟上的扇區號,再把這個扇區號寫入引導扇區的預置變數中。這樣引導扇區在引導操作系統的時候,只需要根據預置的磁碟扇區編號,讀入HCNIMGE.BIN對應的文件記錄,然後根據文件記錄找到數據運行,分析數據運行,並讀取即可。
即使如此,在512位元組的引導扇區中實現NTFS文件系統的引導程式,也有點困難。主要是數據運行的解碼程式有點複雜,占用了大部分的代碼空間。
對Hello China引導程式實現代碼的說明
Hello China操作系統V1.69版中針對FAT32和NTFS文件系統的引導程式,都是通過預置引導法實現的。可通過閱讀引導程式的源代碼,獲得對本文更進一步的理解。所有代碼(包括Hello China操作系統核心模塊代碼)都可以通過下列鏈接下載:
http://download.csdn.net/detail/hellochina15/3846735
其中,與引導程式相關的源文件說明如下:
1、 FAT32和NTFS文件系統的引導扇區代碼(彙編語言編寫),存放在sysinit目錄下。HDBS.ASM是針對FAT32文件系統的引導扇區代碼,NTFSBS.ASM則是NTFS的引導扇區代碼;
2、 Dumpf32目錄下,存放了FAT32文件系統引導扇區的修改程式。該程式讀取安裝分區的相關信息,然後寫入引導扇區程式;
3、 MKNTFSBS目錄下,存放了NTFS文件系統下引導扇區的修改工具。該工具分析Hello China安裝分區的根目錄,找到HCNIMGE.BIN(操作系統核心模塊)所對應文件記錄的磁碟扇區編號,並寫入引導扇區。同時寫入的還有其它預置變數,比如cluster大小等。
如有任何相關問題,可與 何問起 聯繫討論。
http://www.cnblogs.com/roucheng/