共用方式為


exFAT 檔案系統規格

1 簡介

exFAT 文件系統是 FAT32 在 FAT 系列的文件系統中繼任者。 此規格描述 exFAT 檔案系統,並提供實作 exFAT 檔案系統所需的所有資訊。

1.1 設計目標

exFAT 檔案系統有三個中央設計目標(請參閱下方清單)。

  1. 保留 FAT 型文件系統的簡單性。

    FAT 型文件系統的兩個優點是其相對簡單且易於實作。 在前任的精神下,實作者應該發現exFAT相對簡單且容易實作。

  2. 啟用非常大的檔案和存儲設備。

    exFAT 檔案系統會使用 64 位來描述檔案大小,藉此啟用相依於非常大檔案的應用程式。 exFAT 文件系統也允許叢集大小達 32 MB,有效地啟用非常大型的存儲設備。

  3. 納入未來創新的擴充性。

    exFAT 檔系統將擴充性併入其設計中,讓文件系統能夠跟上記憶體創新及使用量變更的步調。

1.2 特定術語

在此規格的內容中,某些詞彙(請參閱 表 1)對於 exFAT 文件系統的設計和實作具有特定意義。

表 1 定義具有非常特定意義的詞彙

字詞 定義
此規格使用 「shall」 一詞來描述強制的行為。
應該 此規格會使用「應該」一詞來描述其強烈建議的行為,但不會強制使用。
五月 此規格會使用「可能」一詞來描述選擇性的行為。
命令的 此詞彙描述實作應修改的字段或結構,且應解譯為此規格所描述。
自選 此詞彙描述實作可能或可能不支援的欄位或結構。 如果實作支援指定的選擇性字段或結構,則應該修改 ,並將欄位或結構解譯為此規格所描述。
定義 此詞彙描述實作可能視需要修改的欄位或結構內容(亦即設定周圍的欄位或結構時清楚為零),不得解譯為保留任何特定意義。
保留

此字彙描述實作的欄位或結構內容:

  1. 應初始化為零,不得用於任何用途

  2. 不應該解譯,除非計算總和檢查碼時

  3. 應保留修改周圍欄位或結構的作業

1.3 常見縮寫全文

此規格使用個人計算機產業中常用的縮寫(請參閱 表 2)。

表 2 常見縮寫全文

縮寫 全文檢索
ASCII 適用於資訊交換的美國標準程序代碼
BIOS 基本輸入輸出系統
中央處理器 中央處理單位
exFAT 可延伸檔案配置數據表
脂肪 檔案配置數據表
FAT12 檔案配置數據表,12 位叢集索引
FAT16 檔案配置數據表,16 位叢集索引
FAT32 檔案配置數據表,32 位叢集索引
GPT GUID 資料分割數據表
GUID 全域唯一識別碼 (請參閱 第 10.1 節
INT 中斷
MBR 主要開機記錄
texFAT 交易安全 exFAT
UTC 國際標準時間

1.4 預設欄位和結構限定符

此規格中的欄位和結構具有下列限定元(請參閱下方清單),除非另有說明規格。

  1. 未簽署

  2. 使用十進位表示法來描述未註明的值;此規格會使用後置修正字母 「h」 來表示十六進位數位,並以大括弧括住 GUID

  3. 格式為小到大

  4. 字串不需要 Null 終止字元

1.5 Windows CE 和 TexFAT

TexFAT 是 exFAT 的延伸模組,可在基底文件系統之上新增交易安全作語意。 Windows CE 會使用 TexFAT。 TexFAT 需要使用兩個 FAT 和配置位圖,才能在交易中使用。 它也會定義數個額外的結構,包括填補描述元和安全性描述元。

2 磁碟區結構

磁碟區是儲存和擷取用戶數據所需的所有文件系統結構和數據空間集合。 所有 exFAT 磁碟區都包含四個區域(請參閱 表 3)。

表 3 磁碟區結構

子區域名稱

位移

(部門)

大小

(部門)

批注
主要開機區域
主要開機扇區 0 1 這個子區域是必要的,第 3.1 節 定義其內容。
主要擴充開機扇區 1 8 這個子區域是強制性的,第 3.2 節) 會定義其內容。
主要 OEM 參數 9 1 這個子區域是必要的,第 3.3 節 定義其內容。
主要保留 10 1 此子區域是必要專案,且其內容是保留的。
主要開機總和檢查碼 11 1 此子區域為必要專案,第 3.4 節 定義其內容。
備份開機區域
備份開機扇區 12 1 這個子區域是必要的,第 3.1 節 定義其內容。
備份擴充開機扇區 13 8 這個子區域是必要的,第 3.2 節 定義其內容。
備份 OEM 參數 21 1 這個子區域是必要的,第 3.3 節 定義其內容。
備份保留 22 1 此子區域是必要專案,且其內容是保留的。
備份開機總和檢查碼 23 1 此子區域為必要專案,第 3.4 節 定義其內容。
FAT 區域
FAT 對齊方式 24 FatOffset – 24

這個子區域是強制性的,如果有任何內容,則為未定義。

注意:主要和備份開機扇區都包含 FatOffset 字段。

第一個 FAT FatOffset FatLength

這個子區域是必要的,第 4.1 節 定義其內容。

注意:主要和備份開機扇區都包含 FatOffset 和 FatLength 字段。

第二個 FAT FatOffset + FatLength FatLength * (NumberOfFats – 1)

此子區域是強制性的,第 4.1 節 定義其內容,如果有的話。

注意:主要和備份開機扇區都包含 FatOffset、FatLength 和 NumberOfFats 字段。 NumberOfFats 字段只能保留值 1 和 2。

數據區
叢集堆積對齊方式 FatOffset + FatLength * NumberOfFats ClusterHeapOffset – (FatOffset + FatLength * NumberOfFats)

這個子區域是強制性的,如果有任何內容,則為未定義。

注意:主要和備份開機扇區都包含 FatOffset、FatLength、NumberOfFats 和 ClusterHeapOffset 字段。 NumberOfFats 字段的有效值為 1 和 2。

叢集堆積 ClusterHeapOffset ClusterCount * 2SectorsPerClusterShift

這個子區域是必要的,第 5.1 節 定義其內容。

注意:主要和備份開機扇區都包含 ClusterHeapOffset、ClusterCount 和 SectorsPerClusterShift 字段。

