文件系統(五):exFAT 文件系統原理詳解

来源:https://www.cnblogs.com/liwen01/p/18214817
-Advertisement-
Play Games

前言 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 單個文件大小和分區大小的限制。

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

文件系統(二):分區、格式化數據結構

文件系統(三):嵌入式、電腦系統啟動流程與步驟

文件系統(四):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 文件系統。

 

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:背景 1. 講故事 前些天群里有一個朋友說他們軟體會偶發崩潰,想分析看看是怎麼回事,所幸的是自己會抓dump文件,有了dump就比較好分析了,接下來我們開始吧。 二:WinDbg 分析 1. 程式為什麼會崩潰 windbg 還是非常強大的,當你雙擊打開的時候會自動幫你定位過去展示崩潰時刻的寄存器 ...
  • StackExchange.Redis 是一個高性能的 Redis 客戶端庫,主要用於 .NET 環境下與 Redis 伺服器進行通信,大名鼎鼎的stackoverflow 網站就使用它。它使用非同步編程模型,能夠高效處理大量請求。支持 Redis 的絕大部分功能,包括發佈/訂閱、事務、Lua 腳本等... ...
  • 爆了,爆了,DeveloperSharp系列近期又被製造業ERP、民航飛行App、建築BIM、電力掌上營業廳、等多家大型採用,站在巨人的肩膀上你能走的更遠。 支持.Net Core2.0及以上,支持.Net Framework4.0及以上 http請求調用是開發中經常會用到的功能。在內,調用自有項目 ...
  • 前言:有時候遠程伺服器的進程你想偷偷去圍觀一下有哪些,或者對一些比較調皮的進程進行封殺,或者對一些自己研發的服務進行遠程手動啟動或者重啟等,又不想打開遠程桌面,只想悄咪咪地執行,那也許下麵的文章會對你有啟發。 前提條件 確保遠程伺服器(服務端)已啟用WinRM。在遠程伺服器上運行以下命令可以啟用和配 ...
  • !!!是的沒錯,胖友們,保姆教程系列又更新了!!! @目錄前言簡介一、磁碟分區二、文件系統三、實際操作1. 使用lsblk命令查看新加入的磁碟信息2. 使用fdisk或者cfdisk分區新磁碟,並將分區標記為Linux文件系統類型(83)3. 格式化新分區,使用mkfs命令4. 創建掛載目錄,使用m ...
  • 1. 為什麼要有線程 我們知道一個集成應用場景需要多個進程同時調度執行各自的功能,那麼多進程的本質就是產生多個執行流,每個執行流執行不同的代碼和功能,但是一個進程由PCB(task_struct)、進程地址空間、頁表、文件描述符表等資源組成,是一個資源集合,創建的開銷較大,那麼為了滿足用戶的多執行流 ...
  • 目錄題目解析代碼展示process_A.cprocess_B.cprocess_C.c結果展示重要知識點記錄 題目 設計一個程式,作為進程A,進程A專門創建一個信號量集,要求信號量集中有1個信號量,對信號量集合中的信號量進行設置,要求集合中的信號量的初值為1,然後再設計2個程式,分別是進程B和進程C ...
  • 序言Linux基本知識回顧 Linux內核安全管理機制 根文件系統rootfs Linux根目錄下文件結構 Linux文件類型標準IO 標準IO操作數據流分析 文件 打開、關閉 fopen( ) fclose( ) 文件 字元讀寫 fgetc( ) fputc( ) 文件 行讀寫 fgets( ) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...