FAT32文件系統格式詳解(圖文針對具體文件存儲,分析fat32 SD卡)

一. 用winhex工具分析SD卡(FAT32)

WinHex.exe  ->  工具  -> 打開磁盤 -> 選中SD卡設備

                                                   圖(1)

打開後主界面如下:

                                                                                          圖(2)

二. FAT32磁盤格式分析

當磁盤有多個分區時:

fat32磁盤是由 MBR + 分區1(保留區 + 文件分配表 + 數據區)+ 分區2 + ......

其實,當我們在電腦上面,看到的U盤/SD卡設備,就是如上圖紅色選擇部分,是不包括MBR部分的

 

                                                                                      圖(3)

0x00000000 - 0x0013B000     保留區(DBR + FSINFO + ...)

0x0013B000 - 0x0089D800      FAT1

0x0089D800 - 0x01000000      FAT2

0x01000000 -                          數據區

                                                                                       圖(4)

三. 分析二進制數據(DBR FSINFO FAT1 FAT2 數據)

(1)啓動扇區(DBR)

                                                                                         圖(5)

0xEB 0x58 0x90:                                               跳轉指令

0x54 0x48 0x52 0x45 0x45 0x53 0x20 0x20:   文件系統標誌和版本號 MSDOS5.0

0x00 0x20:                                                     0x200 (512)每個扇區512字節

0x08:                                                              最小單元(簇)爲0x08(8)扇區,8*512=4K

0xD8 0x09:                                                     0x9D8(2520) 保留扇區2520個  2520*512=1.2M

 

0x02 :        2個FAT表(FAT1 FAT2)

0xF8 :         存儲介質類型,F8標準值

 

0x46 0xCC 0xEC 0x00:文件系統總的扇區數:15518790    15518790*512=7.39G

0x14 0x3B 0x00 0x00:每個fat表佔用的扇區總數:15124    15124*512 =  7.4M

0x02 0x00 0x00 0x00:  根目錄所在第一個簇的簇號,通常情況下,根目錄簇號爲2

 

0x46 0x41 0x54 0x33 0x32 0x20 0x20 0x20:文件系統格式 FAT32

 

(2)信息扇區(FSINFO)

                                                                                圖(6)

0x52 0x52 0x61 0x41: 擴展引導標誌

0x72 0x72 0x41 0x61: FSINFO簽名

0x84 0x89 0x1D 0x00: 剩餘所有的簇總數  0x1D8984 * 4k = 7928823808 byte = 7.38G

0x06 0x00:                     下一個可用簇:6

0x55 0xAA:                  結束標記字符

 

(3)文件分配表(FAT1)

 

在分析FAT表之前,我們先理解一下FAT32文件系統的一些基本信息:

 

扇區: 512 字節

 

: 文件系統的最小單元, 多個連續的扇區組成, 本SD卡爲 4K(8個扇區,必須爲2的整數次冪), 最大支持32K(64個扇區), 當我們保存一個1K的文件時,實際上,在文件系統中,是佔用的是4K的空間大小,因爲最小的存儲單元是4K, 當我們保存一個10K的文件時,那麼它需要佔用三個簇,實際佔用空間大小爲12K。

 

FAT : File Allocation Table, 文件分配表, 當我們存儲10K的文件時,需要使用三個簇,但是一定連續的三個簇嗎? 並非一定是連續的,那麼如何知道是使用了哪三個族呢,就需要我們文件分配表來記錄了,第一個簇的地址,下一個簇是哪個,哪個是最後的結束簇。

 

FAT 是一組與數據簇號對應的列表, 所有簇從2開始進行編號,每個簇都有一個自己的地址編號,根目錄默認簇號是爲2

 

FAT32中每個簇的簇地址是有32bit(4個字節),FAT表中的所有字節位置以4字節爲單位進行劃分,並對所有劃分後的位置由0進行地址編號。0號地址與1號地址被系統保留並存儲特殊標誌內容。從2號地址開始,每個地址對應於數據區的簇號,FAT表中的地址編號與數據區中的簇號相同。我們稱FAT表中的這些地址爲FAT表項,FAT表項中記錄的值稱爲FAT表項值。(沒理解的請反覆多讀幾遍,至關重要)

 

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

 

幾點說明:

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