多餘的空間 ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift VolumeLength – (ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift

這個子區域是強制性的,如果有任何內容,則為未定義。

注意:主要和備份開機扇區都包含 ClusterHeapOffset、ClusterCount、SectorsPerClusterShift 和 VolumeLength 字段。

3 主要和備份開機區域

主要開機區域提供所有必要的開機帶狀指示、識別資訊和文件系統參數,讓實作能夠執行下列動作:

  1. 從 exFAT 磁碟區開機帶式電腦系統。

  2. 將磁碟區上的文件系統識別為 exFAT。

  3. 探索 exFAT 檔系統結構的位置。

備份開機區域是主要開機區域的備份。 當主要開機區域處於不一致狀態時,它有助於復原exFAT磁碟區。 除非在不頻繁的情況下,例如更新開機帶狀指示,否則實作不應修改備份開機區域的內容。

3.1 主要和備份開機扇區子區域

主要開機扇區包含從exFAT磁碟區進行開機綁帶的程式代碼,以及描述磁碟區結構的基本exFAT參數(請參閱 表4)。 BIOS、MBR 或其他開機帶式代理程式可能會檢查此扇區,並可能載入並執行其所包含的任何開機帶狀指示。

備份開機扇區是主要開機扇區的備份,而且具有相同的結構(請參閱 表 4)。 備份開機部門可能會協助復原作業;不過,實作會將 VolumeFlags 和 PercentInUse 欄位的內容視為過時。

在使用主要或備份開機扇區的內容之前,實作應藉由驗證各自的開機總和檢查碼來驗證其內容,並確保其所有字段都在其有效值範圍內。

雖然初始格式作業會初始化主要和備份開機扇區的內容,但實作可能會視需要更新這些扇區(而且也應該更新各自的開機總和檢查碼)。 不過,實作可能會更新 VolumeFlags 或 PercentInUse 欄位,而不更新其各自的開機總和檢查碼(總和檢查碼特別排除這兩個字段)。

表 4 主要和備份開機扇區結構

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
JumpBoot 0 3 此欄位為必要欄位,第 3.1.1 節 定義其內容。
FileSystemName 3 8 此欄位為必要欄位,第 3.1.2 節 定義其內容。
MustBeZero 11 53 此欄位為必要欄位,第 3.1.3 節 定義其內容。
PartitionOffset 64 8 此欄位為必要欄位,第 3.1.4 節 定義其內容。
VolumeLength 72 8 此欄位為必要欄位,第 3.1.5 節 定義其內容。
FatOffset 80 4 此欄位為必要欄位,第 3.1.6 節 定義其內容。
FatLength 84 4 此欄位為必要欄位,第 3.1.7 節 定義其內容。
ClusterHeapOffset 88 4 此欄位為必要欄位,第 3.1.8 節 定義其內容。
ClusterCount 92 4 此欄位為必要欄位,第 3.1.9 節 定義其內容。
FirstClusterOfRootDirectory 96 4 此欄位為必要欄位,第 3.1.10 節 定義其內容。
VolumeSerialNumber 100 4 此欄位為必要欄位,第 3.1.11 節 定義其內容。
FileSystemRevision 104 2 此欄位為必要欄位,區段 3.1.12 定義其內容。
VolumeFlags 106 2 此欄位為必要欄位,第 3.1.13 節 定義其內容。
BytesPerSectorShift 108 1 此欄位為必要欄位,第 3.1.14 節 定義其內容。
SectorsPerClusterShift 109 1 此欄位為必要欄位,第 3.1.15 節 定義其內容。
NumberOfFats 110 1 此欄位為必要欄位,第 3.1.16 節 定義其內容。
DriveSelect 111 1 此欄位為必要欄位,第 3.1.17 節 定義其內容。
PercentInUse 112 1 此欄位為必要欄位,第 3.1.18 節 定義其內容。
保留 113 7 此欄位為必要欄位,並保留其內容。
BootCode 120 390 此欄位為必要欄位,第 3.1.19 節 定義其內容。
BootSignature 510 2 此欄位為必要欄位,第 3.1.20 節 定義其內容。
ExcessSpace 512 2BytesPerSectorShift – 512

此欄位是必要欄位,如果有任何內容,則為未定義。

注意:主要和備份開機扇區都包含 BytesPerSectorShift 字段。

3.1.1 JumpBoot 欄位

JumpBoot 欄位應包含個人電腦中常見的 CPU 跳躍指示,執行時,CPU 會在 BootCode 字段中執行開機綁帶指令。

此欄位的有效值為 (以低順序位元組到高階位元組的順序) EBh 76h 90h。

3.1.2 FileSystemName 字段

FileSystemName 字段應包含磁碟區上的文件系統名稱。

此欄位的有效值為 ASCII 字元 「EXFAT」,其中包含三個尾端空格符。

3.1.3 MustBeZero 字段

MustBeZero 位元段應直接與 FAT12/16/32 磁碟區上包裝 BIOS 參數區塊取用的位元組範圍相對應。

此欄位的有效值為 0,有助於防止 FAT12/16/32 實作錯誤地掛接 exFAT 磁碟區。

3.1.4 PartitionOffset 字段

PartitionOffset 字段應該描述裝載指定 exFAT 磁碟區之數據分割的媒體相對扇區位移。 此字段有助於在個人計算機上使用擴充 INT 13h 從磁碟區進行開機綁帶。

此欄位的所有可能值都是有效的;不過,值 0 表示實作應該忽略此欄位。

3.1.5 VolumeLength 字段

VolumeLength 字段應描述扇區中指定 exFAT 磁碟區的大小。

此欄位的有效值範圍應該是:

  • 至少 220/ 2BytesPerSectorShift,這可確保最小磁碟區不小於 1MB

  • 最多 264- 1,此字段可以描述的最大值。

    不過,如果多餘的空間子區域大小為 0,則此字段的最大值為 ClusterHeapOffset + (232- 11) * 2SectorsPerClusterShift

3.1.6 FatOffset 字段

FatOffset 字段應描述第一個 FAT 的數量相對扇區位移。 此欄位可讓實作讓第一個 FAT 符合基礎儲存媒體的特性。

此欄位的有效值範圍應該是:

  • 至少 24 個,這佔主要開機和備份開機區域取用的扇區

  • 最多叢集HeapOffset - (FatLength * NumberOfFats),其占叢集堆積取用的扇區

3.1.7 FatLength 欄位

FatLength 欄位應描述每個 FAT 數據表的扇區長度(磁碟區最多可包含兩個 FAT)。

此欄位的有效值範圍應該是:

  • 至少 (ClusterCount + 2) * 22/ 2BytesPerSectorShift四捨五入為最接近的整數,以確保每個 FAT 有足夠的空間來描述叢集堆積中的所有叢集

  • 最多 (ClusterHeapOffset - FatOffset) / NumberOfFats 四捨五入為最接近的整數,以確保叢集堆積之前有 FAT

此欄位可能包含超出其下限的值(如上所述),讓第二個 FAT,如果有的話,也會與基礎儲存媒體的特性一致。 超出 FAT 本身所需之空間的內容,如果有的話,則為未定義。

3.1.8 ClusterHeapOffset 字段

[ClusterHeapOffset] 字段應該描述叢集堆積的磁碟區相對扇區位移。 此欄位可讓實作讓叢集堆積符合基礎儲存媒體的特性。

此欄位的有效值範圍應該是:

  • 至少 FatOffset + FatLength * NumberOfFats,以考慮上述所有區域取用的扇區

  • 最多 232- 1 或 VolumeLength - (ClusterCount * 2SectorsPerClusterShift),無論計算少

3.1.9 ClusterCount 字段

[ClusterCount] 字段應該描述叢集堆積所包含的叢集數目。

此欄位的有效值應小於下列其中一項:

  • (VolumeLength - ClusterHeapOffset) / 2SectorsPerClusterShift四捨五入為最接近的整數,這正是叢集數目,該叢集可在叢集堆積開頭與磁碟區結尾之間調整

  • 232- 11,這是 FAT 可描述的最大叢集數目

[ClusterCount] 字段的值會決定 FAT 的大小下限。 為了避免極大型的 FAT,實作可以藉由增加叢集大小來控制叢集堆積中的叢集數目(透過 SectorsPerClusterShift 字段)。 此規格建議在叢集堆積中不超過 224 個- 2 個叢集。 不過,實作應該能夠處理叢集堆積中最多 2 個32 個- 11 個叢集的磁碟區。

3.1.10 FirstClusterOfRootDirectory 字段

FirstClusterOfRootDirectory 字段應包含根目錄第一個叢集的叢集索引。 實作應該盡一切努力將根目錄的第一個叢集放在叢集的配置位圖和向上案例數據表取用之後的第一個非不良叢集中。

此欄位的有效值範圍應該是:

  • 至少 2,叢集堆積中第一個叢集的索引

  • 最多叢集計數 + 1,叢集堆積中最後一個叢集的索引

3.1.11 VolumeSerialNumber 字段

VolumeSerialNumber 字段應包含唯一的序號。 這可協助實作區分不同的exFAT磁碟區。 實作應該結合格式化 exFAT 磁碟區的日期和時間來產生序號。 結合日期和時間形成序號的機制是實作特定的。

此欄位的所有可能值都是有效的。

3.1.12 FileSystemRevision 字段

FileSystemRevision 字段應描述指定磁碟區上 exFAT 結構的主要和次要修訂編號。

高階位元組是主要修訂編號,而低階位元組則是次要修訂編號。 例如,如果高階位元組包含值01h,而低階位元組包含值05h,則FileSystemRevision位元段會描述修訂編號1.05。 同樣地,如果高階位元組包含0Ah值,如果低序位元組包含0Fh值,則FileSystemRevision位元段會描述修訂編號10.15。

此欄位的有效值範圍應該是:

  • 低階位元組至少為0,高階位元組至少為1

  • 低階位元組最多 99,高階位元組為 99

此規格描述的 exFAT 修訂編號為 1.00。 此規格的實作應該掛接任何具有主要修訂編號 1 的 exFAT 磁碟區,且不得掛接任何其他主要修訂編號的任何 exFAT 磁碟區。 實作應遵守次要修訂編號,不得執行作業或建立未在指定次要修訂編號對應規格中描述的任何文件系統結構。

3.1.13 VolumeFlags 字段

VolumeFlags 字段應包含旗標,指出 exFAT 磁碟區上各種文件系統結構的狀態(請參閱 表 5)。

實作在計算其各自的主要開機或備份開機區域總和檢查碼時,不應包含此欄位。 參考備份開機扇區時,實作會將此字段視為過時。

表格 5 VolumeFlags 字段結構

功能變數名稱

位移

(位)

大小

(位)

批注
ActiveFat 0 1 此欄位為必要欄位,第 3.1.13.1 節 定義其內容。
VolumeDirty 1 1 此欄位為必要欄位,第 3.1.13.2 節 定義其內容。
MediaFailure 2 1 此欄位為必要欄位,第 3.1.13.3 節 定義其內容。
ClearToZero 3 1 此欄位為必要欄位,第 3.1.13.4 節 定義其內容。
保留 4 12 此欄位為必要欄位,並保留其內容。
3.1.13.1 ActiveFat 字段

ActiveFat 字段應描述哪些 FAT 和配置位圖為作用中 (且應使用 實作),如下所示:

  • 0,這表示第一個 FAT 和第一個配置位圖為使用中

  • 1,這表示第二個 FAT 和第二個配置位圖為使用中,而且只有在 NumberOfFats 字段包含值 2 時才可能

實作會將非作用中的 FAT 和配置位圖視為過時。 只有 TexFAT 感知實作才能切換使用中的 FAT 和配置位圖(請參閱 第 7.1 節)。

3.1.13.2 VolumeDirty 字段

VolumeDirty 字段應該描述磁碟區是否肮髒,如下所示:

  • 0,這表示磁碟區可能處於一致狀態

  • 1,這表示磁碟區可能處於不一致的狀態

實作應該會在遇到無法解析的文件系統元數據不一致時,將此字段的值設定為 1。 如果掛接磁碟區時,此欄位的值是 1,則只有解析文件系統元數據不一致之實作可能會將此欄位的值清除為 0。 這類實作只有在確保文件系統處於一致狀態之後,才會將此欄位的值清除為 0。

如果掛接磁碟區時,此位元段的值為0,則實作應該將此欄位設定為1,再更新文件系統元數據,之後將此欄位清除為0,類似於 第8.1節8.1中所述的建議寫入順序。

3.1.13.3 MediaFailure 字段

MediaFailure 字段應該描述實作是否發現媒體失敗,如下所示:

  • 0,這表示裝載媒體未回報失敗,或 FAT 中已記錄任何已知失敗為「不良」叢集

  • 1,這表示主控媒體回報失敗(亦即讀取或寫入作業失敗)

當下列情況時,實作應該將此字段設定為 1:

  1. 裝載媒體無法嘗試存取磁碟區中的任何區域

  2. 實作已用盡存取重試演算法,如果有的話

如果掛接磁碟區時,此字段的值是 1,實作會掃描整個磁碟區是否有媒體失敗,並將所有失敗記錄為 FAT 中的「不良」叢集(否則解決媒體失敗)可能會將此字段的值清除為 0。

3.1.13.4 ClearToZero 字段

ClearToZero 欄位在此規格中沒有意義。

此欄位的有效值為:

  • 0,其沒有任何特定意義

  • 1,這表示實作應該先將此字段清除為0,再修改任何文件系統結構、目錄或檔案

3.1.14 BytesPerSectorShift 字段

BytesPerSectorShift 字段應該描述以記錄2(N) 表示的每個扇區位元組,其中 N 是每個扇區的位元組數目。 例如,針對每個扇區 512 個字節,此欄位的值是 9。

此欄位的有效值範圍應該是:

  • 至少 9 個 (扇區大小為 512 個字節),這是 exFAT 磁碟區可能最小的扇區

  • 最多12個 (扇區大小為4096個字節),這是個人計算機中常見的CPU記憶體頁面大小

3.1.15 SectorsPerClusterShift 字段

SectorsPerClusterShift 字段應描述以記錄2(N) 表示的每個群集扇區,其中 N 是每個叢集的扇區數目。 例如,針對每個叢集 8 個扇區,此字段的值是 3。

此欄位的有效值範圍應該是:

  • 至少 0 個(每個叢集 1 個扇區),這是最小的叢集

  • 最多 25 - BytesPerSectorShift,其評估為 32MB 的叢集大小

3.1.16 NumberOfFats 字段

NumberOfFats 字段應該描述磁碟區所包含的 FAT 數目和配置位陣圖。

此欄位的有效值範圍應該是:

  • 1,表示磁碟區只包含第一個 FAT 和第一個配置位圖

  • 2,表示磁碟區包含第一個 FAT、第二個 FAT、第一個配置位圖和第二個配置位圖:此值僅適用於 TexFAT 磁碟區

3.1.17 DriveSelect 字段

DriveSelect 字段應包含延伸的 INT 13h 磁碟驅動器號碼,這可協助在個人電腦上使用延伸 INT 13h 從此磁碟區進行開機綁帶。

此欄位的所有可能值都是有效的。 先前 FAT 型文件系統中的類似字段經常包含值 80h。

3.1.18 PercentInUse 欄位

PercentInUse 字段應該描述已配置叢集堆積中的叢集百分比。

此欄位的有效值範圍應該是:

  • 在 0 到 100 之間,這是叢集堆積中配置叢集的百分比,四捨五入為最接近的整數

  • 完全 FFh,指出叢集堆積中已配置叢集的百分比無法使用

實作應變更此欄位的值,以反映叢集堆積中叢集配置變更,或將它變更為 FFh。

實作在計算其各自的主要開機或備份開機區域總和檢查碼時,不應包含此欄位。 參考備份開機扇區時,實作會將此字段視為過時。

3.1.19 BootCode 欄位

BootCode 欄位應包含開機帶式指示。 實作可能會將此欄位填入開機綁帶電腦系統所需的 CPU 指示。 未提供開機帶指示的實作,應將此欄位中的每一個字節初始化為 F4h(個人電腦中常見的 CPU 停止指令),做為其格式作業的一部分。

3.1.20 BootSignature 字段

BootSignature 字段應該描述指定扇區的意圖是否為開機扇區。

此欄位的有效值為 AA55h。 此欄位中的任何其他值會使其各自的開機扇區失效。 實作應該先確認此字段的內容,再依其個別開機扇區的任何其他字段而定。

3.2 主要和備份擴充開機扇區子區域

主要擴充開機扇區的每個扇區都有相同的結構:不過,每個扇區可能會有不同的靴子綁帶指示(請參閱表 6)。 開機帶式代理程式,例如主要開機扇區中的開機帶狀指示、替代 BIOS 實作或內嵌系統的韌體,可能會載入這些扇區,並執行它們所包含的指示。

備份擴充開機扇區是主要擴充開機扇區的備份,而且具有相同的結構(請參閱 表 6)。

在執行主要或備份擴充開機扇區的指示之前,實作應確認其內容,方法是確保每個扇區的 ExtendedBootSignature 字段包含其指定的值。

雖然初始格式作業會初始化主要和備份擴充開機扇區的內容,但實作可能會更新這些扇區(並視需要更新各自的開機總和檢查碼)。

表 6 擴充開機扇區結構

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
ExtendedBootCode 0 2BytesPerSectorShift – 4

此欄位為必要欄位,第 3.2.1 節 定義其內容。

注意:主要和備份開機扇區都包含 BytesPerSectorShift 字段。

ExtendedBootSignature 2BytesPerSectorShift – 4 4

此欄位為必要欄位,區段 3.2.2 定義其內容。

注意:主要和備份開機扇區都包含 BytesPerSectorShift 字段。

3.2.1 ExtendedBootCode 字段

ExtendedBootCode 字段應包含啟動帶式指示。 實作可能會將此欄位填入開機綁帶電腦系統所需的 CPU 指示。 未提供開機帶式指令的實作,應將此位元段中的每一個字節初始化為 00h,做為其格式作業的一部分。

3.2.2 ExtendedBootSignature 字段

ExtendedBootSignature 字段應描述指定扇區的意圖是否為延伸開機扇區。

此欄位的有效值為 AA550000h。 此欄位中的任何其他值會使其各自的主要或備份擴充開機扇區失效。 實作應該先確認此欄位的內容,再依其個別擴充開機扇區中的其他任何欄位而定。

3.3主要和備份 OEM 參數子區域

主要 OEM 參數子區域包含十個參數結構,可能包含製造商特定資訊(請參閱表 7 )。 這十個參數結構中的每個都衍生自泛型參數範本(請參閱 第 3.3.2 節)。 製造商可以從泛型參數範本衍生自己的自定義參數結構。 此規格本身定義兩個參數結構:Null 參數(請參閱 第 3.3.3 節) 和 Flash 參數 (請參閱 第 3.3.4 節)。

備份 OEM 參數是主要 OEM 參數的備份,而且具有相同的結構(請參閱表 7 )。

在使用主要或備份 OEM 參數的內容之前,實作應藉由驗證其各自的開機總和檢查碼來驗證其內容。

製造商應該使用自己的自定義參數結構填入 Main 和 Backup OEM 參數,如果有的話,以及任何其他參數結構。 後續的格式作業應保留Main和Backup OEM 參數的內容。

實作可以視需要更新主要和備份 OEM 參數(而且也應該更新各自的開機總和檢查碼)。

表 7 OEM 參數結構

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
Parameters[0] 0 48 此欄位為必要欄位,第 3.3.1 節 定義其內容。

.

.

.

.

.

.

.

.

.

.

.

.

Parameters[9] 432 48 此欄位為必要欄位,第 3.3.1 節 定義其內容。
保留 480 2BytesPerSectorShift – 480

此欄位為必要欄位,並保留其內容。

注意:主要和備份開機扇區都包含 BytesPerSectorShift 字段。

3.3.1 參數[0] ...Parameters[9]

此陣列中的每個Parameters字段都包含參數結構,其衍生自泛型參數範本(請參閱 第3.3.2節)。 任何未使用的Parameters字段應描述為包含Null Parameters結構(請參閱 第3.3.3節)。

3.3.2 泛型參數範本

泛型參數範本提供參數結構的基底定義(請參閱表 8 )。 所有參數結構都衍生自此範本。 此泛型參數範本的支援是必要的。

表 8 泛型參數範本

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
ParametersGuid 0 16 此欄位為必要欄位,區段 3.3.2.1 定義其內容。
CustomDefined 16 32 此欄位是必要欄位,且衍生自此範本的結構會定義其內容。
3.3.2.1 ParametersGuid 字段

ParametersGuid 字段應描述 GUID,以決定指定參數結構的其餘部分的配置。

此欄位的所有可能值都是有效的;不過,製造商應該使用 GUID 產生工具,例如 GuidGen.exe,從此範本衍生自定義參數結構時選取 GUID。

3.3.3 Null 參數

Null Parameters 結構衍生自泛型參數範本(請參閱 < 第 3.3.2 節>,並描述未使用的參數位段(請參閱表 9 )。 建立或更新 OEM 參數結構時,實作應該使用 Null Parameters 結構填入未使用的 Parameters 字段。 此外,建立或更新 OEM 參數結構時,實作應該合併數位結尾的 Null Parameters 結構,從而將所有其他 Parameters 結構留在 OEM 參數結構的開頭。

對 Null 參數結構的支援是必要的。

表 9 Null 參數結構

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
ParametersGuid 0 16 此欄位為必要欄位,區段 3.3.3.1 定義其內容。
保留 16 32 此欄位為必要欄位,並保留其內容。
3.3.3.1 ParametersGuid 字段

ParametersGuid 字段應符合泛型參數範本所提供的定義(請參閱 第 3.3.2.1 節)。

此欄位的有效值在 GUID 表示法中為 {00000000-0000-0000-0000-000000000000}。

3.3.4 Flash 參數

Flash 參數結構衍生自泛型參數範本(請參閱 第 3.3.2 節),並包含快閃媒體的參數(請參閱 表 10。 以快閃為基礎的存儲設備製造商可能會填入 [參數] 字段(最好是 Parameters[0] 字段),並具有這個參數結構。 實作可能會使用 Flash Parameters 結構中的資訊,在讀取/寫入期間優化存取作業,以及調整文件系統結構的固定格式設定。

Flash 參數結構的支持是選擇性的。

表 10 Flash 參數結構

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
ParametersGuid 0 16 此欄位為必要欄位,區段 3.3.4.1 定義其內容。
EraseBlockSize 16 4 此欄位為必要欄位,區段 3.3.4.2 定義其內容。
PageSize 20 4 此欄位為必要欄位,區段 3.3.4.3 定義其內容。
SpareSectors 24 4 此欄位為必要欄位,第 3.3.4.4 節 定義其內容。
RandomAccessTime 28 4 此欄位為必要欄位,區段 3.3.4.5 定義其內容。
ProgrammingTime 32 4 此欄位為必要欄位,區段 3.3.4.6 定義其內容。
ReadCycle 36 4 此欄位為必要欄位,第 3.3.4.7 節 定義其內容。
WriteCycle 40 4 此欄位為必要欄位,區段 3.3.4.8 定義其內容。
保留 44 4 此欄位為必要欄位,並保留其內容。

除了 ParametersGuid 欄位之外,所有 Flash Parameters 欄位的所有可能值都是有效的。 不過,值 0 表示欄位實際上毫無意義(實作應忽略指定的欄位)。

3.3.4.1 ParametersGuid 字段

ParametersGuid 字段應符合泛型參數範本中提供的定義(請參閱 第 3.3.2.1 節)。

在 GUID 表示法中,此字段的有效值為 {0A0C7E46-3399-4021-90C8-FA6D389C4BA2}。

3.3.4.2 EraseBlockSize 字段

EraseBlockSize 字段應該描述快閃媒體清除區塊的大小,以位元組為單位。

3.3.4.3 PageSize 字段

PageSize 位元組應該以快閃媒體頁面的位元組為單位來描述大小。

3.3.4.4 備用專案欄位

備用裝置欄位應描述閃光媒體為其內部疏散作業可用的扇區數目。

3.3.4.5 RandomAccessTime 字段

RandomAccessTime 字段應以 nanoseconds 描述快閃媒體的平均隨機存取時間。

3.3.4.6 程式設計時間欄位

[程序設計時間] 字段應以 nano 秒描述快閃媒體的平均程式設計時間。

3.3.4.7 ReadCycle 字段

ReadCycle 字段應該以奈秒為單位來描述快閃媒體的平均讀取周期時間。

3.3.4.8 WriteCycle 字段

WriteCycle 字段應該以 nanoseconds 描述平均寫入周期時間。

3.4主要和備份開機總和檢查碼子區域

主要和備份開機總和檢查碼各包含其個別開機區域中所有其他子區域內容的四位元組總和檢查碼重複模式。 總和檢查碼計算不應在其各自的開機扇區中包含 VolumeFlags 和 PercentInUse 欄位(請參閱 圖 1)。 四位元組總和檢查碼的重複模式會從子區域的開頭到結尾填滿其各自的開機總和檢查碼子區域。

在主要或備份開機區域中使用任何其他子區域的內容之前,實作應藉由驗證其各自的開機總和檢查碼來驗證其內容。

雖然初始格式作業會以重複總和檢查碼模式填入Main和BackupBoot Checksum,但實作會隨著各自開機區域中其他扇區的內容變更而更新這些扇區。

圖 1 開機總和檢查碼計算

UInt32 BootChecksum
(
    UCHAR  * Sectors,        // points to an in-memory copy of the 11 sectors
    USHORT   BytesPerSector
)
{
    UInt32 NumberOfBytes = (UInt32)BytesPerSector * 11;
    UInt32 Checksum = 0;
    UInt32 Index;

    for (Index = 0; Index < NumberOfBytes; Index++)
    {
        if ((Index == 106) || (Index == 107) || (Index == 112))
        {
            continue;
        }
        Checksum = ((Checksum&1) ? 0x80000000 : 0) + (Checksum>>1) + (UInt32)Sectors[Index];
    }

    return Checksum;
}

4 檔案配置數據表區域

檔案配置數據表 (FAT) 區域最多可包含兩個 FAT,一個位於第一個 FAT 子區域,另一個位於第二個 FAT 子區域中。 NumberOfFats 字段描述此區域包含多少個 FAT。 NumberOfFats 字段的有效值為 1 和 2。 因此,第一個 FAT 子區域一律包含 FAT。 如果 NumberOfFats 字段是兩個,則第二個 FAT 子區域也會包含 FAT。

VolumeFlags 字段的 ActiveFat 字段描述哪些 FAT 為作用中。 只有主要開機扇區中的 VolumeFlags 欄位是最新的。 實作應將非作用中的 FAT 視為過時。 使用非作用中的 FAT 並在 FAT 之間切換是特定的實作。

4.1 第一個和第二個 FAT 子區域

FAT 應描述叢集堆積中的叢集鏈結(請參閱 表 11)。 叢集鏈結是一系列叢集,可提供空間來記錄檔案、目錄和其他文件系統結構的內容。 FAT 會將叢集鏈結表示為叢集索引的明確連結清單。 除了前兩個專案之外,FAT 中的每個專案都代表一個叢集。

表 11 檔案配置數據表結構

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
FatEntry[0] 0 4 此欄位為必要欄位,第 4.1.1 節 定義其內容。
FatEntry[1] 4 4 此欄位為必要欄位,第 4.1.2 節 定義其內容。
FatEntry[2] 8 4 此欄位為必要欄位,第 4.1.3 節 定義其內容。

.

.

.

.

.

.

.

.

.

.

.

.

FatEntry[ClusterCount+1] (ClusterCount + 1) * 4 4

此欄位為必要欄位,第 4.1.3 節 定義其內容。

ClusterCount + 1 永遠不能超過 FFFFFFF6h。

注意:主要和備份開機扇區都包含 [ClusterCount] 字段。

ExcessSpace (ClusterCount + 2) * 4 (FatLength * 2BytesPerSectorShift) – (ClusterCount + 2) * 4)

此欄位是必要欄位,如果有任何內容,則為未定義。

注意:主要和備份開機扇區都包含 ClusterCount、FatLength 和 BytesPerSectorShift 字段。

4.1.1 FatEntry[0] 字段

FatEntry[0] 位元元應描述第一個字節 (最低順序位元組) 中的媒體類型,並包含其餘三個字節中的 FFh。

媒體類型 (第一個字節) 應該是 F8h。

4.1.2 FatEntry[1] 字段

FatEntry[1] 字段只會因為歷史優先順序而存在,而且不會描述任何感興趣的專案。

此欄位的有效值為 FFFFFFFFh。 實作應將此字位初始化為其指定值,且不應將此字段用於任何用途。 實作不應解譯此字段,而且應該在修改周圍欄位的作業之間保留其內容。

4.1.3 FatEntry[2] ...FatEntry[ClusterCount+1] 字段

此陣列中的每個 FatEntry 字段都應該代表叢集堆積中的叢集。 FatEntry[2] 代表叢集堆積中的第一個叢集,而 FatEntry[ClusterCount+1] 代表叢集堆積中的最後一個叢集。

這些欄位的有效值範圍應該是:

  • 介於 2 與 ClusterCount + 1 之間,這可指向指定叢集鏈結中的下一個 FatEntry;指定的 FatEntry 不得指向在指定叢集鏈結中之前的任何 FatEntry

  • 完全 FFFFFFF7h,它會將指定的 FatEntry 對應叢集標示為「壞」

  • 完全符合 FFFFFFFFh,它會將指定的 FatEntry 對應叢集標示為叢集鏈結的最後一個叢集;這是任何指定叢集鏈結中最後一個 FatEntry 的唯一有效值

5 數據區

數據區域包含叢集堆積,可為文件系統結構、目錄和檔案提供受控空間。

5.1 叢集堆積子區域

叢集堆積的結構非常簡單(請參閱 表 12):每個連續數列的扇區都會描述一個叢集,因為 SectorsPerClusterShift 欄位會定義。 重要的是,叢集堆積的第一個叢集有索引 2,其直接對應至 FatEntry[2] 的索引。

在 exFAT 磁碟區中,配置位圖(請參閱 第 7.1.5 節)會維護所有叢集的配置狀態記錄。 這與 exFAT 的前身(FAT12、FAT16 和 FAT32)有很大的差異,其中 FAT 會維護叢集堆積中所有叢集的配置狀態記錄。

表 12 叢集堆積結構

功能變數名稱

位移

(部門)

大小

(部門)

批注
Cluster[2] ClusterHeapOffset 2SectorsPerClusterShift

此欄位為必要欄位,第 5.1.1 節 定義其內容。

注意:主要和備份開機扇區都包含 ClusterHeapOffset 和 SectorsPerClusterShift 字段。

.

.

.

.

.

.

.

.

.

.

.

.

Cluster[ClusterCount+1] ClusterHeapOffset + (ClusterCount – 1) * 2SectorsPerClusterShift 2SectorsPerClusterShift

此欄位為必要欄位,第 5.1.1 節 定義其內容。

注意:主要和備份開機扇區都包含 ClusterCount、ClusterHeapOffset 和 SectorsPerClusterShift 字段。

5.1.1 叢集[2] ...Cluster[ClusterCount+1] 字段

此陣列中的每個叢集欄位都是一系列的連續扇區,其大小是由 SectorsPerClusterShift 字段所定義。

6 目錄結構

exFAT 檔案系統會使用目錄樹狀目錄方法來管理存在於叢集堆積中的文件系統結構和檔案。 目錄在目錄樹狀目錄中的父系和子系之間具有一對多關聯性。

FirstClusterOfRootDirectory 字段所參考的目錄是目錄樹狀目錄的根目錄。 所有其他目錄都會以單向連結的方式從根目錄遞減。

每個目錄都包含一系列目錄專案(請參閱表 13 )。

一或多個目錄項目結合成目錄專案集,描述感興趣的專案,例如文件系統結構、子目錄或檔案。

表 13 目錄結構

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
DirectoryEntry[0] 0 32 此欄位為必要欄位,第 6.1 節 定義其內容。

.

.

.

.

.

.

.

.

.

.

.

.

DirectoryEntry[N–1] (N – 1) * 32 32

此欄位為必要欄位,第 6.1 節 定義其內容。

N,DirectoryEntry 位元段的數目,是包含指定目錄的叢集鏈結大小,除以 DirectoryEntry 位元位的大小,32 個字節。

6.1 DirectoryEntry[0] ...DirectoryEntry[N--1]

此陣列中的每個 DirectoryEntry 欄位都衍生自 Generic DirectoryEntry 樣本(請參閱 < 第 6.2 節>。

6.2 一般 DirectoryEntry 範本

Generic DirectoryEntry 範本提供目錄專案的基底定義(請參閱 表 14)。 所有目錄項目結構都衍生自此範本,而且只有Microsoft定義的目錄項目結構有效(exFAT 沒有製造商定義的目錄項目結構布建,但如 第 7.8 節第 7.9 節中所定義除外)。 解譯 Generic DirectoryEntry 範本的能力是必要的。

表 14 一般 DirectoryEntry 範本

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
EntryType 0 1 此欄位為必要欄位,Section 6.2.1 定義其內容。
CustomDefined 1 19 此欄位是必要欄位,衍生自此範本的結構可能會定義其內容。
FirstCluster 20 4 此欄位為必要欄位,第 6.2.2 節 定義其內容。
DataLength 24 8 此欄位為必要欄位,第 6.2.3 節 定義其內容。

6.2.1 EntryType 欄位

EntryType 欄位有三種使用模式,欄位的值會定義這些模式(請參閱下方清單)。

  • 00h,這是目錄結尾標記,適用下列條件:

    • 指定 DirectoryEntry 中的所有其他欄位實際上都會保留

    • 指定目錄中所有後續的目錄專案也是目錄結尾標記

    • 目錄結尾標記只有在目錄專案集外部才有效

    • 實作可能會視需要覆寫目錄結尾標記

  • 在 01h 和 7Fh 之間,這是未使用的目錄項目標記,且適用下列條件:

    • 指定 DirectoryEntry 中的所有其他欄位實際上都未定義

    • 未使用的目錄專案只有在目錄專案集之外才有效

    • 實作可能會視需要覆寫未使用的目錄專案

    • 這個值範圍對應至 InUse 欄位(請參閱 第 6.2.1.4 節),其中包含值 0

  • 在 81h 和 FFh 之間,這是一般目錄專案,且適用下列條件:

    • EntryType 欄位的內容(請參閱 表格 15)決定 DirectoryEntry 結構其餘部分的配置

    • 這個值範圍,而且只有這個值範圍,在目錄專案集內有效

    • 這個值範圍會直接對應至 InUse 欄位(請參閱 第 6.2.1.4 節),其中包含值 1

若要防止修改 InUse 欄位(請參閱 第 6.2.1.4 節)錯誤地導致目錄結尾標記,值 80h 無效。

表格 15 泛型 EntryType 字段結構

功能變數名稱

位移

(位)

大小

(位)

批注
TypeCode 0 5 此欄位為必要欄位,第 6.2.1.1 節 定義其內容。
TypeImportance 5 1 此欄位為必要欄位,而 Section Section 6.2.1.2 會定義其內容。
TypeCategory 6 1 此欄位為必要欄位,第 6.2.1.3 節 定義其內容。
InUse 7 1 此欄位為必要欄位,第 6.2.1.4 節 定義其內容。
6.2.1.1 TypeCode 字段

TypeCode 欄位部分描述指定目錄專案的特定類型。 此欄位加上 TypeImportance 和 TypeCategory 字段(請參閱 第 6.2.1.2 節Section 6.2.1.3,分別可唯一識別指定目錄項目的類型。

除非 TypeImportance 和 TypeCategory 欄位都包含值 0,否則此字段的所有可能值為有效;在此情況下,這個欄位的值 0 無效。

6.2.1.2 TypeImportance 字段

TypeImportance 字段應該描述指定目錄專案的重要性。

此欄位的有效值為:

6.2.1.3 TypeCategory 字段

TypeCategory 字段應該描述指定目錄項目的類別。

此欄位的有效值為:

  • 0,這表示指定的目錄專案是主要專案(請參閱 第 6.3 節

  • 1,這表示指定的目錄專案為次要專案(請參閱第 6.4 節

6.2.1.4 InUse 欄位

InUse 欄位應該描述指定的目錄專案是否使用中。

此欄位的有效值為:

  • 0,這表示指定的目錄專案不在使用中;這表示指定的結構實際上是未使用的目錄專案

  • 1,這表示指定的目錄專案正在使用中;這表示指定的結構是一般目錄專案

6.2.2 FirstCluster 欄位

FirstCluster 字段應包含與指定目錄專案相關聯之叢集堆積中配置之第一個叢集的索引。

此欄位的有效值範圍應該是:

  • 正好 0,這表示沒有任何叢集配置存在

  • 介於 2 和 ClusterCount + 1 之間,這是有效叢集索引的範圍

如果叢集配置與衍生結構不相容,則衍生自此範本的結構可能會重新定義 FirstCluster 和 DataLength 字段。

6.2.3 DataLength 字段

DataLength 字段描述相關聯叢集配置所包含的數據大小,以位元組為單位。

此欄位的有效值範圍為:

  • 至少 0;如果 FirstCluster 字段包含值 0,則此字段的唯一有效值為 0

  • 最多 ClusterCount * 2SectorsPerClusterShift* 2BytesPerSectorShift

如果衍生自此範本的結構無法針對衍生結構重新定義 FirstCluster 和 DataLength 字段。

6.3 一般主要目錄Entry 範本

目錄專案集中的第一個目錄項目應該是主要目錄專案。 目錄中所有後續的目錄專案,如果有的話,都應該是次要目錄專案(請參閱 第 6.4 節)。

解譯泛型主要目錄Entry 範本的能力是必要的。

所有主要目錄項目結構都衍生自泛型主要目錄Entry 範本(請參閱 表 16),其衍生自 Generic DirectoryEntry 範本(請參閱第 6.2 節 )。

表格 16 一般主要目錄Entry 範本

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
EntryType 0 1 此欄位為必要欄位,第 6.3.1 節 定義其內容。
SecondaryCount 1 1 此欄位為必要欄位,第 6.3.2 節 定義其內容。
SetChecksum 2 2 此欄位為必要欄位,區段 6.3.3 定義其內容。
GeneralPrimaryFlags 4 2 此欄位為必要欄位,第 6.3.4 節 定義其內容。
CustomDefined 6 14 此欄位是必要欄位,且衍生自此範本的結構會定義其內容。
FirstCluster 20 4 此欄位為必要欄位,第 6.3.5 節 定義其內容。
DataLength 24 8 此欄位為必要欄位,第 6.3.6 節 定義其內容。

6.3.1 EntryType 欄位

EntryType 字段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.1 節)。

6.3.1.1 TypeCode 字段

TypeCode 字段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.1.1 節)。

6.3.1.2 TypeImportance 字段

TypeImportance 位元段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.1.2 節)。

6.3.1.2.1 重要主要目錄專案

重要主要目錄專案包含適當管理exFAT磁碟區的重要資訊。 只有根目錄包含重要的主要目錄專案(檔案目錄專案是例外狀況,請參閱 第 7.4 節)。

重要主要目錄項目的定義與主要exFAT修訂編號相互關聯。 實作應該支援所有重要的主要目錄專案,而且只記錄此規格所定義的重要主要目錄項目結構。

6.3.1.2.2 良性主要目錄專案

良性主要目錄專案包含其他資訊,可能有助於管理 exFAT 磁碟區。 任何目錄都可能包含良性的主要目錄專案。

良性主要目錄項目的定義與次要exFAT修訂編號相互關聯。 支援此規格或任何後續規格的任何良性主要目錄專案,定義是選擇性的。 無法辨識的良性主要目錄專案會將整個目錄專案集轉譯為無法辨識(超出適用目錄項目範本的定義)。

6.3.1.3 TypeCategory 字段

TypeCategory 字段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.1.3 節)。

在此範本中,此欄位的有效值為 0。

6.3.1.4 InUse 欄位

InUse 位元應符合 Generic DirectoryEntry 樣本中提供的定義(請參閱 第 6.2.1.4 節)。

6.3.2 SecondaryCount 字段

SecondaryCount 字段應該描述緊接在指定主要目錄項目之後的次要目錄項目數目。 這些次要目錄專案以及指定的主要目錄專案組成目錄專案集。

此欄位的有效值範圍應該是:

  • 至少 0,這表示此主要目錄專案是目錄專案集中唯一的專案

  • 最多 255 個,這表示接下來的 255 個目錄專案和這個主要目錄專案包含目錄專案集

衍生自此範本的重要主要目錄項目結構可能會重新定義 SecondaryCount 和 SetChecksum 字段。

6.3.3 SetChecksum 欄位

SetChecksum 字段應該包含指定目錄專案集中所有目錄專案的總和檢查碼。 不過,總和檢查碼會排除此字段(請參閱 圖 2)。 實作應該先確認此欄位的內容是否有效,再使用指定目錄專案集中的任何其他目錄專案。

衍生自此範本的重要主要目錄項目結構可能會重新定義 SecondaryCount 和 SetChecksum 字段。

圖 2 EntrySetChecksum 計算

UInt16 EntrySetChecksum
(
    UCHAR * Entries,       // points to an in-memory copy of the directory entry set
    UCHAR   SecondaryCount
)
{
    UInt16 NumberOfBytes = ((UInt16)SecondaryCount + 1) * 32;
    UInt16 Checksum = 0;
    UInt16 Index;

    for (Index = 0; Index < NumberOfBytes; Index++)
    {
        if ((Index == 2) || (Index == 3))
        {
            continue;
        }
        Checksum = ((Checksum&1) ? 0x8000 : 0) + (Checksum>>1) +  (UInt16)Entries[Index];
    }
    return Checksum;
}

6.3.4 GeneralPrimaryFlags 字段

GeneralPrimaryFlags 字段包含旗標(請參閱 表 17

衍生自此範本的重要主要目錄項目結構可能會重新定義此欄位。

表 17 一般一般PrimaryFlags 字段結構

功能變數名稱

位移

(位)

大小

(位)

批注
可能的配置 0 1 此欄位為必要欄位,第 6.3.4.1 節 定義其內容。
NoFatChain 1 1 此欄位為必要欄位,第 6.3.4.2 節 定義其內容。
CustomDefined 2 14 此欄位是必要欄位,而且衍生自此範本的結構可能會定義此欄位。
6.3.4.1 可能的配置欄位

[可能配置] 欄位應該描述指定的目錄專案是否可以在叢集堆積中配置。

此欄位的有效值為:

  • 0,這表示不可能建立叢集的相關配置,而且 FirstCluster 和 DataLength 字段實際上未定義(衍生自此範本的結構可能會重新定義這些欄位)

  • 1,這表示叢集的關聯配置是可能的,且 FirstCluster 和 DataLength 字段的定義如下

6.3.4.2 NoFatChain 字段

NoFatChain 字段應該指出作用中的 FAT 是否描述指定的配置叢集鏈結。

此欄位的有效值為:

  • 0,這表示配置叢集鏈結的對應 FAT 專案有效,而實作應加以解譯:如果 [可能配置] 欄位包含值 0,或者如果 [可能配置] 欄位包含值 1,且 FirstCluster 字段包含值 0,則此字段的唯一有效值為 0

  • 1,這表示相關聯的配置是一個連續的叢集系列:叢集的對應 FAT 項目無效,實作不得解譯它們:實作可能會使用下列方程式來計算相關聯配置的大小:DataLength / (2SectorsPerClusterShift* 2BytesPerSectorShift) 四捨五入為最接近的整數

如果衍生自此範本的重要主要目錄項目結構會重新定義 GeneralPrimaryFlags 字段,則任何相關聯配置叢集鏈結的對應 FAT 專案都是有效的。

6.3.5 FirstCluster 欄位

FirstCluster 字段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.2 節)。

如果 NoFatChain 位為 1,則 FirstCluster 必須指向叢集堆積中的有效叢集。

衍生自此範本的重要主要目錄項目結構可能會重新定義 FirstCluster 和 DataLength 字段。 衍生自此範本的其他結構,只有在 [可能配置] 字段包含值 0 時,才能重新定義 FirstCluster 和 DataLength 字段。

6.3.6 DataLength 字段

DataLength 字段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.3 節)。

如果 NoFatChain 位為 1,DataLength 不得為零。 如果 FirstCluster 字段為零,則 DataLength 也必須是零。

衍生自此範本的重要主要目錄項目結構可能會重新定義 FirstCluster 和 DataLength 字段。 衍生自此範本的其他結構,只有在 [可能配置] 字段包含值 0 時,才能重新定義 FirstCluster 和 DataLength 字段。

6.4 一般次要目錄Entry 範本

次要目錄專案的集中目的是提供目錄專案集的其他資訊。 解譯泛型次要目錄Entry 範本的能力是必要的。

重大和良性次要目錄項目的定義與次要exFAT修訂編號相互關聯。 支援此規格或後續規格的任何重要或良性次要目錄專案,定義是選擇性的。

所有次要目錄項目結構都衍生自泛型次要 DirectoryEntry 範本(請參閱 表 18),其衍生自 Generic DirectoryEntry 範本(請參閱 第 6.2 節)。

表 18 一般次要目錄Entry 範本

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
EntryType 0 1 此欄位為必要欄位,而 Section Section 6.4.1 會定義其內容。
GeneralSecondaryFlags 1 1 此欄位為必要欄位,第 6.4.2 節 定義其內容。
CustomDefined 2 18 此欄位是必要欄位,且衍生自此範本的結構會定義其內容。
FirstCluster 20 4 此欄位為必要欄位,區段 6.4.3 定義其內容。
DataLength 24 8 此欄位為必要欄位,第 6.4.4 節 定義其內容。

6.4.1 EntryType 欄位

EntryType 字段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.1 節

6.4.1.1 TypeCode 字段

TypeCode 字段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.1.1 節)。

