官术网_书友最值得收藏!

2FAT文件系統的扇區分配

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

主站蜘蛛池模板: 岱山县| 新竹市| 博野县| 永顺县| 屏东县| 修文县| 宜良县| 古浪县| 合作市| 湖南省| 双桥区| 日照市| 马鞍山市| 嵩明县| 萍乡市| 肥乡县| 江达县| 贵溪市| 蕉岭县| 绥滨县| 三门县| 海口市| 华坪县| 教育| 灵石县| 新沂市| 历史| 台北县| 镇宁| 舟曲县| 桂东县| 蒙山县| 南康市| 琼中| 临汾市| 南乐县| 安岳县| 龙海市| 柏乡县| 石台县| 江门市|