- NTFS文件系統扇區存儲探秘
- 宋群生 宋亞瓊編著
- 2643字
- 2018-12-27 08:01:42
第2章 FAT文件系統的扇區分配
2.1 FAT16的扇區分配
FAT16文件系統由于能被目前所有的操作系統所識別,所以在硬盤分區時使用得極為普遍。特別是安裝多操作系統的硬盤,有時必須在主分區(C盤)使用FAT16文件系統。如果使用不能被某個操作系統識別的文件系統,則該操作系統就不能順利安裝。
現在的硬盤越來越大,硬盤上安裝的應用軟件越來越多,而適合這些應用軟件運行的操作系統不盡相同,特別是編程人員使用的計算機,一般都安裝兩三個操作系統。用于多操作系統引導的有關文件,必須存儲在FAT 1 6格式的分區中,才能被不同的操作系統加載使用。
所以在當前主流文件系統中,盡管FAT16存在著許多缺點,但仍然得到了廣泛的使用。
FAT16文件系統的磁盤扇區是這樣分配的。
在使用FAT16文件系統的分區內,第一個扇區是分區表(C盤)和分區鏈表(D盤和以后的盤),其中C盤的第一個扇區還包含主引導記錄。嚴格地講,分區表所在的扇區不屬于任何分區,但是從物理空間上它們又靠得很近,為了今后在計算扇區編號時比較容易找到規律,暫且將分區表這樣劃分。
之后是系統隱藏扇區,包括含有分區表或分區鏈表在內的扇區,一共占用63個扇區,實際上就是一個磁道所包含的扇區。
系統隱藏扇區之后是分區引導記錄,占用一個扇區。
再往后是兩份相同的文件分配表FAT1和FAT2,每份FAT表占用多少個扇區,由分區的大小而定,分區大所占用的扇區就多,具體數值可從分區引導記錄的BPB表中查得,查找方法可參考第1章的內容。
緊接FAT表之后是文件目錄表FDT,固定占用32個扇區,每個扇區可容納16個登記項,每個登記項的長度是32字節。
FDT表之后是數據區DATA,數據區內的扇區是按照簇來管理的,簇的大小由分區大小而定,它們之間的關系可參考第1章的內容。
扇區分配的情況見表2-1。
表2-1 FAT16文件系統的扇區分配

2.2 FAT16扇區尋址實例分析
詳細了解文件系統的扇區分配是排除硬盤邏輯故障的重要基礎。下面以作者使用的硬盤為例,介紹FAT16文件系統的扇區地址的尋址計算方法。
在進行扇區尋址和計算的過程中,需要用到后面《工具篇》中介紹的一些工具程序,本章先使用這些程序的執行結果,程序的詳細運行方法在后面的章節中再作介紹。
作者使用的計算機上掛接了兩塊硬盤,為了在以后進行扇區掃描時節省時間,特意選用了兩塊小容量的硬盤。一塊容量是6.2GB,接在第一IDE接口上,硬盤編號是“0”。另一塊容量是40GB,接在第二IDE接口上,硬盤編號是“1”。
現在將1號硬盤作為主要操作對象,該硬盤劃分成C、D、E、F、G、H、I七個邏輯驅動器,將0號硬盤作為輔助操作對象。1號硬盤的前五個邏輯驅動器的容量都是2GB,除了F盤使用NTFS文件系統,其余的C、D、E、G盤都使用FAT16文件系統。后兩個邏輯驅動器使用FAT32文件系統,H盤的容量是10GB,I盤的容量是18GB。
下面以E盤為例,介紹FAT16文件系統的扇區分配。
運行“備份系統扇區數據.EXE”程序,就可以將硬盤上所有的邏輯驅動器的系統扇區數據,備份到文件中進行保存。每個邏輯驅動器備份兩個扇區,其中一個是存儲分區表或分區鏈表的扇區,另一個是存儲分區引導記錄的扇區。當分區引導記錄占用多個扇區時,如FAT32和NTFS文件系統,只備份第一個扇區的數據。
程序運行以后,除了每個邏輯驅動器建立兩個備份文件之外,還建立了一個扇區號的備查文件。目的是當系統引導出現故障時,可以將備份出來的數據,再按照原來的扇區號寫回去,就可以修復硬盤。
扇區號備查文件的內容如下。
Boot sector number: 1:0 2:63 3:4192965 4:4193028 5:8385930 6:8385993 7:12578895 8:12578958 9:16771860 10:16771923 11:20964825 12:20964888 13:41447700 14:41447763
根據扇區號備查文件中的記錄,可以讀出E盤存儲分區鏈表的扇區號是“8385930”。再運行“查看硬盤扇區數據.EXE”程序,將“8385930”號扇區的數據顯示在對話框中,程序的運行結果如圖2-1所示。