6.4.1.2 TypeImportance 字段

TypeImportance 位元段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.1.2 節)。

6.4.1.2.1 重要次要目錄專案

重要的次要目錄專案包含資訊,對於其包含目錄專案集的適當管理至關重要。 雖然支援任何特定的關鍵次要目錄專案是選擇性的,但無法辨識的重要目錄專案會將整個目錄專案集轉譯為無法辨識(超出適用目錄專案範本的定義)。

不過,如果目錄專案集包含至少一個實作無法辨識的重要次要目錄專案,則實作最多應該解譯目錄專案集中目錄專案的範本,而不是與目錄專案集中任何目錄專案相關聯的數據包含 (檔案目錄專案是例外狀況, 請參閱 第 7.4 節)。

6.4.1.2.2 良性次要目錄專案

良性次要目錄專案包含其他資訊,可能有助於管理其包含的目錄專案集。 支援任何特定的良性次要目錄項目是選擇性的。 無法辨識的良性次要目錄專案不會將整個目錄項目設定為無法辨識。

實作可能會忽略它無法辨識的任何良性次要專案。

6.4.1.3 TypeCategory 字段

TypeCategory 字段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.1.3 節)。

在此範本中,此欄位的有效值為 1。

6.4.1.4 inUse 欄位

InUse 位元應符合 Generic DirectoryEntry 樣本中提供的定義(請參閱 第 6.2.1.4 節)。

6.4.2 GeneralSecondaryFlags 字段

GeneralSecondaryFlags 欄位包含旗標(請參閱表 19 表 19 )。

表 19 泛型 GeneralSecondaryFlags 欄位結構

功能變數名稱

位移

(位)

大小

(位)

批注
可能的配置 0 1 此欄位為必要欄位,第 6.4.2.1 節 定義其內容。
NoFatChain 1 1 此欄位為必要欄位,第 6.4.2.2 節 定義其內容。
CustomDefined 2 6 此欄位是必要欄位,而且衍生自此範本的結構可能會定義此欄位。
6.4.2.1 可能的配置欄位

[可能配置] 字段應具有與泛型主要目錄Entry 範本中同名字段的定義(請參閱 第 6.3.4.1 節)。

6.4.2.2 NoFatChain 字段

NoFatChain 字段應具有與泛型主要目錄Entry 範本中同名字段的定義(請參閱 第 6.3.4.2 節)。

6.4.3 FirstCluster 欄位

FirstCluster 字段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.2 節)。

如果 NoFatChain 位為 1,則 FirstCluster 必須指向叢集堆積中的有效叢集。

6.4.4 DataLength 欄位

DataLength 字段應符合 Generic DirectoryEntry 範本中提供的定義(請參閱 第 6.2.3 節)。

