前言
exFAT是微軟2006年推出的一種檔案系統,距今已快二十年,相比於FAT16和FAT32,exFAT還是算年輕。exFAT一直是微軟的一個專用檔案系統,直到2019年微軟釋出它的規範,目前微軟擁有exFAT多個元素的專利,如果產品上使用exFAT,需要微軟授權,否則有可能侵權。
exFAT被SD協會採用作為大於32GB SDXC卡的預設檔案系統,在win11系統上,SDXC卡預設格式化選項已經沒有FAT32選項,exFAT檔案系統的使用範圍正逐漸擴大。
為啥微軟要用exFAT來代替FAT32呢?
因為exFAT資料結構開銷比NTFS低,但它又可以突破FAT32 單個檔案大小和分割槽大小的限制。
檔案系統(一):儲存介質、原理與架構
檔案系統(二):分割槽、格式化資料結構
檔案系統(三):嵌入式、計算機系統啟動流程與步驟
檔案系統(四):FAT32檔案系統實現原理
(一)磁碟佈局
在Windows系統上將一張TF卡格式化成exFAT檔案系統,發現它是將整個TF格式化成了exFAT檔案系統,沒有前面介紹的MBR和GPT分割槽表資訊。
整體分為5個部分:
- DBR及其保留扇區
- FAT 檔案分配表
- 簇號點陣圖
- 大寫字元
- 目錄和檔案(根目錄在該區最開始位置)
(1) DBR
DBR 中主要有:跳轉指令,OEM代號、BPB引數、載入程式、結束標誌組成。這裡只介紹BPB(BIOS Parameter Block,BIOS引數塊),其它部分在前面其它文章中已經有介紹過了。
根據上面第0扇區的DBR資訊,可以解析exFAT的BPB引數如下:
從上面解析的資料我們可以知道:
- FAT表在第2048扇區
- 簇位號圖在第4096扇區=首簇起始扇區號=第2號簇
- 大寫字元在第4160扇區=簇位號圖的下一個簇=4096 + 64 = =第3號簇
- 根目錄在第4224扇區=首簇起始扇區號 + 根目錄首簇號 - 2 = 4096 +(4-2)*64 = 第4號簇
(2) FAT表
與FAT32不同,exFAT只有一個FAT表,沒有備份
表項裡的內容與FAT32的類似:4個位元組表示一個簇,每個簇都有自己的編號,F8 表示介質型別為硬碟,寫入4個FF,表示結束標誌。具體可檢視上一篇檔案系統(四):FAT32檔案系統實現原理
與FAT32不同的是:exFAT檔案系統中FAT表中記錄的是不連續儲存檔案的簇鏈,如果是連續的簇鏈,在FAT表中不會體現。
上面exFAT檔案系統FAT表中為0的簇,並不能表示該簇是未使用,也有可能它是連續簇
exFAT檔案系統的簇使用情況,是透過簇位號圖來實現的
(3) 簇號點陣圖
簇點陣圖中的每一個位,實際對映到資料區中的每一個簇。
如果對應簇已經被使用,簇點陣圖上對應該簇的位值就是1,否則就為0
上面我們看,簇點陣圖上的值為:FF FF FF FF FF FF FF FF FF FF FF 03
FF = 11111111b = 8個簇,11個FF表示88個簇,03的二進位制位11b,表示2個簇
FF FF FF FF FF FF FF FF FF FF FF 03
表示從第2號簇到92號簇的90個簇號已經被使用了。
為什麼這裡是從第2號簇開始呢?
因為0號和1號FAT項有特殊用途,無法與資料區中的簇形成對映,只能從2號FAT項開始與資料區中的第一個簇對映,所以資料區中的第一個簇也就編號為2號簇。
(4)大寫字元元檔案
exFAT是一個大小寫不敏感的檔案系統
大寫字元元檔案(UPCASE file)裡面儲存的是一個全域性字元對映表,包含了所有可能字元的大小寫對映。
它主要作用是:大小寫轉換、檔名比較、國際化支援(跨語言)
(5) 目錄項
exFAT 包含4種目錄項
- 卷標目錄項(32位元組)
- 簇點陣圖檔案的目錄項(32位元組)
- 大寫字元檔案的目錄項(32位元組)
- 使用者檔案的目錄項(至少3個目錄項)
前面三個是系統目錄項我們就不分析了,簡單介紹一下使用者檔案的目錄項 以上圖中test3目錄為例進行分析:
使用者目錄項的三個目錄項被稱為三個屬性,
- 第一個目錄項稱為“屬性1”,目錄項首位元組的特徵值為“85H”;
- 第二個目錄項稱為“屬性2”,目錄項首位元組的特徵值為“C0H”;
- 第三個目錄項稱為“屬性3”,目錄項首位元組的特徵值為“C1H”。
第一目錄項
與FAT32 檔案系統相比多了附屬目錄項數,校驗和,這裡重點介紹一下校驗和的作用。
校驗和
校驗和是用來確保目錄項資料的完整性和可靠性,防止和檢測目錄項資料損壞。
在目錄項讀取的時候,可以透過校驗和確定目錄項資料是否損壞或是被篡改。
第二目錄項
這裡需要注意檔案碎片標誌和檔名Hash值兩個引數,這是FAT32檔案系統不具有的功能。
檔案碎片標誌
檔案碎片是用來標記檔案是否連續儲存。
如果值為0x03,表示檔案是連續的,沒有碎片,在FAT表中不會有記錄。在檔案讀取的時候,可以直接根據檔案所在的起始簇號,直接進行資料連續讀取,而不需要去查詢FAT表的中FAT項。
如果值為0x01,表示檔案是不連續的,有碎片,在FAT表中會記錄該檔案簇鏈,在檔案讀取的時候,除了檔案的起始簇號,還需要根據FAT表中的資訊去尋找下一個簇號。
因為有了檔案碎片標記,exFAT檔案讀寫效率要比FAT32高。
檔名Hash值
檔名Hash值是用來加速檔案查詢過程,透過快速匹配Hash值減少詳細比較的次數。
在目錄查詢過程中,透過先比較Hash值,可以減少實際需要比較完整檔名的次數。
如果Hash值不匹配,則檔名一定不匹配;如果Hash值匹配,再進行檔名的詳細比較。
第三目錄項
在exFAT 中沒有長檔名和短檔名的區分,統一記錄到檔名位置,如果檔名超出了第三目錄項空間,就繼續寫入到下一個目錄項中,
比如上面第一個檔案 System Volume Information
的目錄項
(二)實現原理
這裡從檔案建立、寫入、讀取、刪除、查詢的角度來介紹一下exFAT檔案系統的實現原理
(1)檔案建立
- 根據簇號點陣圖查詢空閒簇號
- 將簇號點陣圖中該簇號標記為已使用
- 目錄項中新增一個新的目錄條目,記錄新檔案的後設資料,包括檔名、檔案大小、建立時間、起始簇號、HASH值、校驗和等資訊
(2)檔案寫入
- 透過目錄項找到檔案的起始簇號
- 如果資料超過了一個簇大小,透過簇號點陣圖查詢下一個可寫入的簇
- 如果下一個簇與當前簇不連續,則將簇號資訊同步到FAT表中,同時目錄項檔案碎片標誌設定為0x01
- 如果一下簇與當前簇是連續的,FAT表資訊就不需要修改
- 更新目錄項的其它資訊,比如檔案大小和最後修改時間
(3)檔案讀取
- 透過目錄項找到檔案的起始簇號,透過件碎片標誌判斷檔案是否連續
- 如果檔案連讀,可根據起始簇號直接按序讀取
- 如果檔案不連續,還需要根據FAT表查詢下一個資料所在的簇號
(4)檔案刪除
- 檔案刪除是檔案建立的一個逆過程
(5)檔案查詢
- 透過BPB(BIOS引數塊)定位到根目錄或是起始目錄位置
- 讀取目錄簇資料
- 計算目標檔名的Hash值
- 遍歷目錄,逐個比較目錄項的Hash值,如果Hash值相同,則進行檔名比較
- 檔名比較,使用UPCASE表(大寫字元元檔案)進行大小寫無關的比較
- 檢查匹配結果,如果匹配,則讀取該目錄項的詳細資訊並進行校驗
- 如果未找到匹配項且當前目錄有子目錄,遞迴進入子目錄繼續查詢
(三)優缺點
優點
(1)支援大檔案和大容量卷
FAT32 支援最大檔案4GB、最大卷2TB、每子目錄最大支援65534個檔案
exFAT 支援最大檔案16EB、最大卷128PB、每子目錄最大支援2796202個檔案
(2)輕量級和高相容性
exFAT與FAT32類似,檔案系統的後設資料比較小,適用於記憶體空間有限的嵌入式裝置
同時,exFAT也可以相容Windows、Linux、macOS 這幾個常用作業系統
(3)支援後設資料校驗
exFAT 目錄項上有校驗和引數,當目錄項內容損壞或是被篡改的時候,可以透過校驗和進行檢測
(4)效率比FAT32高
exFAT 採用簇號點陣圖+簇號連結串列的方式來管理簇號,比FAT32只能透過簇號連結串列的方式效率高
exFAT 檔案查詢的時候,首先是根據Hash值查詢,在匹配檔名,比FAT32只能比較檔名效率高
缺點
(1)專利和授許可權制
微軟擁有exFAT的多項專利,使用exFAT在某些情況下可能會涉及專利和授權問題,尤其是對於商業產品。
(2)缺乏日誌功能
與NTFS相比,exFAT缺乏日誌功能,這意味著在突然斷電或系統崩潰時,資料損壞的風險更高。
(3)碎片問題:
雖然exFAT在一定程度上減輕了檔案碎片的問題,但它依然沒有NTFS那麼高效地管理碎片。
結尾
以上就是關於exFAT檔案系統的介紹,如有錯誤,歡迎在下面評論區批評指正,不勝感激。下一篇將介紹ext4 或是ntfs 檔案系統。