圖2-1
因為E盤不是第一個邏輯驅動器,所以在圖2-1所示的對話框顯示的數據中,沒有主引導記錄,只有分區鏈表。
找到字節位移1c6H開始的4字節,也就是字節編號455-458,扇區數據中的字節值是“3F 00 00 00”。這是一個雙字,由于存儲時的順序是低字節在前,高字節在后,因此這個雙字寫成十六進制的形式是“0000003fH”,換算成十進制是“63”。
這個數值是分區前的扇區數,也可以看作是系統保留的扇區數。文件系統在檢索文件的過程中,需要進行扇區號計算時,是從分區引導記錄存儲的扇區號開始的,系統保留扇區不計算在內。
在這63個系統保留扇區中,只有最前面的扇區寫有數據,其余62個扇區空置不用。系統保留扇區之后,就是存儲分區引導記錄的扇區。用8385930加上63,就得到分區引導記錄的扇區號是“8385993”。
運行“查看硬盤扇區數據.EXE”程序,將“8385993”號扇區的數據顯示在對話框中,程序的運行結果如圖2-2所示。

圖2-2
在圖2-2所示的對話框顯示的數據中,與當前討論的問題相關的是BPB表,其他的內容不在本書討論的范圍。
解讀E盤BPB表的內容,可以參考第1章中的表1-2來進行。為了簡化敘述的過程,在描述扇區中某一個字節的位置時,只使用字節編號,暫時就不再使用字節位移的概念了。
現在找到第23字節開始的兩字節,存儲在扇區中的數據是“00 01”,也就是“0100H”,十進制是“256”。這一個字段的值,記錄的是每個FAT表占用的扇區數。
先讀出第一FAT表的第一個扇區,因為FAT16文件系統的分區引導記錄只占用1個扇區,而緊接在分區引導記錄之后的就是FAT表,所以第一FAT表的首扇區號是“8385993”加上1,即“8385994”。
運行“查看硬盤扇區數據.EXE”程序,將“8385994”號扇區的數據顯示在對話框中,程序的運行結果如圖2-3所示。

圖2-3
在第1章中曾經介紹過,FAT16文件系統和FAT32文件系統有一個共同的特點,它們的FAT表的首扇區的前兩字節是F8 FF,圖2-3所示的對話框顯示的數據符合這個特征。
用第一FAT表的首扇區號加上每個FAT表占用的扇區數,就是第二FAT表的首扇區號。具體計算方法是8385994+256=8386250。
運行“查看硬盤扇區數據.EXE”程序,將“8386250”號扇區的數據顯示在對話框中,程序的運行結果如圖2-4所示。

圖2-4
將圖2-4所示的對話框顯示的數據與圖2-3所示數據比較一下,可以發現它們完全相同。因此當第一FAT表意外損壞時,可以將第二FAT表的數據拷貝到第一FAT表相對應的扇區中去,覆蓋損壞的數據,就可以修復文件系統。
接下來繼續計算文件目錄表FDT的扇區地址。將第二FAT表的首扇區號,加上每個FAT表占用的扇區數,就是FDT的首扇區號,具體計算方法是8386250+256=8386506。
運行“查看硬盤扇區數據.EXE”程序,將“8386506”號扇區的數據顯示在對話框中。可是FDT表的首扇區不象FAT表的首扇區那樣,有一個“F8 FF”的判斷標志,如何驗證顯示的就是首扇區呢?為了消除這個疑問,可以在顯示了“8386506”號扇區的數據以后,再打開一個對話框,顯示的是其前一個扇區,即“8386505”號扇區的數據。通過兩個對話框數據的比較,就能驗證這個問題,程序的運行結果如圖2-5所示。
如圖2-5所示,左邊的對話框顯示的是“8386505”號扇區的數據,右邊的對話框顯示的是“8386506”號扇區的數據。因為“8386505”號扇區屬于第二FAT表的最后一個扇區,而一般情況下FAT表不會被寫滿,所以該扇區的數據為0。由此可以驗證出,“8386506”號扇區確是FDT表的首扇區。

圖2-5
如果將“8386506”號扇區的數據用字符方式顯示出來,就能觀察到存儲在E盤的部分目錄或文件名。在WINDOWS 2000的32位圖形界面下,有些特殊字符不容易顯示,使用輔助的16位程序,顯示效果要好一些。打開WINDOWS 2000的“命令提示符”窗口,在命令行運行程序READSF.EXE,顯示效果如圖2-6所示。

圖2-6
現在將圖2-6的截圖畫面解釋一下。執行程序時在命令行輸入“readsf/rc”,readsf是可執行文件名,/rc是命令行開關,設定程序用字符方式顯示文件內容。回車后程序顯示提示行“Enter file name:”,輸入需要顯示數據的文件名“fdtfile”,該文件中備份的是“8386506”號扇區的數據,是由“查看硬盤扇區數據.EXE”程序建立的。
在顯示的字符內容中,上面幾行的第一個字符都是“σ”,這個ASCII字符的值是e5H,表示原來的文件已被刪除。下面有幾行顯示出目前存儲的目錄或文件名,如在第11行顯示的“NTCPP”就是一個目錄名。
最后計算數據區DATA的首扇區地址。因為FAT16文件系統的FDT表占用固定的32個扇區,所以用FDT表的首扇區號加上32,就是數據區的首扇區號,計算結果是“8386538”。為了驗證這種推導是否正確,仍然采用前面的方法,將其前一個扇區的數據并列顯示在對話框中加以比較。程序的運行界面如圖2-7所示。

圖2-7
如圖2-7所示,左邊的對話框顯示的是“8386537”號扇區的數據,右邊的對話框顯示的是“8386538”號扇區的數據。因為“8386537”號扇區屬于FDT表的最后一個扇區,而一般情況下FDT表不會被寫滿,所以該扇區的數據為0。由此可以驗證,“8386538”號扇區確實是數據區DATA的首扇區。
2.3 FAT32的扇區分配
FAT32文件系統可以認為是擴展了的FAT16文件系統,因為它的數據結構基本上與FAT16文件系統相同。如FAT表的結構是相同的,只不過簇登記項使用了32位的標識符;文件目錄登記項的字段記錄基本是一樣的,只不過沒有放在固定的FDT表中,而是存儲在數據區中。這種擴充是計算機技術飛速發展的需要,其中最主要的原因是硬盤容量的快速增長。
FAT32文件系統的扇區分配與FAT16文件系統相比較,有一些地方不相同,主要表現在以下幾個方面。
(1)FAT32文件系統使用32位簇標識符,但保留了高4位,實際上只有28位簇標識符,可以訪問228個簇。而FAT16文件系統使用16位簇標識符,只能訪問216個簇。
(2)由于每個簇占用的扇區數的減少,使得簇的數量大大增加,因此每個FAT表占用的扇區數也大大增加了。
(3)FAT32文件系統沒有固定的FDT表,將文件和目錄登記項都作為數據對待,與其他數據一樣存儲在數據區DATA中。
(4)分區引導記錄占用6個扇區,并且有兩個相同的拷貝,共占用12個扇區。FAT表之前的保留扇區數增加到32個。
FAT32文件系統的扇區分配如表2-2所示。
表2-2 FAT32文件系統的扇區分配