如果 NoFatChain 位為 1,DataLength 不得為零。 如果 FirstCluster 字段為零,則 DataLength 也必須是零。

7 目錄項目定義

exFAT 檔案系統的 1.00 版會定義下列目錄專案:

7.1 設定位圖目錄專案

在 exFAT 檔案系統中,FAT 不會描述叢集的配置狀態;而是配置位圖。 配置位圖存在於叢集堆積中(請參閱 第 7.1.5 節),並在根目錄中有對應的主要目錄專案(請參閱 表 20)。

NumberOfFats 字段會決定根目錄中有效配置位圖目錄項目的數目。 如果 NumberOfFats 字段包含值 1,則配置位圖目錄專案的唯一有效數目是 1。 此外,一個配置位圖目錄專案只有在描述第一個配置位圖時才有效(請參閱 第 7.1.2.1 節)。 如果 NumberOfFats 字段包含值 2,則配置位圖目錄專案的唯一有效數目是 2。 此外,只有一個描述第一個配置位圖,而另一個則描述第二個配置位圖時,兩個配置位圖目錄專案才有效。

表 20 設定位圖目錄Entry 結構

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
EntryType 0 1 此欄位為必要欄位,第 7.1.1 節 定義其內容。
BitmapFlags 1 1 此欄位為必要欄位,第 7.1.2 節 定義其內容。
保留 2 18 此欄位為必要欄位,並保留其內容。
FirstCluster 20 4 此欄位為必要欄位,第 7.1.3 節 定義其內容。
DataLength 24 8 此欄位為必要欄位,第 7.1.4 節 定義其內容。

