檔案配置表FAT(File Allocation Table)
最後更新:2018-12-05
來源:互聯網
上載者:User
檔案配置表是用來表示磁碟檔案的空間分配資訊的,它不對引導區、檔案目錄表的資訊進行表示,也不真正隱藏檔內容.
檔案佔用磁碟空間時,基本單位不是位元組而是簇。簇的大小與磁碟的規格有關,一般情況下,磁碟片每簇是1個扇區,硬碟每簇的扇區數與硬碟的總容量大小有關,為2的n次方,可能是4、8、16、32、64……
由於FAT對於檔案管理的重要性,所以FAT有一個備份,即在原FAT的後面再建一個同樣的FAT。初形成的FAT中所有項都標明為"未佔用",但如果磁碟有局部損壞,那么格式化程式會檢測出損壞的簇,在相應的項中標為"壞簇",以後存檔案時就不會再使用這個簇了。FAT的項數與硬碟上的總簇數相當,每一項佔用的位元組數也要與總簇數相適應,因為其中需要存放簇號。FAT的格式有多種,最為常見和為讀者所熟悉的是FAT16和FAT32,其中FAT16是指檔案配置表使用16位元字,由於16位分配表最多能管理65536(即2的16次方)個簇,也就是所規定的一個硬碟分區。
由於每個簇的儲存空間最大隻有32KB,所以在使用FAT16管理硬碟時,每個分區的最大儲存容量只有(65536×32 KB)即2048MB,也就是我們常說的2G。現在的硬碟容量是越來越大,由於FAT16對硬碟分區的容量限制,所以當硬碟容量超過2G之後,使用者只能將硬碟劃分成多個2G的分區後才能正常使用,為此微軟公司從Windows 95 OSR2版本開始使用FAT32標準,即使用32位的檔案配置表來管理硬碟檔案,這樣系統就能為檔案分配多達4294967296(即2的32次方)個簇,所以在簇同樣為32KB時每個分區容量最大可達65G以上。此外使用FAT32管理硬碟時,每個邏輯盤中的簇長度也比使用FAT16標準管理的同等容量邏輯盤小很多。由於檔案儲存體在硬碟上佔用的磁碟空間以簇為最小單位,所以某一檔案即使只有幾十個位元組也必須佔用整個簇,因此邏輯盤的簇單位容量越小越能合理利用儲存空間。所以FAT32更適於大硬碟。
檔案佔用磁碟空間時,基本單位不是位元組而是簇。簇的大小與磁碟的規格有關,一般情況下,磁碟片每簇是1個扇區.
硬碟每簇的扇區數與硬碟的總容量大小有關,其值見下表:
分區大小 FAT16 (扇區數/簇) FAT32 (扇區數/簇)
16MB-127MB 4 1
128MB-255MB 8 1
256MB-259MB 16 1
260MB-511MB 16 8
512MB-1023MB 32 8
1024MB-2047MB 64 8
2048MB-8GB 不支援 8
8GB-16GB 不支援 16
16GB-32GB 不支援 32
32GB以上 不支援 64
FAT16及FAT32相關特定值意義如下:
FAT16
1.DBR 第0扇區開始,使用一個扇區,沒有保留扇區.
2.FAT表長 在DBR第16H處的2位元組(表示佔用扇區數),FAT1從第1扇區開始
3.FAT簇 每簇用16位位元表示FAT表中每簇地址佔2Bytes
4.可用簇號 0002H - FFEFH ( <= FFEDH[65518]個簇)
5.特定簇號 0000H、0001H兩簇號不使用,其對應DWORD位置:F8 FF FF 7F
簇值意義 不要把FAT表項內的數字誤認為表示當前簇號,而應是該檔案的下一個簇的簇號
高位元組在後低位元組在前是儲存方式,讀出時應進行調整,如兩位元組12H 34H,實際應為3412H
值FFF0H用來表示壞簇 值FFFFH表示檔案結束簇
特定值表示壞簇,其它值表示為檔案佔用的下一簇的簇號
6.根目錄區扇區大小,在DBR第11H的兩位元組(表示32位元組的根目錄個數)如值為00 02,則0200H=512個,即512*32位元組=16384位元組,等於32個扇區
7.扇區數量 在DBR第13H處2位元組
FAT32
1.DBR 從第0扇區開始,使用三個扇區,儲存了該邏輯盤每扇區位元組數,每簇對應的扇區數等重要參數和引導記錄.(佔用32扇區)
2.FAT表長 在DBR第24H處的4位元組(表示FAT佔用扇區數),FAT1從第32扇區開始.
3.FAT簇 FAT表中每簇地址佔4Bytes
4.可用簇號 00000002H - FFFFFEFFH
5.特定簇號 0000000H、00000001H兩簇號不使用,其對應的兩個DWORD位置(FAT表開頭的8個位元組)用來存放該盤介質類型編號:F8 FF FF 0F FF FF FF 0F
值00000000H表示該簇未被分配值FFFFFF0FH表示是該簇是檔案佔用的最後一族
特定值表示壞簇,其它值表示為檔案佔用的下一簇的簇號
6.根目錄區扇區大小, 不再是固定地區和固定大小
7.扇區數量 在DBR第20H處的4位元組
其它:
1. FAT表按順序依次記錄了該盤各簇的使用方式,是一種位示圖法.
2. 每簇所佔用扇區數見上.
3. 微軟建議對小於512M的邏輯盤不使用FAT32
4. 對於使用FAT16檔案系統的硬碟分區時,不要將分區(邏輯盤)容量正好設為某一區間的下限.
計算公式:
每個扇區長度 = 512位元組
總簇數 = 邏輯盤容量/簇容量
總簇數 = FAT表長度(位元組)/每個表項長度(位元組)- 2
FAT表長度=邏輯盤容量/簇容量*每個表項長度
每個有效FAT結構區包含兩個完全相同的拷貝:FAT1、FAT2
如: 2G FAT 16分區格式的HD, FAT長度為250Sectors,
則總簇數= 250 * 512 / 2 - 2 = 63998
簇容量(每簇扇區數) = 2 097 000 000 / 63998 = 32776Bytes = 64 Sectors
檔案目錄表FDT(File Directory Table),即根目錄(DIR)區,又稱為ROOT區
緊跟在FAT2的下一個扇區開始,記錄著根目錄下每個檔案(目錄)的起始單元,檔案的屬性等。定位檔案位置時,作業系統根據DIR中的起始單元,結合FAT表就可以知道檔案在硬碟中的具體位置和大小了。
如果支援長檔名,則每個表項為64個位元組,其中,前32個位元組為長檔案連結說明;後32個位元組為檔案屬性說明,包括檔案長度、起始地址、日期、時間等。如不支援長檔名,則每個表項為32個位元組的屬性說明。
根目錄下可包含檔案和子目錄,子目錄下又可包含檔案和下級子目錄.一個子目錄也佔用一個檔案目錄項,只不過它的屬性位元組為10H,檔案長度位元組為0.一個子目錄中的內容是若干個檔案目錄項或下級子目錄項.
Start Pos. Bytes FAT16 FAT32
00-07 8 檔案名稱 檔案名稱
08-0A 3 副檔名 副檔名
0B 1 FAT16://表示屬性: 00000000讀寫 00000001隻寫 00000010隱含 00000111系統,隱含,唯讀 00000100系統 00001000卷標 00010000子目錄 00100000檔案,只要完成寫操作並已關閉即置1
FAT32://0至5位分別是唯讀位、隱藏位、系統位、卷標位、子目錄位、歸檔位
最高兩位保留未用
0C-0D 2 保留未用 儲存短檔案名稱位元組校正和
0E-0F 2 保留未用 檔案建立時間
10-11 2 保留未用 檔案建立日期
12-13 2 保留未用 最新訪問日期
14-15 2 保留未用 檔案存放的起始簇號的高16位
16-17 2 檔案建立時間(hhhhhmmmmmmsssss) 檔案最新修改時間
18-19 2 檔案建立日期(yyyyyyymmmmddddd) 檔案最新修改日期
1A-1B 2 檔案存放的起始簇號(低位元組在前) 檔案存放的起始簇號的低16位
1C-1F 4 檔案長度 檔案長度
注:目錄項中第0~7位元組為檔案名稱(若有剩餘位元組則用空白字元20H填充).
其中,第1位元組又表明了該檔案的狀態,它有如下四種取值方式:
a. 00H--目錄項的空目錄。
b. E5H--表示該目錄項曾經使用過,但檔案已被刪除。
c. 2EH--表示子目錄下的兩個特殊檔案"."或".."目錄項
d. 其它任何字元--表示一個檔案名稱(或目錄名)的第一個字元的ASCII碼值.
資料(DATA)區
資料區是真正意義上的資料存放區的地方,位於DIR區之後,佔據硬碟上的大部分資料空間。
檔案資料起始地址(扇區號) = 保留扇區數(DBR) + 每FAT扇區數 * 2 + 根目錄項數/32 (FDT扇區數) + 每簇扇區數 * (起始簇號 - 2)
當一個程式對作業系統要求提供某一個檔案的內容時,作業系統會到此檔案的目錄記錄表去尋找它的第一個簇號碼, 然後再到FAT記錄表裡去找在此一鏈結(Chain)裡的下一個簇。 此動作不斷的重複直到找到檔案的最後一個簇為止,作業系統可以精確的計算那些簇屬於這個檔案及其先後順序。經由此方式,作業系統可以提供者所要求之檔案的任何部分。這種組織檔案的方式稱 為FAT鏈(FAT Chain).
在FAT檔案系統下,檔案永遠被分配到整數單位的簇。 在一個每一簇大小為32K的1.2GB磁碟中,一個只包含"Hello,World!"這幾個字元的大小為12個 位元組檔案仍要在磁碟中佔32K的空間。在簇中沒有用到的部分稱為耗損(Slack),小檔案的耗損幾乎與整個簇相當,平均來說,一個檔案會有一半左右的耗損。
檔案的讀取: 作業系統從目錄區中讀取檔案資訊(包括檔案名稱、尾碼名、檔案大小、修改日期和檔案在資料區儲存的第一個簇的簇號),我們這裡假設第一個簇號是0023。作業系統從0023簇讀取相應的資料,然後再找到FAT的0023單元,如果內容是檔案結束標誌(FF),則表示檔案結束,否則內容儲存資料的下一個簇的簇號,這樣重複下去直到遇到檔案結束標誌。
檔案的寫入:當我們要儲存檔案時,作業系統首先在DIR區中找到空區寫入檔案名稱、大小和建立時間等相應資訊,然後在Data區找到閑置空間將檔案儲存,並將Data區的第一個簇寫入DIR區,其餘的動作和上邊的讀取動作差不多。
DOS刪除檔案時只是把檔案目錄表中的該檔案的表項第0個位元組改為E5h,表此表項已被刪除,並在檔案配置表中把該檔案佔用各簇的表項清0,以釋放空間。其實檔案的內容仍在盤上,並沒有被真正刪除,這就是undelete.exe、unerase.exe等一類恢複移除工具能起作用的原因。