FAT32文件系統--For TF卡
1. TF卡空間是如何分配的?
下面以4GB TF卡為例,通過WinHex工具進行分析,其空間分配如下圖所示:
FAT32把目錄當做文件來管理,所以沒有獨立的目錄區,所有的文件目錄項都是在數據區里面的。
2. 啟動扇區 (DBR)
DBR(DOS BOOT RECORD,DOS引導記錄),位于柱面0,磁頭1,扇區1,即邏輯扇區0 ;
DBR包括:
• 一個引導程序: DOS 引導程序完成DOS系統文件(IO.SYS,MSDOS.SYS)的定位與裝載
• 一個BPB: BPB用來描述本DOS分區的磁盤信息,比如:本分區的起始扇區、 結束扇區等等
注意:搜索DBR的標志:
• FAT16的DBR:EB 3C 90,無備份的DBR
• FAT32的DBR:EB 58 90,有備份的DBR,通常在該分區的第6扇區
• NTFS的DBR: EB 52 90,有備份的DBR,通常在該分區的最后一個扇區
2.1 DBR組成
2.2 BPB(BIOS Parameter Block)的組成

3. FAT(File Allocation Table)文件分區表
• 簇(Cluster)
是文件數據區被劃分成的具有大小相等的區域用于磁盤文件的計量分配單位。
• 文件分配表
是位于磁盤0扇區上的一個特殊的文件,它包含了磁盤上的文件的大小以及文件存放的簇的位置等信息。
• 文件的首簇號
存放在FDT(根目錄)登記項中,后續簇號存放在FAT中。
FAT表以簇為單位,標識分區中空間的使用情況(每個標識占4字節)。其示意圖如下圖所示:
FAT前2簇為保留簇(簇0和簇1),不分配給文件使用,其內容含義如下所示:
• FAT16:F8 FF FF
• FAT32:F8 FF FF 0F FF FF FF FF
一個FAT表項值表明了文件占用的一個簇號并指明下一簇號的位置。
FAT表按順序依次記錄了該盤各簇的使用情況,是一種位示圖法。每簇的使用情況用32位二進制填寫,未被分配的簇相應位置寫零;壞簇相應位置填入特定值;已分配的簇相應位置填入非零值,具體為:如果該簇是文件的最后一簇,填入的值為FFFFFF0FH(即0x0FFFFFFF),如果該簇不是文件的最后一簇,填入的值為該文件占用的下一個簇的簇號,這樣,正好將文件占用的各簇構成一個簇鏈,保存在FAT表中。0000000H、00000001H兩簇號不使用,其對應的兩個DWORD位置(FAT表開頭的8個字節)用來存放該盤介質類型編號。
FAT表的大小就由該邏輯盤數據區共有多少簇所決定,取整數個扇區。
當文件系統被創建,也就是進行格式化操作時,分配給FAT區域的空間將會被清空,在FAT1與FAT2的0號表項與1號表項寫入特定值。由于創建文件系統的同時也會創建根目錄,也就是為根目錄分配了一個簇空間,通常為2號簇,所以2號簇所對應的2號FAT表項也會被寫入一個結束標記,如上圖所示。
當某個簇已被分配使用時,則它對應的FAT表項內的FAT表項值也就是該文件的下一個存儲位置的簇號。如果該文件結束于該簇,則在它的FAT表項中記錄的是一個文件結束標記,對于FAT32而言,代表文件結束的FAT表項值為0x0FFFFFFF。
如果某個簇存在壞扇區,則整個簇會用FAT表項值0xFFFFFF7標記為壞簇,不再使用,這個壞簇標記就記錄在它所對應的FAT表項中。
在文件系統中新建文件時,如果新建的文件只占用一個簇,為其分配的簇對應的FAT表項將會寫入結束標記。如果新建的文件不只占用一個簇,則在其所占用的每個簇對應的FAT表項中寫入為其分配的下一簇的簇號,在最后一個簇對應的FAT表象中寫入結束標記。
新建目錄時,只為其分配一個簇的空間,對應的FAT表項中寫入結束標記。當目錄增大超出一個簇的大小時,將會在空閑空間中繼續為其分配一個簇,并在FAT表中為其建立FAT表鏈以描述它所占用的簇情況。
對文件或目錄進行操作時,他們所對應的FAT表項將會被清空,設置為0以表示其所對應的簇處于未分配狀態。
4. FDT (File Directory Table) 文件目錄表
文件目錄表(FDT)是由若干個32字節的表項構成的。它記錄著每個文件(目錄)的如下內容: • 文件名 • 擴展名 • 是否支持長文件名 • 起始單元(即起始簇編號,這是最重要的) • 文件的屬性 • 大小 • 創建日期等內容 用FORMAT命令對磁盤進行格式化的時候,就已經為整個磁盤建立了一個根目錄FDT。 根目錄下的所有文件及其子目錄在根目錄的文件目錄表(FDT)中都有一個“目錄登記項”或簡稱為“目錄項”。每個目錄登記項占用32個字節,分為8個區域,提供有關文件或子目錄的信息。其詳細描述如下圖所示:


• 12--13:字節僅長文件名目錄項用,用來存儲其對應的短文件名目錄項的文件名字節校驗和等。
• 14--15:字節 24位二進制的文件建立時間,其中的高5位為小時,次6位為分鐘。
• 16--17字節:16位二進制的文件建立日期,其中的高7位為相對于1980年的年份值,次4位為月份,后5位為月內日期。
• 18--19字節: 16位二進制的文件最新訪問日期,定義同(6)。
• 20--21字節 起始簇號的高16位。
• 22--23字節 16位二進制的文件最新修改時間,其中的高5位為小時,次6位為分鐘,后5位的二倍為秒數。
• 24--25字節 16位二進制的文件最新修改日期,定義同(6)。
• 26--27字節 起始簇號的低16位。
• 28--31字節 32位的文件字節長度。 格式為Little Endian, 即高位字節位于高地址。
4.1 刪除文件之后的變化
• 在FAT文件系統中,文件刪除時,操作系統找到對應的目錄文件表將第一個字節修改成“E5”標志• 同時,將FAT文件分配表相應的項目清空,供其它程序使用
• 文件的數據并沒有被覆蓋,而是實際存在,但對操作系統而言,是無效的垃圾數據
• 當新文件需要存放時,新的數據可直接在原來數據位置上寫入
4.2 根目錄(root)
根目錄區(ROOT區)不再是固定區域、固定大小,可看作是數據區的一部分。因為根目錄已改為根目錄文件,采用與子目錄文件相同的管理方式,一般情況下從第2簇開始使用,大小視需要增加,因此根目錄下的文件數目不再受最多512的限制。 雖然原則上FAT32允許根目錄位于數據去的任何位置,但通常情況下它都位于2號簇。4.2.1 定位根目錄
在FAT32文件系統中,尋找第一簇(即2號簇)的位置也就是尋找數據區的開始位置,這并不是一件容易的事,因為它不是位于文件系統開始處,而是位于數據區。在數據區前面是保留區域和FAT區域,這兩個區域都不使用FAT表進行管理。因此,數據區以前的區域只能使用扇區地址(邏輯卷地址),而無法使用簇地址。要想定位一個FAT32文件系統的數據起始處,可以通過引導扇區的相關參數計算出來。 1) 從引導扇區的偏移0x0E~0x0F字節處得到保留扇區。 2) 從偏移0x10字節處得到FAT表的個數。 3) 從偏移0x24~0x27字節處得到每個FAT表的大小扇區數。 4) 利用如下公式計算:
保留扇區數+ 每個FAT表大小扇區數 × FAT表個數 = 數據區起始扇區號
要想計算其它已知簇號的扇區號,還要由引導扇區的偏移0x0D字節處查找到每個簇大小扇區數,并使用如下公式計算:
某簇起始扇區號 = 保留扇區數 + 每個FAT表大小扇區數 × FAT表個數 + (該簇簇號 - 2) × 每簇扇區數

4.2.2 根目錄分析
根目錄在文件系統建立時即已被創建,其目的就是存儲目錄(也稱文件夾)或文件的目錄項。每個目錄項的大小為32個字節。文件系統剛被創建時,還沒有存儲任何數據時,根目錄下沒有任何內容,文件系統只是為根目錄分配了一個簇的空間(通常為2號簇),將結束標記寫入該簇對應的FAT表項,表示該簇已經被分配使用。這時候,為根目錄分配的空間沒有任何內容。但如果在創建文件系統的時候是定了卷標,則會在根目錄下為其建立一個卷標目錄項,該目錄項占用根目錄中的第一個目錄項位置。
不管是根目錄還是子目錄下的目錄項,都具有以下的基本特性:
1) 為文件或子目錄分配的第一個簇的簇號記錄在它的目錄項中,其他后續簇則由FAT表中的FAT表鏈進行跟蹤。
2) 目錄項中除記錄子目錄或文件起始簇號外,還記錄它的名字、大小(子目錄沒有大小)、時間值等信息。
3) 每個子目錄或文件除具有一個短文件目錄項外,還會有長文件名目錄項。
4) 短文件名目錄項固定占用32字節,長文件名目錄項則根據需要占用1個或者若干個32字節。
5) 對于同一個子目錄或文件,它的長文件名目錄項存放在它的短文件名目錄項之前,如果長文件名目錄項占用多個32字節,則按倒序存放于段文件名目錄項之前。
4.3 文件定位
在DBR中有記錄根目錄位置的信息(2CH: 磁盤根目錄的起始簇號),通過查詢根目錄文件表FDT,找到相應的文件和目錄的信息,在FDT記錄了文件的名稱、屬性、創建時間、修改時間信息、還記錄了文件的起始簇號,文件的實際大小等信息。 有了根目錄的起始簇號,就可計算得到此簇的起始扇區號: 某簇起始扇區號 = 保留扇區數 + 每個FAT表大小扇區數 × FAT表個數 + (該簇簇號 - 2) × 每簇扇區數 根據以上公式,可計算得到: 根目錄起始扇區號 = 36(0x24) + 7566 (0x1D8E) x 2 + (2-2) x 8= 15168 在DBR中,根目錄的起始簇號如下圖所示:
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成