7.1.1 EntryType 欄位

EntryType 字段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.1 節)。

7.1.1.1 TypeCode 字段

TypeCode 字段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.1.1 節)。

對於 [配置位圖] 目錄專案,此欄位元的有效值為 1。

7.1.1.2 TypeImportance 字段

TypeImportance 位元段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.1.2 節)。

針對 [配置位圖目錄] 專案,此欄位元的有效值為 0。

7.1.1.3 TypeCategory 字段

TypeCategory 字段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.1.3 節)。

7.1.1.4 InUse 欄位

InUse 欄位應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.1.4 節)。

7.1.2 BitmapFlags 字段

BitmapFlags 字段包含旗標(請參閱表格 21 )。

表 21 BitmapFlags 字段結構

功能變數名稱

位移

(位)

大小

(位)

批注
BitmapIdentifier 0 1 此欄位為必要欄位,第 7.1.2.1 節 定義其內容。
保留 1 7 此欄位為必要欄位,並保留其內容。
7.1.2.1 BitmapIdentifier 字段

BitmapIdentifier 字段應該指出指定目錄專案所描述的配置位圖。 實作應搭配第一個 FAT 使用第一個配置位圖,並使用第二個配置位圖搭配第二個 FAT。 ActiveFat 字段描述哪些 FAT 和配置位圖為使用中。

