FAT32 FAT區__FAT表解析


一、 FAT 表概述

位置: 緊跟在文件系統的“保留區”之后 ; 有兩個數據結構完全相同的FAT(FAT,File Allocation Tbale 文件分配表)組成。

作用: FAT表項,描述文件系統內的簇分配狀態,說明文件系統內數據所分配的連續簇的順序關系(即表明文件或目錄的下一簇的序號)。

常規規則:
· 數量: 通常情況下一個FAT 文件系統會有兩個FAT 表, 但有時候也會允許只有一個FAT 表, FAT 表的具體個數記錄在引導扇區的 偏移 0x10 字節處。
· 位置: 因為FAT區位於文件系統的保留區之后,所以FAT1在文件系統中的位置可以通過引導記錄中偏移0x0E~0x0F 字節處的“保留扇區”數得到。
· FAT2 緊跟在FAT1之后, 它的位置可以通過FAT1的位置加上每個FAT 表的大小扇區數獲得。

FAT 表中記錄了每個文件的簇鏈結構; FAT 表中記錄的與數據區簇對應的表項,從0號標記開始至當前數據區所分配的簇的最大數值,記錄簇信息到FAT 項;但是注意:其中 0號~1號簇的值都是操作系統預先不留設定的特殊標記,而數據區的起始簇是2號簇。

二、、FAT 表的特性

FAT 表由一些列大小相等的表項組成,有如下特性:

· FAT32 中每個簇的狀態,使用32bit(4字節)記錄在FAT表中。 FAT 表中的所有字節位置以 4個字節為單位進行划分;並以所有划分后的位置由0進行地址編號。“0號 和 1號” 地址被系統保留並存儲特殊標識內容。從 2號 地址開始, 每個地址對應於數據區的簇號, FAT 表中的地址編號與數據區中的簇號相同。 稱FAT 中的這些四字節一組划分的項的地址為 FAT 表項 FAT表項中記錄的值為FAT 表項值。(簇編號與簇內內容關系如果 Map中的鍵-值 關系相同)

  當文件系統創建時(就是格式化操作時), 分配給FAT 區域的空間將會被清空, 在FAT1與FAT2 的0號和1號表項寫入特定值。 由於創建文件系統的同時,也會創建根目錄, 也就是為根目錄分配了一個簇空間,通常為2號簇,所以2號簇所對應的“2號FAT表項”也會被寫入一個結束標記。

· 如果某個簇未被使用,他所對應的FAT 表項內的FAT 表項值即用0進行填充,表示該FAT 表項所對應的簇未被分配使用

· 當某個簇被分配使用時,那么他所對應的FAT表項的值為文件的下一個存儲文件的簇號。 如果該文件結束於該簇,則在它的FAT表項中記錄的是一個文件結束標記,對於FAT32 而言,代表文件結束的FAT表項值為0x0FFFFFFF。
· 如果某個簇存在壞扇區,則整個簇會用FAT 表項值 0x0FFFFFF7 標記為壞簇, 不再使用,這個壞簇標記就記錄在它所對應的FAT表項中。

· 由於簇號起始於2, 所以FAT表的0號表項與1號表項不予任何簇對應。 FAT32 的0號表項值總是“F8FFFF0F”

注意: 可以搜索扇區偏移0字節處的該值(F8FFF0F)以查找FAT表。

· 1號表項可能被用於記錄“臟標志”, 以說明文件系統沒有被正常卸載或者磁盤表面存在錯誤。 不過此值似乎不重要,正常情況下,1號表項值“FFFFFFFF”或“FFFFFF0F”

 

項內容填寫規則:

  ·在文件系統中新建文件時,如果新建的文件只有一個簇,為其分配的簇所對應的FAT表項將會被寫入結束標記。如果新建的文件不只占用一個簇,則在其所占用的每個簇對應的FAT表項中寫入為其分配的下一個簇的簇號,在最后一個簇對應的FAT 表項中寫入結束標記。

· 新建目錄時,只為其分配一個簇的空間,對應的FAT 表項中寫入結束標記。當目錄增大超過一個簇的大小時,將會在空閑空間中繼續為其分配一個簇,並在FAT 表中為其建立FAT 表鏈以描述它所占用的簇的情況。

· 對文件或目錄進行刪除操作時,他們所對應的FAT 表項將會被清空,設置為0以表示其所對應的簇處於未分配的狀態。

三、 FAT表的使用

一個文件的"起始簇號"記錄在它的目錄項中, 該文件的 "其他簇" 則用一個簇連結構記錄在FAT 表中。

  如果一個簇所對應的FAT表項的表項值為非零, 則表明該簇已經被分配使用了,但是這時表項值可能為兩種情況,一個是一個文件的下一個簇號值,也有可能是一個文件的結束標記0x0FFFFFFF,或者是一個壞簇標記0x0FFFFFF7 。
如果要尋找一個文件的下一個簇,只需要查看該文件的目錄項中描述的起始簇號所對應的FAT項,如果該文件只有一個簇,則此處的值為一個結束標記0x0FFFFFFF;如果該文件不只一個簇,則此處 的值是它的下一個簇的簇號。

>> 查詢簇連接結構模擬步驟:

當我們要尋找某個文件時, 首先從該文件的“目錄項”中獲取該文件的第一“簇”的簇號,然后根據“第一簇”的“簇號 N”,然后根據N 從FAT區的FAT表找出N簇號所對應的FAT 表項,查看FAT 表項的內容:
若是文件結束,該表項值為 0x0FFFFFFF; 若是沒有結束,而該文件的大小超出一個簇,則N所對應的FAT表項的表項值為該文件下一個簇的簇號,然后再找到下一個簇號N+1 所對應的FAT表項,查看其表項值,依次類推,就推出了一個文件在FAT表中的 簇鏈連接結構; 也或者表項值為 0xFFFFFFF7 壞簇標識。

>> 其他

查找FAT 表項: 要找到一個簇的FAT 表項,只要用他的 簇號乘以每個FAT 表項的字節數即可 。對於FAT32而言,每個FAT 表項占用4個四字節, 如果我們尋找9號簇的表項位置,則用 4*9=36,也就是說位於FAT 表內偏移36(0x24)字節處。

注意:
WinHex 提供了直接跳轉到某個指定FAT 表項的功能。

文件系統大小的上限值卻絕育FAT 項的大小。 簇鏈中的每個FAT 項記錄着下一個簇的簇地址,FAT 項所能表示的數字有一個上限,這個上限也就是文件系統中的最大簇號。 FAT 32文件系統的FAT 項只使用了32bit 中的28bit ,因此只能描述 268435456個簇(實際上還要考略小於這個值,因為這其中還包含了結束標志及壞簇標志的保留值)。

操作系統通過檢測FAT 表中的表項來確定文件系統中的各個簇是否被分配使用。當我們在Windows 下右擊某個FAT 分區查看其屬性時,顯示的已用空間和未用空間就是根據FAT 表統計而來的。


有時我們會遇到,查看屬性時發現已用空間並沒有減少,但存儲的文件卻不見了。這是因為某些病毒在某些文件的目錄項中寫入了刪除標記,但並沒有清楚FAT 表內的簇鏈所至。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM