檔案系統(四):FAT32檔案系統實現原理

liwen01發表於2024-05-22

FAT32是從FAT12、FAT16發展而來,目前主要應用在移動儲存裝置中,比如SD卡、TF卡。隱藏的FAT檔案系統現在也有被大量使用在UEFI啟動分割槽中。

為使文章簡單易讀,下面內容特意隱藏了很多實現細節,關於分割槽、格式化等相關的內容,可以檢視之前的文章:

檔案系統(一):儲存介質、原理與架構

檔案系統(二):分割槽、格式化資料結構

檔案系統(三):嵌入式、計算機系統啟動流程與步驟

(一)FAT32 磁碟佈局

檔案系統(四):FAT32檔案系統實現原理

拿一個FAT32檔案系統的儲存裝置,我們可以看到,它整個儲存裝置大概可以分為5個部分:引導、保留扇區、FAT表、目錄和檔案、備份

(1)引導與保留扇區

引導和保留扇區部分,會因為分割槽方式的不同(MBR與GPT)而不同,同時也會因為儲存裝置分割槽個數的不同也會有差異。

下面這個是使用GPT方式將儲存裝置分為1個分割槽並格式化為FAT32檔案系統格式的資料分佈示意圖。

檔案系統(四):FAT32檔案系統實現原理

(2)備份

在磁碟末尾的備份區域,主要是使用GPT方式分割槽的時候,會將分割槽表資訊備份到儲存裝置的最後區域。對於MBR分割槽方式,並沒有這部分。

(3)FAT表與目錄項

在FAT32檔案系統的使用過程中,FAT表和目錄項是其核心部分,將在下面介紹

(二)檔案在哪裡?

將一個儲存裝置格式化成FAT32格式檔案系統,然後再在上面建立幾個資料夾和檔案,那麼這些檔案和資料夾的名字資訊是儲存在什麼位置?檔案裡面的資料又是儲存在哪?要怎樣才能找到這些檔案?

檔案系統(四):FAT32檔案系統實現原理

上面在一個TF卡中建立了test1、test2、test3、test4 四個資料夾和一個0000.media媒體檔案。

System Volume Information 目錄及其下面的檔案是在Windows系統格式化的時候系統寫入的系統檔案。

目錄項

FAT表後面的區域,是根目錄的儲存區域,目錄和檔案以及檔案中的實際資料都儲存在這個一個大的區域。根目錄是在該區域最開始的位置。

從根檔案所在扇區的資料我們可以看到根目錄的目錄項資訊:

檔案系統(四):FAT32檔案系統實現原理

WinHex工具上,根目錄所在位置的還有4個“新建資料夾”項。這個是因為在Windows建立資料夾的時候,開始的名字是“新建資料夾”,後面被我重新命名成了test1~4

目錄項分為長檔名短檔名

如果一個檔案它的名字大於11個位元組,那它就至少有兩個目錄項,一個短檔名項和一個長檔名項。

檔名長度小於等於11個位元組的話,就只有一個短檔名項。短檔名目錄項長度為32個位元組,各位元組的定義如下:

檔案系統(四):FAT32檔案系統實現原理

根據上面定義可以對根目錄下的目錄項進行解析:

檔案系統(四):FAT32檔案系統實現原理

以test2目錄項舉例,我們可以看到:

  • 檔名為test2 (短檔名)
  • 檔案屬性為10 (子目錄 )
  • 這裡時間需要轉換,2位元組用不同的位表示年月日和時分秒
  • 起始簇號為07

如果目錄項是以E5開頭,那表示該項是無效的或是已經刪除了的目錄項,比如上面的四個"新建資料夾"目錄項

透過目錄項,我們可以知道儲存裝置上都有哪些檔案和目錄,相應的子目錄也是一樣的實現,只不過子目錄下面的目錄項是在子目錄所在的簇中記錄。

(三)檔案磁碟空間分配

在FAT32檔案系統中,它是以簇為單位進行空間分配和管理。一般一個簇的大小為4KB(下面均以4KB做參考)。

一個檔案或是一個目錄,它是透過目錄項知道它在儲存裝置上存放的的開始位置,也就是開始簇號,而簇號資訊,是儲存在FAT表上,

一個FAT32檔案系統有兩個FAT表,一個正常使用,另外一個為備份FAT表

透過分割槽上的DBR和FSINFO資訊可以知道FAT表的大小和所在位置等資訊。

檔案系統(四):FAT32檔案系統實現原理

FAT32 是以32位(4Byte)來定義一個FAT表項,也就是一個簇的狀態,下表是FAT表項中值的含義:

檔案系統(四):FAT32檔案系統實現原理

對於FAT表,第0號簇是固定的0x0FFFFFF8,第1號簇項0xFFFFFFFF是被系統使用

第3號簇是根目錄的開始簇,如果其值是0x0FFFFFFF,表示根目錄只佔用一個簇的空間,也就是4KB大小空間,如果其值是0x00000002~0x0FFFFFFE,表示根目錄的下一個簇號,直到出現檔案結束簇0x0FFFFFFF,也就是根目錄大於4KB的大小。

下面是對FAT表現的一個解析。

檔案系統(四):FAT32檔案系統實現原理