此欄位的有效值為:

  • 0,這表示指定的目錄專案描述第一個配置位圖

  • 1,這表示指定的目錄專案描述第二個配置位圖,而且只有在 NumberOfFats 包含值 2 時才可能

7.1.3 FirstCluster 欄位

FirstCluster 字段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.5 節)。

此欄位包含叢集鏈結第一個叢集的索引,如 FAT 所描述,其裝載配置位陣圖。

7.1.4 DataLength 字段

DataCluster 字段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.6 節)。

7.1.5 配置位圖

配置位圖會記錄叢集堆積中的叢集配置狀態。 配置位圖中的每個位都會指出其對應的叢集是否可供配置。

配置位圖代表從最低到最高索引的叢集(請參閱 表 22)。 基於歷史原因,第一個叢集具有索引 2。 注意:位圖中的第一個位是第一個字節的最低順序位。

表 22 配置位圖結構

功能變數名稱

位移

(位)

大小

(位)

批注
BitmapEntry[2] 0 1 此欄位為必要欄位,而 Section Section 7.1.5.1 會定義其內容。

.

.

.

.

.

.

.

.

.

.

.

.

BitmapEntry[ClusterCount+1] ClusterCount - 1 1

此欄位為必要欄位,第 7.1.5.1 節 定義其內容。