(2)1號表項可能被用於記錄髒標誌,以說明文件系統沒有被正常卸載或者磁盤表面存在錯誤。不過這個值並不重要。正常情況下1號表項的值爲“FFFFFFFF”或“FFFFFF0F”。

(3)如果某個簇未被分配使用,它對應的FAT表項內容爲0;

(4)當某個簇已被分配使用,則它對應的FAT表項內的FAT表項值也就是該文件的下一個存儲位置的簇號。如果該文件結束於該簇,則在它的FAT表項中記錄的是一個文件結束標記,對於FAT32而言,代表文件結束的FAT表項值爲0x0FFFFFFF

(5)如果某個簇存在壞扇區,則整個簇會用0xFFFFFF7標記爲壞簇,這個壞簇標記就記錄在它所對應的FAT表項中。

(6)在文件系統中新建文件時,如果新建的文件只佔用一個簇,爲其分配的簇對應的FAT表項將會寫入結束標記。如果新建的文件不只佔用一個簇,則在其所佔用的每個簇對應的FAT表項中寫入爲其分配的下一簇的簇號,在最後一個簇對應的FAT表象中寫入結束標記。

(7)新建目錄時,只爲其分配一個簇的空間,對應的FAT表項中寫入結束標記。當目錄增大超出一個簇的大小時,將會在空閒空間中繼續爲其分配一個簇,並在FAT表中爲其建立FAT錶鏈以描述它所佔用的簇情況。

 

                                                                                      圖(7)

【0號表項】:0x0FFFFFF8;  FAT表起始固定標識

【1號表項】:0xFFFFFFFF;  默認值

【2號表項】:0x0FFFFFFF;  根目錄 Root directory 所在簇,開始扇區32768

【3號表項】:0x0FFFFFFF;  目錄 System Volume Information 所在簇,開始扇區32776 (32768+8)

【4號表項】:0x0FFFFFFF;  文件 WPSettings.dat 所在簇,開始扇區32784 (32776+8)

【5號表項】:0x0FFFFFFF;  文件 IndexerVolumeGuid 所在簇,開始扇區32792 (32784+8)

 

    由於我們是把SD卡格式化後分析,所以fat32除了根目錄外,無其他我們存儲文件,我們拷貝一個build.log文件再分析。build.log的大小爲10k, 需要佔用三個簇。

                                                                       圖(8)

                                                                                    圖(9)

【6號表項】:0x07  表項值爲7,即指向下一個表項, 2號簇爲根目錄,對應的開始扇區爲32768, 6號簇。開始的扇區爲 32768 + 8 * (6-2)= 32800, 即爲build.log的開始扇區。

【7號表項】:0x08  表項值爲8,即指向下一個表項。

【8號表項】: 0x0FFFFFFF, 結束簇, 從6號簇build.log開始,到8號簇,文件結束。  

 

    到此,build.log的文件如何存儲的,我們弄明白了,整個build.log保存在 6號簇-8號簇, 三個族存儲了build.log內的數據,但是build.log的文件名/文件屬性/最後修改時間/最後保存時間 這些信息保存在哪裏呢?

 

    由於build.log是存放在根目錄下的,那我們來看下根目錄的二進制數據:

                                                                                     圖(10)

在查看根目錄的二進制數據之前,我們還是先普及下基本信息:

(1)目錄所在的扇區,都是以32 Bytes劃分爲一個單位,每個單位稱爲一個目錄項。

(2)根據文件名及後綴,我們可以分爲短目錄文件,長目錄文件,簡單點理解,如果文件名>8 byte 或者後綴名>3, 則爲長文件目錄,否則爲短文件目錄

 

我們查看build.log(短文件目錄)

                                                                             圖(11)

 

                                                                         圖(12)

文件名: build

後綴名: log  

屬性:     0x20 (0010 0000) 讀寫 歸檔

簇號:     0x06開始簇號

大小:     0x2800  10K

至此,build.log的 文件名稱以及相關的屬性信息,以及build.log文件的內容存儲,都已經明白。

 

如果是長文件目錄

                                                   圖(13)

不再對具體的長文件目錄進行分析。

 

(4)文件分配表(FAT2)

FAT2與FAT1完全相同

 

(5)數據區

參考資料:

https://blog.csdn.net/mjx91282041/article/details/8904705/

https://blog.csdn.net/u010650845/article/details/60780979

https://blog.csdn.net/eternally123/article/details/79836210

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章