前言 exFAT是微軟2006年推出的一種文件系統,距今已快二十年,相比於FAT16和FAT32,exFAT還是算年輕。exFAT一直是微軟的一個專用文件系統,直到2019年微軟發佈它的規範,目前微軟擁有exFAT多個元素的專利,如果產品上使用exFAT,需要微軟授權,否則有可能侵權。 exFAT被 ...
前言
exFAT是微軟2006年推出的一種文件系統,距今已快二十年,相比於FAT16和FAT32,exFAT還是算年輕。exFAT一直是微軟的一個專用文件系統,直到2019年微軟發佈它的規範,目前微軟擁有exFAT多個元素的專利,如果產品上使用exFAT,需要微軟授權,否則有可能侵權。
exFAT被SD協會採用作為大於32GB SDXC卡的預設文件系統,在win11系統上,SDXC卡預設格式化選項已經沒有FAT32選項,exFAT文件系統的使用範圍正逐漸擴大。
為啥微軟要用exFAT來代替FAT32呢?
因為exFAT數據結構開銷比NTFS低,但它又可以突破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 文件系統。