注意:主要和備份開機扇區都包含 [ClusterCount] 字段。

保留 ClusterCount (DataLength * 8) – ClusterCount

此欄位是必要欄位,如果有任何內容,則會保留其內容。

注意:主要和備份開機扇區都包含 [ClusterCount] 字段。

7.1.5.1 BitmapEntry[2] ...BitmapEntry[ClusterCount+1] 字段

此陣列中的每個 BitmapEntry 欄位都代表叢集堆積中的叢集。 BitmapEntry[2] 代表叢集堆積中的第一個叢集,而 BitmapEntry[ClusterCount+1] 代表叢集堆積中的最後一個叢集。

這些欄位的有效值為:

  • 0,其中將對應的叢集描述為可供配置

  • 1,其中將對應的叢集描述為無法配置(叢集配置可能已經取用對應的叢集,或作用中的 FAT 可能會將對應的叢集描述為不正確的)

7.2 案例數據表目錄專案

Up-case Table 會定義從小寫到大寫字元的轉換。 這很重要,因為使用 Unicode 字元的檔名目錄專案(請參閱第 7.7 節),而且 exFAT 檔案系統不區分大小寫且保留大小寫。 Up-case Table 存在於叢集堆積中(請參閱 第 7.2.5 節),並在根目錄中有對應的重要主要目錄專案(請參閱 表 23)。 Up-case Table 目錄專案的有效數目為 1。

由於 Up-case Table 與檔名之間的關聯性,實作不應修改 Up-case Table,但格式作業的結果除外。

數據表 23 Up-case Table DirectoryEntry 結構

功能變數名稱

位移

(位元組)

大小

(位元組)

批注
EntryType 0 1 此欄位為必要欄位,第 7.2.1 節 定義其內容。
Reserved1 1 3 此欄位為必要欄位,並保留其內容。
TableChecksum 4 4 此欄位為必要欄位,第 7.2.2 節 定義其內容。
Reserved2 8 12 此欄位為必要欄位,並保留其內容。
FirstCluster 20 4 此欄位為必要欄位,第 7.2.3 節 定義其內容。
DataLength 24 8 此欄位為必要欄位,第 7.2.4 節 定義其內容。

7.2.1 EntryType 欄位

EntryType 字段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.1 節)。

7.2.1.1 TypeCode 字段

TypeCode 字段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.1.1 節)。

對於 Up-case Table 目錄專案,此字段的有效值為 2。

7.2.1.2 TypeImportance 字段

TypeImportance 位元段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.1.2 節)。

對於 Up-case Table 目錄專案,此字段的有效值為 0。

7.2.1.3 TypeCategory 字段

TypeCategory 字段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.1.3 節)。

7.2.1.4 InUse 欄位

InUse 欄位應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.1.4 節)。

7.2.2 TableChecksum 欄位

TableChecksum 字段包含 Up-case Table 的總和檢查碼(FirstCluster 和 DataLength 字段會描述此檢查碼)。 實作在使用 Up-case Table 之前,應該先確認此字段的內容是否有效。

圖 3 TableChecksum 計算

UInt32 TableChecksum
(
    UCHAR  * Table,    // points to an in-memory copy of the up-case table
    UInt64   DataLength
)
{
    UInt32 Checksum = 0;
    UInt64 Index;

    for (Index = 0; Index < DataLength; Index++)
    {
        Checksum = ((Checksum&1) ? 0x80000000 : 0) + (Checksum>>1) + (UInt32)Table[Index];
    }

    return Checksum;
}

7.2.3 FirstCluster 欄位

FirstCluster 字段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.5 節)。

此欄位包含叢集鏈結第一個叢集的索引,如 FAT 所描述,其裝載 Up-case Table。

7.2.4 DataLength 欄位

DataCluster 字段應符合泛型主要目錄Entry 範本中提供的定義(請參閱 第 6.3.6 節)。

7.2.5 Up-case 數據表

向上寫數據表是一系列的 Unicode 字元對應。 字元對應包含 2 位元組欄位,而上寫數據表中的欄位索引代表要向上大小寫的 Unicode 字元,以及代表上寫 Unicode 字元的 2 位元組位元段。

前 128 個 Unicode 字元具有強制對應(請參閱表 24 )。 前 128 個 Unicode 字元的任何其他字元對應表無效。

只支持強制對應範圍中字元的實作可能會忽略其餘向上大小寫數據表的對應。 這類實作只有在建立或重新命名檔案時,才應使用強制對應範圍的字元(透過檔名目錄專案,請參閱 第 7.7 節)。 將現有檔名向上套用時,這類實作不得從非強制對應範圍向上寫字元,但應讓它們維持在產生的大小寫檔名中(這是部分向上大小寫)。 比較檔名時,這類實作應將與比較中名稱不同的檔名,只將非強制對應範圍的 Unicode 字元視為相等的檔名。 雖然這類檔名可能只是相等的,但這類實作無法確保完整大小寫的檔名不會與比較下的名稱相衝突。

表 24 強制前 128 個案例數據表專案

數據表索引 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7
0000h 0000h 0001h 0002h 0003h 0004h 0005h 0006h 0007h
0008h 0008h 0009h 000Ah 000Bh 000Ch 000Dh 000Eh 000Fh
0010h 0010h 0011h 0012h 0013h 0014h 0015h 0016h 0017h
0018h 0018h 0019h 001Ah 001Bh 001Ch 001Dh 001Eh 001Fh
0020h 0020h 0021h 0022h 0023h 0024h 0025h 0026h 0027h
0028h 0028h 0029h 002Ah 002Bh 002Ch 002Dh 002Eh 002Fh
0030h 0030h 0031h 0032h 0033h 0034h 0035h 0036h 0037h
0038h 0038h 0039h 003Ah 003Bh 003Ch 003Dh 003Eh 003Fh
0040h 0040h 0041h 0042h 0043h 0044h 0045h 0046h 0047h
0048h 0048h 0049h 004Ah 004Bh 004Ch 004Dh 004Eh 004Fh
0050h 0050h 0051h 0052h 0053h 0054h 0055h 0056h 0057h
0058h 0058h 0059h 005Ah 005Bh 005Ch 005Dh 005Eh 005Fh
0060h 0060h 0041h 0042h 0043h 0044h 0045h 0046h 0047h
0068h 0048h 0049h 004Ah 004Bh 004Ch 004Dh 004Eh 004Fh
0070h 0050h 0051h 0052h 0053h 0054h 0055h 0056h 0057h
0078h 0058h 0059h 005Ah 007Bh 007Ch 007Dh 007Eh 007Fh

(注意:具有非身分識別向上案例對應的專案為粗體)

在格式化磁碟區時,實作可能會使用身分識別對應壓縮來產生壓縮格式的上寫數據表,因為大部分的 Unicode 字元空間沒有大小寫的概念(這表示「小寫」和「大寫」字元相等)。 實作會藉由以 FFFFh 值代表一系列識別對應,後面接著識別對應數目,以壓縮向上案例數據表。

例如,實作可能會代表前 100 個 (64h) 字元對應,其中包含下列八個專案的壓縮大小寫數據表:

FFFFh, 0061h, 0041h, 0042h, 0043h

前兩個專案表示前 97 個字元(從 0000h 到 0060h)具有識別對應。 後續字元 0061h 到 0063h,分別對應至字元 0041h 到 0043h。

格式化磁碟區時提供壓縮大小寫數據表的能力是選擇性的。 不過,必須解譯未壓縮和壓縮的案例數據表。 TableChecksum 字段的值一律符合磁碟區上存在的情況,該磁碟區可能採用壓縮或未壓縮的格式。

格式化磁碟區時,實作應該以壓縮格式記錄建議的案例數據表(請參閱 表 25),其中 TableChecksum 欄位的值是 E619D30Dh。

如果實作定義自己的大小寫數據表,無論是壓縮還是未壓縮,則該數據表應涵蓋完整的 Unicode 字元範圍(從字元碼 0000h 到 FFFFh 包含)。