2.4 FAT32扇區尋址實例分析
現在以作者的1號硬盤中的H盤為例,說明對FAT32文件系統各部分扇區的尋址計算方法。
根據2.2節中的扇區號備查文件記錄,可以讀出H盤存儲分區鏈表的扇區號。因為每一個邏輯驅動器備份兩個扇區數據,所以與H盤對應的扇區應該是第11和第12個記錄。第11個記錄是分區鏈表扇區號,讀出其值是“20964825”,第12個記錄是分區引導記錄的首扇區號。
運行“查看硬盤扇區數據.EXE”程序,將“20964825”號扇區的數據顯示在對話框中,程序的運行結果如圖2-8所示。

圖2-8
因為H盤不是第一個邏輯驅動器,所以在圖2-8所示對話框顯示的數據中,沒有主引導記錄,只有分區鏈表。
找到字節位移1c6H開始的4字節,也就是字節編號455-458,扇區數據中的字節值是“3F 00 00 00”,換算成十進制是“63”。
這個數值是系統隱藏的扇區數,用20964825加上63,就得到分區引導記錄的首扇區號是“20964888”。
運行“查看硬盤扇區數據.EXE”程序,將“20964888”號扇區的數據顯示在對話框中,程序的運行結果如圖2-9所示。

圖2-9
FAT32文件系統的分區引導記錄有兩個相同的拷貝,每個拷貝占用6個扇區。所以將扇區號20964888加上6,就得到第二份拷貝的首扇區號是“20964894”。
運行“查看硬盤扇區數據.EXE”程序,將“20964894”號扇區的數據顯示在對話框中,程序的運行結果如圖2-10所示。

圖2-10
將圖2-9所示的對話框與圖2-10所示的對話框的內容比較一下,可以發現它們完全一樣。
現在計算第一FAT表的首扇區地址。前面曾講過,FAT32文件系統的分區引導記錄一共保留了32個扇區。所以用分區引導記錄的首扇區號加上32,就得到第一FAT表的首扇區地址,計算方法是20964888+32=20964920。
運行“查看硬盤扇區數據.EXE”程序,將“20964920”號扇區的數據顯示在對話框中,程序的運行結果如圖2-11所示。

圖2-11
在圖2-11所示的對話框顯示的數據中,前兩個字節的值是“F8 FF”,這是FAT表的首扇區標志,不管是FAT16文件系統,還是FAT32文件系統,都具有這種扇區特征。
要繼續計算第二FAT表的首扇區地址,首先必須根據某一個字段值計算出每個FAT表占用的扇區數。
參考第1章中表1-3的內容,知道在FAT32文件系統的BPB表中,每個FAT表占用的扇區數,記錄在分區引導記錄扇區中的第37-40的4字節中。
在圖2-9或圖2-10中,讀出該字段的值是“0D 27 00 00”,十六進制是“270dH”,十進制是“9997”。于是就得到第二FAT表首扇區地址的計算方法是20964920+9997=20974917。
運行“查看硬盤扇區數據.EXE”程序,將“20974917”號扇區的數據顯示在對話框中,程序的運行結果如圖2-12所示。

圖2-12
將圖2-11所示的對話框與圖2-12所示的對話框中顯示的數據比較一下,可以發現它們完全相同。
因為FAT32文件系統沒有FDT表,所以找到第二FAT表以后,最后查找的就是數據區DATA了。用第二FAT表的首扇區號,加上每個FAT表占用的扇區數,就得到數據區的首扇區地址。計算方法是20974917+9997=20984914。
運行“查看硬盤扇區數據.EXE”程序,將“20984914”號扇區的數據顯示在對話框中。為了驗證該扇區是DATA的首扇區,仍然采用以前的方法,將其前一個扇區的數據并列顯示出來,進行比較判斷。程序的運行結果如圖2-13所示。

圖2-13
如圖2-13所示,左邊對話框顯示的是前一個扇區的數據,全部字節都是0,由此可以驗證計算結果是正確的。
前面曾講過,FAT32文件系統將文件目錄登記項作為數據對待,也存儲在數據區中,存儲格式與FAT16基本相同。現在將圖2-13右邊對話框中的數據,用字符方式顯示出來驗證一下。為了使字符顯示的效果好一些,可以運行16位程序 READSF.EXE,程序運行后的顯示界面如圖2-14所示。

圖2-14