操作系統之引導

来源:http://www.cnblogs.com/roucheng/archive/2016/05/30/yindao.html
-Advertisement-
Play Games

系統引導環節是操作系統啟動過程中的最重要環節,也是最容易出問題的環節之一。按照個人電腦的硬體標準,引導環節發生在電腦的硬體系統檢測完畢之後。具體的引導工作,是由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/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作為收購 NeXT 公司的結果,蘋果公司獲得了 NeXTSTEP 架構中的 Mach 和 Objective-C 等設計。儘管 NeXTSTEP 本身已經不再發展了,但是其中的組件在 OS X 中獲得了新生。事實上,可以將 OS X 看成是 Mac OS Classic 和NeXTSTEP 的融合, ...
  • 操作系統:CentOS6.6_32位 控制腳本目錄/etc/rc.d,該目錄下存在各個運行級別的腳本文件,執行ls /etc/rc.d,顯示結果為:init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit。 /et ...
  • 當我們想操控一個硬體的時候,我們有必要先去瞭解這個硬體的一些物理特性,比如如何點亮LED,那麼我們首先就得瞭解LED的一些特性,如下: LED本身有兩個接線點,一個是LED的負極,一個是LED的正極。LED這個硬體本身存在的作用就是亮或者不亮,而我們想要LED亮或者不亮,那就可以通過對LED的正負極 ...
  • Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟體,由伺服器及客戶端程式構成。SMB(Server Messages Block,信息服務塊)是一種在區域網上共用文件和印表機的一種通信協議,它為區域網內的不同電腦之間提供文件及印表機等資源的共用服務。 環境:Win7_64位+VM ...
  • Linux下的C編程實戰(一) ――開發平臺搭建 1.引言 Linux操作系統在伺服器領域的應用和普及已經有較長的歷史,這源於它的開源特點以及其超越Windows的安全性和穩定性。而近年來, Linux操作系統在嵌入式系統領域的延伸也可謂是如日中天,許多版本的嵌入式Linux系統被開發出來,如ucL ...
  • 在定義變數的值時,我們可以使用其它變數來構造變數的值,在Makefile中有兩種方式來在用變數定義變數的值。先看第一種方式,也就是簡單的使用“=”號,在“=”左側是變數,右側是變數的值,右側變數的值可以定義在文件的任何一處,也就是說,右側中的變數不一定非要是已定義好的值,其也可以使用後面定義的值。如 ...
  • 第一篇博客:linux學習筆記1-ubuntu的安裝與基本設置 之中,已經介紹瞭如何安裝linux操作系統,以及一些基本的設置修改。 本篇博客主要介紹linux中的一些基本的控制台命令 ============================================== 連接遠程機器 以指定 ...
  • 每個系統都有線程,而線程的最重要的作用就是並行處理,提高軟體的併發率。針對界面來說,還能提高界面的響應力。 線程分為界麵線程和工作者線程,界面實際就是一個線程畫出來的東西,這個線程維護一個“消息隊列”,“消息隊列”也是界麵線程和工作者線程的最大區別,這個詞應該進到你的腦子裡,根深蒂固的! 如果在界面 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...