從上面可以看出:

  1. 如果檔案或是目錄小於4K(一個簇),那它所佔用的空間就是目錄項中起始簇號所分配的空間,該簇號的值為結束簇號的值(0x0FFFFFFF)
  2. 如果一個檔案大於4K(一個簇),目錄項中的起始簇號所在位置的值,就是下一個位置儲存的簇號值,比如0000.media 檔案,它的起始簇號是10,第10簇號(0x0000000B)->第11簇號(0x0000000C)->......第241簇號(0x0x00000F2)->第242簇號(0x0FFFFFFF 結束簇號)
  3. 上面這個0000.media檔案是以連續的方式儲存在磁碟中,當磁碟滿了或是使用久了之後,會存在磁碟碎片,有可能就不是連續的空間了。

(四)實現原理

我們從檔案的建立、資料寫入、檔案刪除等操作流程看檔案系統的基本實現原理

(1)檔案建立

  1. 建立檔案或是目錄的時候,會先在當前目錄所在位置的目錄項中新增一個目錄項
  2. 目錄項會記錄檔案的起始簇號,建立、修改時間,檔案屬性等資訊

(2)檔案增刪資料

  1. 如果起始簇空間寫滿了,系統會查詢一個空閒簇,資料將繼續寫入到該空閒簇中,FAT表中該空閒簇會被標記已經被使用,同時,該檔案的結束簇號也會往後移動一個簇。
  2. 更新該目錄項中的修改時間、檔案大小等資訊
  3. 刪除或是修改檔案裡面的資料,就是一個反向的過程

(3)檔案資料讀取

  1. 透過目錄項,找需要讀取檔案所在的開始簇位置
  2. 如果檔案大於一個簇,開始簇位置的值為下一個簇的位置,可以順著這個簇鏈一直查詢,直到結束簇出現。

(4)檔案刪除

  1. 檔案刪除的時候,根目錄中該目錄項的資訊並不會被刪除,而是將該目錄項標記為刪除狀態
  2. FAT表中該檔案所佔用的簇號,會被標記為0,表示該簇為未使用的簇。
  3. 該檔案所在簇號所對應扇區的實際檔案資料不會被擦除,檔案裡面的資料還是儲存在刪除上。

檔案刪除,實際上也就是將該檔案在FAT表中的簇資訊標記為可使用,然後將目錄項標記為已刪除,實際資料不會做刪除處理

如果要恢復被刪除的檔案,可以根據目錄項中的資訊進行恢復,前提是不要再建立新檔案和寫入新資料,因為新的資料容易將原來檔案所在扇區的資料覆蓋或是擦除。

(5)基本原理

FAT32檔案系統的基本原理,是透過目錄項來管理磁碟的檔案目錄結構,然後透過FAT表來管理磁碟檔案所使用的簇(扇區)空間。

FAT32 檔案系統的FAT表是透過單向鏈式的方法來管理扇區,這種方式在小檔案和小容量的儲存裝置上使用比較方便,但不適合於大檔案和大容量的儲存裝置。

目前大於32GB的SDXC卡,SD協會已採用exFAT作為預設的檔案系統。

(五)優缺點

(1)優點

FAT32 檔案系統現在還在被大量使用,其主要的優勢在於:相容性強和實現簡單

相容性強: 它可以同時支援Windows、Linux、Mac OS 三個作業系統,同時因為它的歷史悠久,很早就已經被廣泛使用,所以很多老舊電腦系統和裝置都可以支援。

實現簡單: 它的設計相對簡單、易於實現和維護,特別是在系統資源緊張的嵌入式裝置中。

(2)缺點

它的缺點主要有:不適合大檔案、磁碟碎片化、安全性較差

不適合大檔案

目錄項中使用4個位元組表示檔案大小,其最大表示的值為4GB,所以FAT32對於單個檔案的最大大小限制為4GB。

安全性較差:

相比一些現代檔案系統(如NTFS、exFAT等),FAT32的安全性較差。它缺乏對檔案和資料夾的訪問控制、加密、日誌記錄等高階功能,因此不適合用於儲存敏感資料或需要更高安全性的場景。

(3)磁碟碎片化

磁碟碎片化這裡描述詳細一些,因為它會影響到檔案系統的效能。

靜態分配簇

FAT32使用固定大小的簇(cluster)來管理儲存空間。每個檔案都被分配到一個或多個簇來儲存,這些簇在儲存裝置上連續地排列。當檔案大小超過一個簇的容量時,系統會分配額外的簇給檔案。但是,如果在磁碟上沒有足夠的連續空閒簇來容納整個檔案,檔案就會被分割成多個片段並儲存在不同的地方,導致碎片化。

檔案刪除和大小改變

FAT32檔案系統的碎片化還會因為檔案的刪除和大小的改變而產生。當檔案被刪除時,它佔用的簇會被標記為空閒,可以被其他檔案使用。如果其他檔案需要的空間無法與原檔案的簇連續,新檔案就會分配到磁碟上的不同位置,造成碎片化。同樣地,當檔案的大小發生改變時,如果新的大小需要的簇數超過了原檔案所佔用的連續簇數,檔案也會發生碎片化。

碎片化的影響

碎片化會影響檔案的讀取和寫入效能。當檔案被分割成多個片段時,系統需要花費更多的時間來定位和讀取這些片段,從而降低了檔案的讀取速度。另外,由於檔案儲存不連續,儲存裝置上可能會出現許多小的空閒碎片,導致儲存空間的浪費。

結尾

上面內容是以比較概況的方式來介紹FAT32檔案系統的實現原理和它的優缺點,至於FAT32檔案系統的詳細實現細節,可以透過官方文件進行了解(晦澀難懂),也可以找張TF卡,透過winhex等工具,自己動手檢視它的實現細節。

---------------------------End---------------------------
如需獲取更多內容
請關注 liwen01 公眾號

相關文章