Bagikan melalui


Spesifikasi sistem file exFAT

1 Pengantar

Sistem file exFAT adalah penerus FAT32 dalam keluarga FAT sistem file. Spesifikasi ini menjelaskan sistem file exFAT dan menyediakan semua informasi yang diperlukan untuk menerapkan sistem file exFAT.

1.1 Tujuan Desain

Sistem file exFAT memiliki tiga tujuan desain pusat (lihat daftar di bawah).

  1. Pertahankan kesederhanaan sistem file berbasis FAT.

    Dua kekuatan sistem file berbasis FAT adalah kesederhanaan relatif mereka dan kemudahan implementasi. Dalam semangat pendahulunya, pelaksana harus menemukan exFAT relatif sederhana dan mudah diimplementasikan.

  2. Aktifkan file dan perangkat penyimpanan yang sangat besar.

    Sistem file exFAT menggunakan 64 bit untuk menjelaskan ukuran file, sehingga memungkinkan aplikasi yang bergantung pada file yang sangat besar. Sistem file exFAT juga memungkinkan kluster sebesar 32MB, secara efektif memungkinkan perangkat penyimpanan yang sangat besar.

  3. Menggabungkan ekstensibilitas untuk inovasi di masa depan.

    Sistem file exFAT menggabungkan ekstensibilitas ke dalam desainnya, memungkinkan sistem file untuk mengimbangi inovasi dalam penyimpanan dan perubahan penggunaan.

1.2 Terminologi Spesifik

Dalam konteks spesifikasi ini, istilah tertentu (lihat Tabel 1) membawa arti khusus untuk desain dan implementasi sistem file exFAT.

Tabel 1 Definisi Istilah yang Membawa Arti Yang Sangat Spesifik

Istilah Definisi
Harus Spesifikasi ini menggunakan istilah "harus" untuk menggambarkan perilaku yang wajib.
Sebaiknya Spesifikasi ini menggunakan istilah "harus" untuk menggambarkan perilaku yang sangat direkomendasikannya, tetapi tidak membuat wajib.
Mei Spesifikasi ini menggunakan istilah "mungkin" untuk menjelaskan perilaku yang bersifat opsional.
Wajib Istilah ini menjelaskan bidang atau struktur yang harus dimodifikasi implementasi dan harus ditafsirkan seperti yang dijelaskan spesifikasi ini.
Fakultatif Istilah ini menjelaskan bidang atau struktur yang mungkin atau tidak didukung implementasi. Jika implementasi mendukung bidang atau struktur opsional tertentu, itu akan memodifikasi dan harus menginterpretasikan bidang atau struktur seperti yang dijelaskan spesifikasi ini.
Tidak terdefinisi Istilah ini menjelaskan isi bidang atau struktur yang implementasinya dapat memodifikasi seperlunya (yaitu jelas hingga nol saat mengatur bidang atau struktur di sekitarnya) dan tidak boleh menafsirkan untuk menyimpan arti tertentu.
Sudah Dipesan

Istilah ini menjelaskan isi bidang atau struktur yang implementasinya:

  1. Harus menginisialisasi ke nol dan tidak boleh digunakan untuk tujuan apa pun

  2. Tidak boleh menafsirkan, kecuali saat menghitung checksum

  3. Harus mempertahankan seluruh operasi yang memodifikasi bidang atau struktur di sekitarnya

1.3 Teks Lengkap Akronim Umum

Spesifikasi ini menggunakan akronim yang umum digunakan dalam industri komputer pribadi (lihat Tabel 2).

Tabel 2 Teks Lengkap Akronim Umum

Singkatan Teks Lengkap
ASCII Kode Standar Amerika untuk Pertukaran Informasi
BIOS Sistem Input Output Dasar
CPU Unit Pemrosesan Pusat
exFAT Tabel Alokasi File yang dapat diperluas
GEMUK Tabel Alokasi File
FAT12 Tabel Alokasi File, indeks kluster 12-bit
FAT16 Tabel Alokasi File, indeks kluster berukuran 16-bit
FAT32 Tabel Alokasi File, kluster dengan indeks 32-bit
GPT Tabel Partisi GUID
GUID Pengidentifikasi Unik Global (lihat Bagian 10.1)
INT Menyela
MBR Catatan Boot Master
texFAT ExFAT aman transaksi
UTC Coordinated Universal Time

1.4 Kualifikasi Bidang dan Struktur Bawaan

Bidang dan struktur dalam spesifikasi ini memiliki kualifikasi berikut (lihat daftar di bawah), kecuali jika catatan spesifikasi sebaliknya.

  1. Belum ditandatangani

  2. Gunakan notasi desimal untuk menjelaskan nilai, kecuali dinyatakan lain; spesifikasi ini menggunakan huruf 'h' di belakang untuk menunjukkan angka heksadesimal dan memasukkan GUID dalam kurung kurawal.

  3. Dalam format little-endian

  4. Tidak memerlukan karakter penutup null untuk string

1.5 Windows CE dan TexFAT

TexFAT adalah ekstensi untuk exFAT yang menambahkan semantik operasional aman transaksi di atas sistem file dasar. TexFAT digunakan oleh Windows CE. TexFAT memerlukan penggunaan dua buah FAT dan bitmap alokasi untuk digunakan dalam transaksi. Ini juga mendefinisikan beberapa struktur tambahan termasuk deskriptor padding dan deskriptor keamanan.

2 Struktur Volume

Volume adalah kumpulan semua struktur sistem file dan ruang data yang diperlukan untuk menyimpan dan mengambil data pengguna. Semua volume exFAT berisi empat wilayah (lihat Tabel 3).

Tabel 3 Struktur Volume

Nama Sub-wilayah

Offset

(sektor)

Ukuran

(sektor)

Komentar
Area Boot Utama
Sektor Boot Utama 0 1 Sub-wilayah ini wajib dan Bagian 3.1 mendefinisikan kontennya.
Sektor Boot Utama yang Diperluas 1 8 Sub-wilayah ini wajib dan Bagian 3.2) mendefinisikan kontennya.
Parameter OEM Utama 9 1 Sub-wilayah ini wajib dan Bagian 3.3 mendefinisikan kontennya.
Cadangan Utama 10 1 Sub-wilayah ini wajib dan isinya dikhususkan.
Checksum Boot Utama 11 1 Sub-wilayah ini wajib dan Bagian 3.4 mendefinisikan kontennya.
Wilayah Boot Cadangan
Sektor Boot Cadangan 12 1 Sub-wilayah ini wajib dan Bagian 3.1 mendefinisikan kontennya.
Mencadangkan Sektor Boot yang Diperluas 13 8 Sub-wilayah ini wajib dan Bagian 3.2 mendefinisikan kontennya.
Mencadangkan Parameter OEM 21 1 Sub-wilayah ini wajib dan Bagian 3.3 mendefinisikan kontennya.
Cadangan yang Direservasi 22 1 Sub-wilayah ini wajib dan isinya dikhususkan.
Backup Boot Checksum Dua puluh tiga 1 Sub-wilayah ini wajib dan Bagian 3.4 mendefinisikan kontennya.
Wilayah FAT
Perataan FAT 24 FatOffset – 24

Sub-wilayah ini wajib dan isinya, jika ada, tidak terdefinisi.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang FatOffset.

FAT Pertama FatOffset PanjangLemak

Sub-wilayah ini wajib dan Bagian 4.1 mendefinisikan kontennya.

Catatan: Sektor Boot Utama dan Cadangan berisi bidang FatOffset dan FatLength.

FAT Kedua FatOffset + FatLength FatLength * (NumberOfFats – 1)

Sub-wilayah ini wajib dan Bagian 4.1 mendefinisikan kontennya, jika ada.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang FatOffset, FatLength, dan NumberOfFats. Bidang NumberOfFats hanya boleh menyimpan nilai 1 dan 2.

Wilayah Data
Perataan Timbunan Kluster FatOffset + FatLength * NumberOfFats ClusterHeapOffset – (FatOffset + FatLength * NumberOfFats)

Sub-wilayah ini wajib dan isinya, jika ada, tidak terdefinisi.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang FatOffset, FatLength, NumberOfFats, dan ClusterHeapOffset. Nilai bidang NumberOfFats yang valid adalah 1 dan 2.

Timbunan Kluster ClusterHeapOffset ClusterCount * 2SectorsPerClusterShift

Sub-wilayah ini wajib dan Bagian 5.1 mendefinisikan kontennya.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang ClusterHeapOffset, ClusterCount, dan SectorsPerClusterShift.

Ruang Berlebih ClusterHeapOffset + ClusterCount * 2SektorPerClusterShift VolumeLength – (ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift)

Sub-wilayah ini wajib dan isinya, jika ada, tidak terdefinisi.

Catatan: Sektor Boot Utama dan Cadangan berisi bidang ClusterHeapOffset, ClusterCount, SectorsPerClusterShift, dan VolumeLength.

3 Wilayah Boot Utama dan Cadangan

Wilayah Boot Utama menyediakan semua instruksi boot-strapping yang diperlukan, mengidentifikasi informasi, dan parameter sistem file untuk memungkinkan implementasi melakukan hal berikut:

  1. Memulai sistem komputer dari volume exFAT.
  2. Identifikasi sistem file pada volume sebagai exFAT.
  3. Temukan lokasi struktur sistem file exFAT.

Wilayah Boot Cadangan adalah cadangan wilayah Boot Utama. Ini membantu pemulihan volume exFAT jika wilayah Boot Utama berada dalam keadaan tidak konsisten. Kecuali dalam keadaan yang jarang terjadi, seperti memperbarui instruksi boot-strapping, implementasi tidak boleh memodifikasi konten wilayah Boot Cadangan.

3.1 Sub-wilayah Sektor Boot Utama dan Cadangan

Sektor Boot Utama berisi kode untuk boot-strapping dari volume exFAT dan parameter exFAT mendasar yang menjelaskan struktur volume (lihat Tabel 4). BIOS, MBR, atau agen boot-strapping lainnya dapat memeriksa sektor ini dan dapat memuat dan menjalankan instruksi boot-strapping yang terkandung di dalamnya.

Sektor Boot Cadangan adalah cadangan Dari Sektor Boot Utama dan memiliki struktur yang sama (lihat Tabel 4). Sektor Boot Cadangan dapat membantu operasi pemulihan; namun, implementasi harus memperlakukan konten bidang VolumeFlags dan PercentInUse sebagai usang.

Sebelum menggunakan konten Sektor Boot Utama atau Cadangan, implementasi harus memverifikasi kontennya dengan memvalidasi Boot Checksum masing-masing dan memastikan semua bidangnya berada dalam rentang nilai yang valid.

Meskipun operasi format awal akan menginisialisasi konten Sektor Boot Utama dan Cadangan, implementasi dapat memperbarui sektor-sektor ini (dan juga harus memperbarui Boot Checksum masing-masing) sesuai kebutuhan. Namun, implementasi dapat memperbarui bidang VolumeFlags atau PercentInUse tanpa memperbarui Boot Checksum masing-masing (checksum secara khusus mengecualikan kedua bidang ini).

Tabel 4 Struktur Sektor Boot Utama dan Cadangan

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
JumpBoot 0 3 Bidang ini wajib dan Bagian 3.1.1 mendefinisikan kontennya.
FileSystemName 3 8 Bidang ini wajib dan Bagian 3.1.2 mendefinisikan kontennya.
MustBeZero 11 53 Bidang ini wajib dan Bagian 3.1.3 mendefinisikan kontennya.
Offset Partisi 64 8 Bidang ini wajib dan Bagian 3.1.4 mendefinisikan kontennya.
Panjang Volume 72 8 Bidang ini wajib dan Bagian 3.1.5 mendefinisikan kontennya.
FatOffset 80 4 Bidang ini wajib dan Bagian 3.1.6 mendefinisikan kontennya.
PanjangLemak 84 4 Bidang ini wajib dan Bagian 3.1.7 mendefinisikan kontennya.
ClusterHeapOffset 88 4 Bidang ini wajib dan Bagian 3.1.8 mendefinisikan kontennya.
Jumlah Klaster 92 4 Bidang ini wajib dan Bagian 3.1.9 mendefinisikan kontennya.
FirstClusterOfRootDirectory 96 4 Bidang ini wajib dan Bagian 3.1.10 mendefinisikan kontennya.
VolumeSerialNumber 100 4 Bidang ini wajib dan Bagian 3.1.11 mendefinisikan kontennya.
FileSystemRevision 104 2 Bidang ini wajib dan Bagian 3.1.12 mendefinisikan kontennya.
VolumeFlags 106 2 Bidang ini wajib dan Bagian 3.1.13 mendefinisikan kontennya.
BytesPerSectorShift 108 1 Bidang ini wajib dan Bagian 3.1.14 mendefinisikan kontennya.
SectorsPerClusterShift 109 1 Bidang ini wajib dan Bagian 3.1.15 mendefinisikan kontennya.
NumberOfFats 110 1 Bidang ini wajib dan Bagian 3.1.16 mendefinisikan kontennya.
DrivePilih 111 1 Bidang ini wajib dan Bagian 3.1.17 mendefinisikan kontennya.
PersentasePenggunaan 112 1 Bidang ini wajib dan Bagian 3.1.18 mendefinisikan kontennya.
Sudah Dipesan 113 7 Bidang ini wajib dan isinya dibatasi.
BootCode 120 390 Bidang ini wajib dan Bagian 3.1.19 mendefinisikan kontennya.
BootSignature 510 2 Bidang ini wajib dan Bagian 3.1.20 mendefinisikan kontennya.
ExcessSpace 512 2BytesPerSectorShift – 512

Bidang ini wajib dan isinya, jika ada, tidak terdefinisi.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang BytesPerSectorShift.

3.1.1 Bidang JumpBoot

Bidang JumpBoot harus berisi instruksi lompat untuk CPU yang umum di komputer pribadi, yang, ketika dieksekusi, "melompat" CPU untuk menjalankan instruksi boot-strapping di bidang BootCode.

Nilai yang valid untuk bidang ini adalah (dalam urutan byte dari yang terendah ke yang tertinggi) EBh 76h 90h.

3.1.2 Bidang FileSystemName

Bidang FileSystemName harus berisi nama sistem file pada volume.

Nilai yang valid untuk bidang ini adalah, dalam karakter ASCII, "EXFAT ", yang mencakup tiga spasi putih berikutnya.

3.1.3 Bidang MustBeZero

Bidang MustBeZero wajib langsung sesuai dengan rentang byte blok parameter BIOS yang terkompresi yang digunakan pada volume FAT12/16/32.

Nilai yang valid untuk bidang ini adalah 0, yang membantu mencegah implementasi FAT12/16/32 salah memasang volume exFAT.

3.1.4 Bidang PartitionOffset

Bidang PartitionOffset harus menjelaskan offset sektor relatif media dari partisi yang menghosting volume exFAT yang diberikan. Bidang ini membantu proses memulai dari volume menggunakan INT 13h yang diperluas di komputer pribadi.

Semua nilai yang mungkin untuk bidang ini valid; namun, nilai 0 menunjukkan implementasi harus mengabaikan bidang ini.

3.1.5 Bidang PanjangVolume

Bidang VolumeLength harus menjelaskan ukuran volume exFAT yang diberikan dalam sektor.

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya2 20/ 2BytesPerSectorShift, yang memastikan volume terkecil tidak kurang dari 1MB

  • Paling banyak 264- 1, nilai terbesar yang dapat dijelaskan bidang ini.

    Namun, jika ukuran sub-wilayah Ruang Kelebihan adalah 0, maka nilai terbesar dari bidang ini adalah ClusterHeapOffset + (232- 11) *2SectorsPerClusterShift.

3.1.6 Bidang FatOffset

Bidang FatOffset harus menjelaskan offset sektor relatif terhadap volume dari FAT pertama. Bidang ini memungkinkan implementasi untuk menyelaraskan FAT Pertama dengan karakteristik media penyimpanan yang mendasar.

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya 24, yang merupakan sektor yang digunakan oleh wilayah Boot Utama dan Boot Cadangan
  • Paling banyak ClusterHeapOffset - (FatLength * NumberOfFats), yang menghitung sektor yang dikonsumsi oleh Cluster Heap

3.1.7 Bidang PanjangLemak

Bidang FatLength harus menggambarkan panjang, dalam sektor, dari setiap tabel FAT (volume mungkin berisi hingga dua FAT).

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya (ClusterCount + 2) * 22 / 2BytesPerSectorShift dibulatkan ke bilangan bulat terdekat, yang memastikan setiap FAT memiliki ruang yang cukup untuk menjelaskan semua kluster di dalam Tumpukan Kluster
  • Paling banyak (ClusterHeapOffset - FatOffset) / NumberOfFats dibulatkan ke bilangan bulat terdekat, yang memastikan FATs ada sebelum Tumpukan Kluster

Bidang ini mungkin berisi nilai melebihi batas bawahnya (seperti yang dijelaskan di atas) untuk mengaktifkan FAT Kedua jika ada, agar juga diselaraskan dengan karakteristik media penyimpanan dasar. Isi ruang yang melebihi apa yang dibutuhkan FAT itu sendiri, jika ada, tidak terdefinisi.

3.1.8 Bidang ClusterHeapOffset

Bidang ClusterHeapOffset harus menjelaskan offset sektor relatif volume dari Tumpukan Kluster. Bidang ini memungkinkan implementasi untuk menyelaraskan Tumpukan Kluster dengan karakteristik media penyimpanan yang mendasar.

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya FatOffset + FatLength * NumberOfFats, untuk memperhitungkan sektor yang dikonsumsi semua wilayah sebelumnya
  • Paling banyak 232- 1 atau VolumeLength - (ClusterCount * 2SectorsPerClusterShift), mana pun hasil perhitungan yang lebih kecil

Bidang JumlahKluster

Bidang ClusterCount harus menjelaskan jumlah kluster yang dikandung Oleh Cluster Heap.

Nilai yang valid untuk bidang ini akan menjadi lebih rendah dari yang berikut:

  • (VolumeLength - ClusterHeapOffset) / 2SectorsPerClusterShift dibulatkan ke bawah ke bilangan bulat terdekat, yang merupakan jumlah kluster yang dapat muat antara awal Cluster Heap dan akhir volume
  • 232- 11, yang merupakan jumlah maksimum kluster yang dapat dijelaskan FAT

Nilai bidang ClusterCount menentukan ukuran minimum FAT. Untuk menghindari FAT yang sangat besar, implementasi dapat mengontrol jumlah kluster dalam Tumpukan Kluster dengan meningkatkan ukuran kluster (melalui bidang SectorsPerClusterShift). Spesifikasi ini merekomendasikan tidak lebih dari 224-2 kluster di Cluster Heap. Namun, implementasi harus dapat menangani volume dengan hingga 2^32 - 11 kluster dalam Cluster Heap.

Bidang FirstClusterOfRootDirectory

Bidang FirstClusterOfRootDirectory harus berisi indeks kluster pertama dari direktori induk. Implementasi harus melakukan setiap upaya untuk menempatkan kluster pertama direktori akar di kluster pertama yang tidak buruk setelah kluster Bitmap Alokasi dan Tabel Kasus Naik digunakan.

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya 2, indeks kluster pertama di Timbunan Kluster
  • Paling banyak ClusterCount + 1, indeks kluster terakhir di Cluster Heap

3.1.11 Bidang VolumeSerialNumber

Bidang VolumeSerialNumber harus berisi nomor seri yang unik. Ini membantu implementasi untuk membedakan antara volume exFAT yang berbeda. Implementasi harus menghasilkan nomor seri dengan menggabungkan tanggal dan waktu pemformatan volume exFAT. Mekanisme untuk menggabungkan tanggal dan waktu untuk membentuk nomor seri bersifat spesifik implementasi.

Semua nilai yang mungkin untuk bidang ini valid.

3.1.12 Bidang Revisi Sistem Berkas

Bidang FileSystemRevision harus menjelaskan jumlah revisi utama dan kecil dari struktur exFAT pada volume yang diberikan.

Byte urutan tinggi adalah nomor revisi utama dan byte urutan rendah adalah angka revisi kecil. Misalnya, jika byte urutan tinggi berisi nilai 01h dan jika byte urutan rendah berisi nilai 05h, maka bidang FileSystemRevision menjelaskan nomor revisi 1,05. Demikian juga, jika byte urutan tinggi berisi nilai 0Ah dan jika byte urutan rendah berisi nilai 0Fh, maka bidang FileSystemRevision menjelaskan nomor revisi 10.15.

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya 0 untuk byte urutan rendah dan 1 untuk byte urutan tinggi
  • Paling banyak 99 untuk byte urutan rendah dan 99 untuk byte urutan tinggi

Jumlah revisi exFAT yang dijelaskan spesifikasi ini adalah 1.00. Implementasi spesifikasi ini harus memasang volume exFAT apa pun dengan revisi utama nomor 1 dan tidak boleh memasang volume exFAT apa pun dengan nomor revisi utama lainnya. Implementasi harus menghormati nomor revisi kecil dan tidak boleh melakukan operasi atau membuat struktur sistem file apa pun yang tidak dijelaskan dalam spesifikasi terkait nomor revisi kecil yang diberikan.

3.1.13 Bidang VolumeFlags

Bidang VolumeFlags harus berisi bendera yang menunjukkan status berbagai struktur sistem file pada volume exFAT (lihat Tabel 5).

Implementasi tidak boleh menyertakan bidang ini saat menghitung checksum wilayah Boot Utama atau Boot Cadangan masing-masing. Ketika merujuk pada Sektor Boot Cadangan, implementasi harus memperlakukan bidang ini sebagai usang.

Tabel 5 Struktur Bidang VolumeFlags

Nama Bidang

Offset

(bit)

Ukuran

(bit)

Komentar
ActiveFat 0 1 Bidang ini wajib dan Bagian 3.1.13.1 mendefinisikan kontennya.
VolumeDirty 1 1 Bidang ini wajib dan Bagian 3.1.13.2 mendefinisikan kontennya.
Kegagalan Media 2 1 Bidang ini wajib dan Bagian 3.1.13.3 mendefinisikan kontennya.
ClearToZero 3 1 Bidang ini wajib dan Bagian 3.1.13.4 mendefinisikan kontennya.
Sudah Dipesan 4 12 Bidang ini wajib dan isinya dibatasi.
3.1.13.1 Bidang ActiveFat

Bidang ActiveFat harus menjelaskan FAT dan Bitmap Alokasi mana yang aktif (dan harus digunakan oleh implementasi), sebagai berikut:

  • 0, yang berarti FAT Pertama dan Bitmap Alokasi Pertama aktif
  • 1, yang berarti FAT Kedua dan Bitmap Alokasi Kedua aktif dan hanya dimungkinkan ketika bidang NumberOfFats berisi nilai 2.

Implementasi harus menganggap FAT dan Bitmap Alokasi yang tidak aktif sebagai kedaluwarsa. Hanya implementasi yang mendukung TexFAT yang akan mengalihkan FAT dan Bitmap Alokasi yang aktif (lihat Bagian 7.1).

3.1.13.2 Bidang VolumeDirty

Bidang VolumeDirty akan menjelaskan apakah volume kotor atau tidak, sebagai berikut:

  • 0, yang berarti volume mungkin dalam keadaan konsisten
  • 1, yang berarti volume mungkin dalam keadaan tidak konsisten

Implementasi harus menetapkan nilai bidang ini ke 1 ketika mereka menemukan inkonsistensi metadata sistem file yang tidak mereka dapat selesaikan. Jika, setelah memasang volume, nilai bidang ini adalah 1, hanya implementasi yang menyelesaikan inkonsistensi metadata sistem file yang dapat menghapus nilai bidang ini menjadi 0. Implementasi tersebut hanya akan menghapus nilai bidang ini menjadi 0 setelah memastikan sistem file dalam keadaan konsisten.

Jika, setelah memasang volume, nilai bidang ini adalah 0, implementasi harus mengatur bidang ini ke 1 sebelum memperbarui metadata sistem file dan menghapus bidang ini menjadi 0 setelahnya, mirip dengan urutan tulis yang direkomendasikan yang dijelaskan di Bagian 8.1.

3.1.13.3 Bidang Kegagalan Media

Bidang MediaFailure harus menjelaskan apakah implementasi telah menemukan kegagalan media atau tidak, sebagai berikut:

  • 0, yang berarti media hosting belum melaporkan kegagalan atau kegagalan yang diketahui sudah dicatat dalam FAT sebagai kluster "buruk"
  • 1, yang berarti media hosting telah melaporkan kegagalan (yaitu operasi baca atau tulis mengalami kegagalan)

Implementasi harus mengatur bidang ini ke 1 ketika:

  1. Media hosting gagal melakukan upaya akses ke wilayah mana pun dalam volume.
  2. Implementasi telah kehabisan algoritma percobaan ulang akses, jika ada

Jika, setelah memasang volume, nilai bidang ini adalah 1, implementasi yang memindai seluruh volume untuk kegagalan media dan merekam semua kegagalan sebagai kluster "buruk" dalam FAT (atau menyelesaikan kegagalan media) dapat menghapus nilai bidang ini menjadi 0.

3.1.13.4 Bidang ClearToZero

Bidang ClearToZero tidak memiliki arti signifikan dalam spesifikasi ini.

Nilai yang valid untuk bidang ini adalah:

  • 0, yang tidak memiliki arti tertentu
  • 1, yang berarti implementasi harus menghapus bidang ini ke 0 sebelum memodifikasi struktur, direktori, atau file sistem file apa pun

3.1.14 BytesPerSectorShift Field

Bidang BytesPerSectorShift harus menjelaskan byte per sektor yang dinyatakan sebagai log2(N), di mana N adalah jumlah byte per sektor. Misalnya, untuk 512 byte per sektor, nilai bidang ini adalah 9.

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya 9 (ukuran sektor 512 byte), yang merupakan sektor terkecil yang mungkin untuk volume exFAT
  • Paling banyak 12 (ukuran sektor 4096 byte), yang merupakan ukuran halaman memori CPU yang umum di komputer pribadi

3.1.15 Bidang SektorPerClusterShift

Bidang SectorsPerClusterShift harus menjelaskan sektor per kluster yang dinyatakan sebagai log2(N), di mana N adalah jumlah sektor per kluster. Misalnya, untuk 8 sektor per kluster, nilai bidang ini adalah 3.

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya 0 (1 sektor per kluster), yang merupakan kluster terkecil yang mungkin
  • Maksimum 25 - BytesPerSectorShift, yang dihitung menjadi ukuran kluster 32MB

3.1.16 Kolom Jumlah Lemak

Bidang NumberOfFats harus menjelaskan jumlah FAT dan peta bit alokasi yang ada dalam volume.

Rentang nilai yang valid untuk bidang ini adalah:

  • 1, menunjukkan bahwa volume hanya berisi FAT Pertama dan Bitmap Alokasi Pertama
  • 2, yang menunjukkan bahwa volume tersebut berisi FAT Pertama, FAT Kedua, Bitmap Alokasi Pertama, dan Bitmap Alokasi Kedua; nilai ini hanya berlaku untuk volume TexFAT.

3.1.17 DrivePilih Bidang

Bidang DriveSelect harus berisi nomor drive INT 13h yang diperluas, yang membantu memulai proses booting dari volume ini menggunakan INT 13h yang diperluas pada komputer pribadi.

Semua nilai yang mungkin untuk bidang ini valid. Bidang serupa dalam sistem file berbasis FAT sebelumnya sering berisi nilai 80h.

3.1.18 Bidang Persentase penggunaan

Bidang PercentInUse harus menjelaskan persentase kluster dalam Tumpukan Kluster yang dialokasikan.

Rentang nilai yang valid untuk bidang ini adalah:

  • Antara 0 dan 100 secara inklusif, yang merupakan persentase kluster yang dialokasikan di Tumpukan Kluster, dibulatkan ke bawah ke bilangan bulat terdekat
  • Tepat FFh, yang menunjukkan persentase kluster yang dialokasikan dalam Tumpukan Kluster tidak tersedia

Implementasi harus mengubah nilai bidang ini untuk mencerminkan perubahan alokasi kluster dalam Tumpukan Kluster atau harus mengubahnya menjadi FFh.

Implementasi tidak boleh menyertakan bidang ini saat menghitung checksum wilayah Boot Utama atau Boot Cadangan masing-masing. Ketika merujuk pada Sektor Boot Cadangan, implementasi harus memperlakukan bidang ini sebagai usang.

3.1.19 Bidang BootCode

Bidang BootCode harus berisi instruksi boot-strapping. Implementasi dapat mengisi bidang ini dengan instruksi CPU yang diperlukan untuk memulai sistem komputer. Implementasi yang tidak memberikan instruksi untuk proses inisialisasi awal wajib menginisialisasi setiap byte dalam bidang ini ke F4h (instruksi berhenti untuk CPU yang umum di komputer pribadi) sebagai bagian dari proses pemformatan.

3.1.20 Bidang BootSignature

Bidang BootSignature akan menjelaskan apakah niat sektor tertentu adalah untuk itu menjadi Sektor Boot atau tidak.

Nilai yang valid untuk bidang ini adalah AA55h. Nilai lain dalam kolom ini membuat Sektor Boot masing-masing menjadi tidak valid. Implementasi harus memverifikasi konten bidang ini sebelum bergantung pada bidang lain di Sektor Boot masing-masing.

3.2 Sub-wilayah Utama dan Cadangan Boot Yang Diperluas

Setiap sektor pada Main Extended Boot Sectors memiliki struktur yang sama; namun, setiap sektor mungkin menyimpan instruksi "boot-strapping" yang berbeda (lihat Tabel 6). Agen boot-strapping, seperti instruksi boot-strapping di Sektor Boot Utama, implementasi BIOS alternatif, atau firmware sistem yang disematkan, dapat memuat sektor-sektor ini dan menjalankan instruksi yang dikandungnya.

Sektor Boot Ekstensi Cadangan adalah cadangan dari Sektor Boot Ekstensi Utama dan memiliki struktur yang sama (lihat Tabel 6).

Sebelum menjalankan instruksi Sektor Boot Utama atau Cadangan diperpanjang, implementasi harus memverifikasi kontennya dengan memastikan bidang ExtendedBootSignature setiap sektor berisi nilai yang ditentukan.

Sementara operasi format awal akan menginisialisasi konten Sektor Boot Utama dan Cadangan yang Diperpanjang, implementasi dapat memperbarui sektor-sektor ini (dan juga harus memperbarui Boot Checksum masing-masing) sesuai kebutuhan.

Tabel 6 Struktur Sektor Boot Diperpanjang

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
ExtendedBootCode 0 2BytesPerSectorShift – 4

Bidang ini wajib dan Bagian 3.2.1 mendefinisikan kontennya.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang BytesPerSectorShift.

Tanda Tangan Boot Ekstensi 2BytesPerSectorShift – 4 4

Bidang ini wajib dan Bagian 3.2.2 mendefinisikan kontennya.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang BytesPerSectorShift.

3.2.1 Bidang Kode Boot Diperpanjang

Bidang ExtendedBootCode harus berisi instruksi pemulaian. Implementasi dapat mengisi bidang ini dengan instruksi CPU yang diperlukan untuk memulai sistem komputer. Implementasi yang tidak memberikan instruksi boot-strapping harus menginisialisasi setiap byte di bidang ini ke 00h sebagai bagian dari operasi format mereka.

3.2.2 Bidang ExtendedBootSignature

Bidang ExtendedBootSignature akan menjelaskan apakah sektor yang diberikan dimaksudkan untuk menjadi Extended Boot Sector atau tidak.

Nilai yang valid untuk bidang ini adalah AA550000h. Nilai lain di kolom ini merusak Sektor Boot Utama atau Cadangan yang Diperluas. Implementasi harus memverifikasi isi dari kolom ini sebelum mengandalkan kolom lain di Extended Boot Sector masing-masing.

Parameter OEM Utama dan Cadangan Subregional

Sub-wilayah Parameter OEM Utama berisi sepuluh struktur parameter yang mungkin berisi informasi khusus produsen (lihat Tabel 7). Masing-masing dari sepuluh struktur parameter berasal dari templat Parameter Generik (lihat Bagian 3.3.2). Produsen dapat memperoleh struktur parameter kustom mereka sendiri dari templat Parameter Generik. Spesifikasi ini sendiri mendefinisikan dua struktur parameter: Parameter Null (lihat Bagian 3.3.3) dan Parameter Flash (lihat Bagian 3.3.4).

Parameter OEM Cadangan adalah cadangan Parameter OEM Utama dan memiliki struktur yang sama (lihat Tabel 7).

Sebelum menggunakan konten Parameter OEM Utama atau Cadangan, implementasi harus memverifikasi kontennya dengan memvalidasi Boot Checksum masing-masing.

Produsen harus mengisi Parameter OEM Utama dan Cadangan dengan struktur parameter kustom mereka sendiri, jika ada, dan struktur parameter lainnya. Operasi format berikutnya harus mempertahankan konten Parameter OEM Utama dan Cadangan.

Implementasi dapat memperbarui Parameter OEM Utama dan Cadangan sesuai kebutuhan (dan juga harus memperbarui Boot Checksum masing-masing).

Tabel 7 Struktur Parameter OEM

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
Parameter[0] 0 48 Bidang ini wajib dan Bagian 3.3.1 mendefinisikan kontennya.

.

.

.

.

.

.

.

.

.

.

.

.

Parameter[9] 432 48 Bidang ini wajib dan Bagian 3.3.1 mendefinisikan kontennya.
Sudah Dipesan 480 (empat ratus delapan puluh) 2BytesPerSectorShift – 480

Bidang ini wajib dan isinya dibatasi.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang BytesPerSectorShift.

3.3.1 Parameter[0] ... Parameter[9]

Setiap bidang Parameter dalam array ini berisi struktur parameter, yang berasal dari templat Parameter Generik (lihat Bagian 3.3.2). Setiap bidang Parameter yang tidak digunakan harus dijelaskan sebagai berisi struktur Parameter Null (lihat Bagian 3.3.3).

3.3.2 Templat Parameter Umum

Templat Parameter Generik menyediakan definisi dasar struktur parameter (lihat Tabel 8). Semua struktur parameter berasal dari templat ini. Dukungan untuk templat Parameter Generik ini wajib dilakukan.

Tabel 8 Templat Parameter Generik

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
ParameterGUID 0 16 Bidang ini wajib dan Bagian 3.3.2.1 mendefinisikan kontennya.
DidefinisikanSecaraKustom 16 32 Bidang ini wajib dan struktur yang berasal dari templat ini menentukan isinya.
3.3.2.1 Bidang ParametersGuid

Bidang ParametersGuid akan menjelaskan GUID, yang menentukan tata letak sisa struktur parameter yang diberikan.

Semua nilai yang mungkin untuk bidang ini valid; namun, produsen harus menggunakan alat pembuatan GUID, seperti GuidGen.exe, untuk memilih GUID saat mengambil struktur parameter kustom dari templat ini.

3.3.3 Parameter Nol

Struktur Parameter Null berasal dari templat Parameter Generik (lihat Bagian 3.3.2) dan harus menjelaskan bidang Parameter yang tidak digunakan (lihat Tabel 9). Saat membuat atau memperbarui struktur Parameter OEM, implementasi harus mengisi bidang Parameter yang tidak digunakan dengan struktur Parameter Null. Selain itu, saat membuat atau memperbarui struktur Parameter OEM, implementasi harus mengonsolidasikan struktur Parameter Null di akhir array, sehingga meninggalkan semua struktur Parameter lainnya di awal struktur Parameter OEM.

Dukungan untuk struktur Parameter Null adalah wajib.

Tabel 9 Struktur Parameter Null

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
ParameterGUID 0 16 Bidang ini wajib dan Bagian 3.3.3.1 mendefinisikan kontennya.
Sudah Dipesan 16 32 Bidang ini wajib dan isinya dibatasi.
3.3.3.1 Bidang ParametersGuid

Bidang ParametersGuid harus sesuai dengan definisi yang disediakan oleh templat Parameter Generik (lihat Bagian 3.3.2.1).

Nilai yang valid untuk bidang ini, dalam notasi GUID, adalah {00000000-0000-0000-0000-000000000000}.

3.3.4 Parameter Flash

Struktur Parameter Flash berasal dari templat Parameter Generik (lihat Bagian 3.3.2) dan berisi parameter untuk media flash (lihat Tabel 10). Produsen perangkat penyimpanan berbasis flash dapat mengisi bidang Parameter (sebaiknya bidang Parameter[0]) dengan struktur parameter ini. Implementasi dapat menggunakan informasi dalam struktur Parameter Flash untuk mengoptimalkan operasi akses selama baca/tulis dan untuk penyelarasan struktur sistem file selama pemformatan media.

Dukungan untuk struktur Parameter Flash bersifat opsional.

Tabel 10 Struktur Parameter Flash

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
ParameterGUID 0 16 Bidang ini wajib dan Bagian 3.3.4.1 mendefinisikan kontennya.
Ukuran HapusBlock 16 4 Bidang ini wajib dan Bagian 3.3.4.2 mendefinisikan kontennya.
Ukuran Halaman 20 4 Bidang ini wajib dan Bagian 3.3.4.3 mendefinisikan kontennya.
SpareSectors 24 4 Bidang ini wajib dan Bagian 3.3.4.4 mendefinisikan kontennya.
RandomAccessTime 28 4 Bidang ini wajib dan Bagian 3.3.4.5 mendefinisikan kontennya.
WaktuPemrograman 32 4 Bidang ini wajib dan Bagian 3.3.4.6 mendefinisikan kontennya.
ReadCycle 36 4 Bidang ini wajib dan Bagian 3.3.4.7 mendefinisikan kontennya.
WriteCycle 40 4 Bidang ini wajib dan Bagian 3.3.4.8 mendefinisikan kontennya.
Sudah Dipesan 44 4 Bidang ini wajib dan isinya dibatasi.

Semua nilai yang mungkin untuk semua bidang Parameter Flash, kecuali untuk bidang ParametersGuid, valid. Namun, nilai 0 menunjukkan bidang sebenarnya tidak berarti (implementasi harus mengabaikan bidang yang diberikan).

3.3.4.1 Bidang ParametersGuid

Bidang ParametersGuid harus sesuai dengan definisi yang disediakan dalam templat Parameter Generik (lihat Bagian 3.3.2.1).

Nilai yang valid untuk bidang ini, dalam notasi GUID, adalah {0A0C7E46-3399-4021-90C8-FA6D389C4BA2}.

3.3.4.2 HapusBlockSize Bidang

Bidang EraseBlockSize harus menggambarkan ukuran, dalam byte, dari blok penghapusan media flash.

3.3.4.3 Bidang Ukuran Halaman

Bidang PageSize akan menjelaskan ukuran halaman media flash dalam byte.

3.3.4.4 Bidang SpareSectors

Bidang SpareSectors harus menjelaskan jumlah sektor yang dimiliki media flash yang tersedia untuk operasi penghematan internalnya.

3.3.4.5 Bidang RandomAccessTime

Bidang RandomAccessTime harus menjelaskan waktu akses acak rata-rata media flash, dalam nanodetik.

3.3.4.6 Bidang ProgrammingTime

Bidang ProgrammingTime harus menjelaskan waktu pemrograman rata-rata media flash, dalam nanodetik.

3.3.4.7 Bidang Siklus Pembacaan

Bidang ReadCycle harus menjelaskan waktu siklus baca rata-rata media flash, dalam nanodetik.

3.3.4.8 Bidang Siklus Tulis

Bidang WriteCycle akan menjelaskan waktu siklus tulis rata-rata, dalam nanodetik.

3.4 Sub-wilayah Checksum Boot Utama dan Cadangan

Checksum Boot Utama dan Cadangan masing-masing berisi pola berulang dari checksum empat byte dari konten semua sub-wilayah lain di wilayah Boot masing-masing. Perhitungan checksum tidak boleh mencakup bidang VolumeFlags dan PercentInUse di Sektor Boot masing-masing (lihat Gambar 1). Pola berulang dari checksum empat byte mengisi sub-wilayah Boot Checksum masing-masing, dimulai dari awal hingga akhir sub-wilayah.

Sebelum menggunakan konten sub-wilayah lain di wilayah Utama atau Boot Cadangan, implementasi harus memverifikasi kontennya dengan memvalidasi Boot Checksum masing-masing.

Sementara operasi format awal akan mengisi Checksum Boot Utama dan Cadangan dengan pola checksum berulang, implementasi harus memperbarui sektor-sektor ini saat konten sektor lain di wilayah Boot masing-masing berubah.

Gambar 1 Komputasi Checksum Boot

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 Wilayah Tabel Alokasi File

Wilayah Tabel Alokasi File (FAT) dapat berisi hingga dua FAT, satu di sub-wilayah FAT Pertama dan satu lagi di sub-wilayah FAT Kedua. Bidang NumberOfFats menjelaskan berapa banyak FAT yang dikandung wilayah ini. Nilai yang valid untuk bidang NumberOfFats adalah 1 dan 2. Oleh karena itu, sub-wilayah FAT Pertama selalu mengandung FAT. Jika bidang NumberOfFats adalah dua, maka sub-wilayah FAT Kedua juga berisi FAT.

Bidang ActiveFat dari bidang VolumeFlags menjelaskan FAT mana yang aktif. Hanya bidang VolumeFlags di Sektor Boot Utama yang saat ini. Implementasi harus menganggap FAT yang tidak aktif sebagai basi. Penggunaan FAT yang nonaktif dan peralihan antara FAT bersifat spesifik pada implementasi.

4.1 Sub-wilayah FAT Pertama dan Kedua

FAT harus menjelaskan rantai kluster dalam Timbunan Kluster (lihat Tabel 11). Rantai kluster adalah serangkaian kluster yang menyediakan ruang untuk merekam konten file, direktori, dan struktur sistem file lainnya. FAT mewakili rantai kluster sebagai daftar indeks kluster yang ditautkan secara senyap. Dengan pengecualian dari dua entri pertama, setiap entri dalam FAT mewakili tepat satu kluster.

Tabel 11 Struktur Tabel Alokasi File

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
FatEntry[0] 0 4 Bidang ini wajib dan Bagian 4.1.1 mendefinisikan kontennya.
FatEntry[1] 4 4 Bidang ini wajib dan Bagian 4.1.2 mendefinisikan kontennya.
FatEntry[2] 8 4 Bidang ini wajib dan Bagian 4.1.3 mendefinisikan kontennya.

.

.

.

.

.

.

.

.

.

.

.

.

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

Bidang ini wajib dan Bagian 4.1.3 mendefinisikan kontennya.

ClusterCount + 1 tidak akan bisa melebihi FFFFFFF6h.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang ClusterCount.

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

Bidang ini wajib dan isinya, jika ada, tidak terdefinisi.

Catatan: Sektor Boot Utama dan Cadangan berisi bidang ClusterCount, FatLength, dan BytesPerSectorShift.

4.1.1 FatEntry[0] Bidang

Bidang FatEntry[0] harus menggambarkan jenis media dalam byte pertama (byte urutan terendah) dan harus berisi FFh dalam tiga byte yang tersisa.

Jenis media (byte pertama) harus F8h.

4.1.2 FatEntry[1] Field

Bidang FatEntry[1] hanya ada karena prioritas historis dan tidak menggambarkan apa pun yang menarik.

Nilai yang valid untuk bidang ini adalah FFFFFFFFh. Implementasi harus menginisialisasi bidang ini ke nilai yang ditentukan dan tidak boleh menggunakan bidang ini untuk tujuan apa pun. Implementasi tidak boleh menafsirkan bidang ini dan harus mempertahankan kontennya di seluruh operasi yang memodifikasi bidang sekitarnya.

4.1.3 FatEntry[2] ... FatEntry[ClusterCount+1] Fields

Setiap bidang FatEntry dalam array ini akan mewakili kluster dalam Timbunan Kluster. FatEntry[2] mewakili kluster pertama dalam Cluster Heap dan FatEntry[ClusterCount+1] mewakili kluster terakhir dalam Cluster Heap.

Rentang nilai yang valid untuk bidang-bidang ini adalah:

  • Antara 2 dan ClusterCount + 1, secara inklusif, yang menunjuk ke FatEntry berikutnya dalam rantai kluster yang diberikan; FatEntry yang diberikan tidak akan menunjuk ke FatEntry yang mendahuluinya dalam rantai kluster yang diberikan
  • Nilai tepat FFFFFFF7h, menunjukkan kluster yang berhubungan dengan FatEntry yang diberikan sebagai "rusak"
  • Tepat FFFFFFFFh, yang mengidentifikasi kluster yang sesuai dengan FatEntry yang diberikan sebagai kluster terakhir dari rantai kluster; ini adalah satu-satunya nilai yang valid untuk FatEntry terakhir dari rantai kluster manapun yang telah ditentukan

5 Wilayah Data

Wilayah Data berisi Tumpukan Kluster, yang menyediakan ruang terkelola untuk struktur sistem file, direktori, dan file.

5.1 Sub-wilayah Timbunan Kluster

Struktur Cluster Heap sangat sederhana (lihat Tabel 12); setiap seri sektor berturut-turut menjelaskan satu kluster, seperti yang ditentukan bidang SectorsPerClusterShift. Yang penting, kluster pertama Dari Cluster Heap memiliki indeks dua, yang secara langsung sesuai dengan indeks FatEntry[2].

Dalam volume exFAT, Bitmap Alokasi (lihat Bagian 7.1.5) mempertahankan catatan status alokasi semua kluster. Ini adalah perbedaan signifikan dari pendahulu exFAT (FAT12, FAT16, dan FAT32), di mana FAT mempertahankan catatan status alokasi semua kluster dalam Kumpulan Kluster.

Tabel 12 Struktur Tumpukan Kluster

Nama Bidang

Offset

(sektor)

Ukuran

(sektor)

Komentar
Kluster[2] ClusterHeapOffset 2SektorPerClusterShift

Bidang ini wajib dan Bagian 5.1.1 mendefinisikan kontennya.

Catatan: Sektor Boot Utama dan Cadangan berisi bidang ClusterHeapOffset dan SectorsPerClusterShift.

.

.

.

.

.

.

.

.

.

.

.

.

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

Bidang ini wajib dan Bagian 5.1.1 mendefinisikan kontennya.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang ClusterCount, ClusterHeapOffset, dan SectorsPerClusterShift.

5.1.1 Kluster[2] ... Kluster[ClusterCount+1] Bidang

Setiap bidang Kluster dalam array ini adalah serangkaian sektor yang berdekatan, yang ukurannya ditentukan oleh bidang SectorsPerClusterShift.

6 Struktur Direktori

Sistem file exFAT menggunakan pendekatan pohon direktori untuk mengelola struktur sistem file dan file yang ada di Cluster Heap. Direktori memiliki hubungan satu-ke-banyak antara induk dan anak di pohon direktori.

Direktori yang dirujuk bidang FirstClusterOfRootDirectory adalah akar pohon direktori. Semua direktori lain turun dari direktori akar dengan cara yang ditautkan dengan sesak.

Setiap direktori terdiri dari serangkaian entri direktori (lihat Tabel 13).

Satu atau beberapa entri direktori digabungkan ke dalam kumpulan entri direktori yang menjelaskan sesuatu yang menarik, seperti struktur sistem file, sub-direktori, atau file.

Tabel 13 Struktur Direktori

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
DirectoryEntry[0] 0 32 Bidang ini wajib dan Bagian 6.1 mendefinisikan kontennya.

.

.

.

.

.

.

.

.

.

.

.

.

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

Bidang ini wajib dan Bagian 6.1 mendefinisikan kontennya.

N, jumlah bidang DirectoryEntry, adalah ukuran, dalam byte, dari rantai kluster yang berisi direktori yang diberikan, dibagi dengan ukuran bidang DirectoryEntry, 32 byte.

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

Setiap bidang DirectoryEntry dalam array ini berasal dari templat Generic DirectoryEntry (lihat Bagian 6.2).

6.2 Templat Entri Direktori Generik

Templat Generic DirectoryEntry menyediakan definisi dasar untuk entri direktori (lihat Tabel 14). Semua struktur entri direktori berasal dari templat ini dan hanya struktur entri direktori yang ditentukan Microsoft yang valid (exFAT tidak memiliki ketentuan untuk struktur entri direktori yang ditentukan produsen kecuali sebagaimana didefinisikan dalam Bagian 7.8 dan Bagian 7.9). Kemampuan untuk menafsirkan templat Generic DirectoryEntry adalah wajib.

Tabel 14 Templat Umum DirectoryEntry

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
Jenis Entri 0 1 Bidang ini wajib dan Bagian 6.2.1 mendefinisikan kontennya.
DidefinisikanSecaraKustom 1 19 Bidang ini wajib dan struktur yang berasal dari templat ini dapat menentukan isinya.
FirstCluster 20 4 Bidang ini wajib dan Bagian 6.2.2 mendefinisikan kontennya.
PanjangData 24 8 Bidang ini wajib dan Bagian 6.2.3 mendefinisikan kontennya.

6.2.1 Bidang EntryType

Bidang EntryType memiliki tiga mode penggunaan yang ditentukan nilai bidang (lihat daftar di bawah).

  • 00h, yang merupakan penanda akhir direktori dan kondisi berikut berlaku:
    • Semua bidang lain dalam DirectoryEntry yang diberikan direservasi.
    • Semua entri direktori berikutnya dalam direktori yang diberikan juga merupakan penanda akhir direktori
    • Penanda akhir direktori hanya valid di luar kumpulan entri direktori
    • Implementasi dapat menimpa penanda penutup direktori jika diperlukan.
  • Antara 01h dan 7Fh termasuk, yang merupakan penanda entri direktori yang tidak digunakan dan kondisi berikut berlaku:
    • Semua bidang lain dalam DirectoryEntry yang diberikan sebenarnya tidak terdefinisi
    • Entri direktori yang tidak digunakan hanya valid di luar set entri direktori
    • Implementasi dapat mengganti entri direktori yang tidak digunakan jika perlu
    • Rentang nilai ini sesuai dengan bidang InUse (lihat Bagian 6.2.1.4) yang berisi nilai 0
  • Antara 81h dan FFh secara inklusif, yang merupakan entri direktori standar, dan kondisi berikut berlaku:
    • Konten bidang EntryType (lihat Tabel 15) menentukan tata letak sisa struktur DirectoryEntry
    • Rentang nilai ini, dan hanya rentang nilai ini, yang valid di dalam kumpulan entri direktori
    • Rentang nilai ini secara langsung sesuai dengan bidang InUse (lihat Bagian 6.2.1.4) yang berisi nilai 1

Untuk mencegah modifikasi pada bidang InUse (lihat Bagian 6.2.1.4) secara keliru menghasilkan penanda akhir direktori, nilai 80h tidak valid.

Tabel 15 Struktur Bidang EntryType Generik

Nama Bidang

Offset

(bit)

Ukuran

(bit)

Komentar
Kode Tipe 0 5 Bidang ini wajib dan Bagian 6.2.1.1 mendefinisikan kontennya.
JenisKepentingan 5 1 Bidang ini wajib dan Bagian 6.2.1.2 mendefinisikan kontennya.
TipeKategori 6 1 Bidang ini wajib dan Bagian 6.2.1.3 mendefinisikan kontennya.
Sedang Digunakan 7 1 Bidang ini wajib dan Bagian 6.2.1.4 mendefinisikan kontennya.
Bidang TypeCode 6.2.1.1

Bidang TypeCode sebagian menjelaskan jenis tertentu dari entri direktori yang diberikan. Bidang ini, ditambah bidang TypeImportance dan TypeCategory (lihat Bagian 6.2.1.2 dan Bagian 6.2.1.3, masing-masing) secara unik mengidentifikasi jenis entri direktori yang diberikan.

Semua nilai yang mungkin dari bidang ini valid, kecuali bidang TypeImportance dan TypeCategory keduanya berisi nilai 0; dalam hal ini, nilai 0 tidak valid untuk bidang ini.

6.2.1.2 Bidang TypeImportance

Bidang TypeImportance harus menjelaskan pentingnya entri direktori yang diberikan.

Nilai yang valid untuk bidang ini adalah:

  • 0, yang berarti entri direktori yang diberikan sangat penting (lihat Bagian 6.3.1.2.1 dan Bagian 6.4.1.2.1 untuk entri direktori primer dan sekunder penting, masing-masing)
  • 1, yang berarti entri direktori yang diberikan bersifat jinak (lihat Bagian 6.3.1.2.2 untuk entri direktori primer yang jinak dan Bagian 6.4.1.2.2 untuk entri direktori sekunder yang jinak)
6.2.1.3 Bidang TypeCategory

Bidang TypeCategory harus menjelaskan kategori entri direktori yang diberikan.

Nilai yang valid untuk bidang ini adalah:

  • 0, yang berarti entri direktori yang diberikan adalah primer (lihat Bagian 6.3)
  • 1, yang berarti entri direktori yang diberikan adalah sekunder (lihat Bagian 6.4)
6.2.1.4 Bidang Penggunaan

Bidang InUse akan menjelaskan apakah entri direktori yang diberikan digunakan atau tidak.

Nilai yang valid untuk bidang ini adalah:

  • 0, yang berarti entri direktori yang diberikan tidak digunakan; ini berarti struktur yang diberikan sebenarnya adalah entri direktori yang tidak digunakan
  • 1, yang berarti entri direktori yang diberikan sedang digunakan; ini berarti struktur yang diberikan adalah entri direktori reguler

6.2.2 Bidang FirstCluster

Bidang FirstCluster harus berisi indeks dari kluster pertama sebuah alokasi dalam Tumpukan Kluster yang terkait dengan entri direktori tersebut.

Rentang nilai yang valid untuk bidang ini adalah:

  • Tepat 0, yang berarti tidak ada alokasi kluster
  • Antara 2 dan ClusterCount + 1, yang merupakan rentang indeks kluster yang valid

Struktur yang berasal dari templat ini dapat menentukan ulang bidang FirstCluster dan DataLength, jika alokasi kluster tidak kompatibel dengan struktur turunan.

6.2.3 Bidang DataLength

Bidang DataLength menjelaskan ukuran, dalam byte, dari data yang dikandung alokasi kluster terkait.

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya 0; jika bidang FirstCluster berisi nilai 0, maka satu-satunya nilai bidang ini yang valid adalah 0
  • Paling banyak ClusterCount * 2SektorPerClusterShift* 2BytesPerSectorShift

Struktur yang berasal dari templat ini dapat menentukan ulang bidang FirstCluster dan DataLength, jika alokasi kluster tidak dimungkinkan untuk struktur turunan.

6.3 Templat Direktori Utama Generik

Entri direktori pertama dalam set entri direktori harus menjadi entri direktori utama. Semua entri direktori berikutnya, jika ada, dalam kumpulan entri direktori harus entri direktori sekunder (lihat Bagian 6.4).

Kemampuan untuk menafsirkan templat Generic Primary DirectoryEntry adalah wajib.

Semua struktur entri direktori utama berasal dari templat Generic Primary DirectoryEntry (lihat Tabel 16), yang berasal dari templat Generic DirectoryEntry (lihat Bagian 6.2).

Tabel 16 Templat Entri Direktori Utama Generik

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
Jenis Entri 0 1 Bidang ini wajib dan Bagian 6.3.1 mendefinisikan kontennya.
JumlahSekunder 1 1 Bidang ini wajib dan Bagian 6.3.2 mendefinisikan kontennya.
SetChecksum 2 2 Bidang ini wajib dan Bagian 6.3.3 mendefinisikan kontennya.
GeneralPrimaryFlags 4 2 Bidang ini wajib dan Bagian 6.3.4 mendefinisikan kontennya.
DidefinisikanSecaraKustom 6 14 Bidang ini wajib dan struktur yang berasal dari templat ini menentukan isinya.
FirstCluster 20 4 Bidang ini wajib dan Bagian 6.3.5 mendefinisikan kontennya.
PanjangData 24 8 Bidang ini wajib dan Bagian 6.3.6 mendefinisikan kontennya.

6.3.1 Bidang EntryType

Bidang EntryType harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.1).

6.3.1.1 Bidang TypeCode

Bidang TypeCode harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.1.1).

6.3.1.2 Bidang TypeImportance

Bidang TypeImportance harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.1.2).

6.3.1.2.1 Entri Direktori Utama Penting

Entri direktori utama penting berisi informasi yang sangat penting untuk manajemen volume exFAT yang tepat. Hanya direktori akar yang berisi entri direktori utama penting (Entri direktori file adalah pengecualian, lihat Bagian 7.4).

Definisi entri direktori utama penting berkorelasi dengan nomor revisi exFAT utama. Implementasi harus mendukung semua entri direktori utama penting dan hanya akan merekam struktur entri direktori utama penting yang ditentukan spesifikasi ini.

6.3.1.2.2 Entri Direktori Utama Jinak

Entri direktori utama yang tidak berbahaya berisi informasi tambahan yang dapat berguna untuk pengelolaan volume exFAT. Direktori apa pun mungkin berisi entri direktori utama jinak.

Definisi entri direktori utama yang tidak berbahaya berkorelasi dengan nomor revisi kecil exFAT. Dukungan untuk setiap entri direktori utama yang tidak berbahaya yang ditentukan oleh spesifikasi ini, atau spesifikasi berikutnya, bersifat opsional. Entri direktori utama jinak yang tidak dikenal merender seluruh kumpulan entri direktori sebagai tidak dikenali (di luar definisi templat entri direktori yang berlaku).

6.3.1.3 Bidang KategoriTipe

Bidang TypeCategory harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.1.3).

Untuk templat ini, nilai yang valid untuk bidang ini adalah 0.

6.3.1.4 Bidang Penggunaan

Bidang InUse harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.1.4).

6.3.2 Bidang SecondaryCount

Bidang SecondaryCount harus menjelaskan jumlah entri direktori sekunder yang segera mengikuti entri direktori utama yang diberikan. Entri direktori sekunder ini, bersama dengan entri direktori utama yang diberikan, terdiri dari set entri direktori.

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya 0, yang berarti entri direktori utama ini adalah satu-satunya entri dalam set entri direktori
  • Paling banyak 255, yang berarti 255 entri direktori berikutnya dan entri direktori utama ini merupakan satu set entri direktori.

Struktur entri direktori utama penting yang berasal dari templat ini dapat menentukan ulang bidang SecondaryCount dan SetChecksum.

6.3.3 SetChecksum Field

Bidang SetChecksum harus berisi checksum dari semua entri dalam set entri direktori yang diberikan. Namun, checksum mengecualikan bidang ini (lihat Gambar 2). Implementasi harus memverifikasi konten bidang ini valid sebelum menggunakan entri direktori lain dalam set entri direktori yang diberikan.

Struktur entri direktori utama penting yang berasal dari templat ini dapat menentukan ulang bidang SecondaryCount dan SetChecksum.

Gambar 2 EntrySetChecksum Computation

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 Bidang GeneralPrimaryFlags

Bidang GeneralPrimaryFlags berisi bendera (lihat Tabel 17).

Struktur entri direktori utama penting yang berasal dari templat ini dapat menentukan ulang bidang ini.

Tabel 17 Struktur Bidang GeneralPrimaryFlags Generik

Nama Bidang

Offset

(bit)

Ukuran

(bit)

Komentar
Pengalokasian Mungkin 0 1 Bidang ini wajib dan Bagian 6.3.4.1 mendefinisikan kontennya.
NoFatChain 1 1 Bidang ini wajib dan Bagian 6.3.4.2 mendefinisikan kontennya.
DidefinisikanSecaraKustom 2 14 Bidang ini wajib dan struktur yang berasal dari templat ini dapat menentukan bidang ini.
6.3.4.1 Bidang KemungkinanAlokasi

Kolom AllocationPossible harus menjelaskan apakah alokasi di dalam Cluster Heap memungkinkan untuk entri direktori yang diberikan.

Nilai yang valid untuk bidang ini adalah:

  • 0, yang berarti alokasi kluster terkait tidak dimungkinkan dan bidang FirstCluster dan DataLength sebenarnya tidak terdefinisi (struktur yang berasal dari templat ini dapat menentukan ulang bidang tersebut)
  • 1, yang berarti alokasi kluster terkait dimungkinkan dan bidang FirstCluster dan DataLength seperti yang didefinisikan
6.3.4.2 Bidang Rantai NoFat

Bidang NoFatChain akan menunjukkan apakah FAT aktif menjelaskan rangkaian kluster dari alokasi yang diberikan atau tidak.

Nilai yang valid untuk bidang ini adalah:

  • 0, yang berarti entri FAT yang sesuai untuk rantai kluster alokasi valid dan implementasi harus menafsirkannya; jika bidang AllocationPossible berisi nilai 0, atau jika bidang AllocationPossible berisi nilai 1 dan bidang FirstCluster berisi nilai 0, maka satu-satunya nilai yang valid bidang ini adalah 0
  • 1, yang berarti alokasi terkait adalah satu rangkaian kluster yang bersebelahan; entri FAT yang sesuai untuk kluster tidak valid dan implementasi tidak boleh menafsirkannya; implementasi dapat menggunakan persamaan berikut untuk menghitung ukuran alokasi terkait: DataLength / (2SectorsPerClusterShift* 2BytesPerSectorShift) dibulatkan ke atas ke bilangan bulat terdekat

Jika struktur entri direktori utama kritis yang berasal dari templat ini mendefinisikan ulang bidang GeneralPrimaryFlags, maka entri FAT yang sesuai untuk rantai kluster alokasi terkait dianggap valid.

6.3.5 Bidang FirstCluster

Bidang FirstCluster harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.2).

Jika bit NoFatChain adalah 1 maka FirstCluster harus menunjuk ke kluster yang valid dalam tumpukan kluster.

Struktur entri direktori utama penting yang berasal dari templat ini dapat menentukan ulang bidang FirstCluster dan DataLength. Struktur lain yang berasal dari templat ini dapat menentukan ulang bidang FirstCluster dan DataLength hanya jika bidang AllocationPossible berisi nilai 0.

6.3.6 Bidang PanjangData

Bidang DataLength harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.3).

Jika bit NoFatChain adalah 1, maka DataLength tidak boleh nol. Jika bidang FirstCluster adalah nol, maka DataLength juga harus nol.

Struktur entri direktori utama penting yang berasal dari templat ini dapat menentukan ulang bidang FirstCluster dan DataLength. Struktur lain yang berasal dari templat ini dapat menentukan ulang bidang FirstCluster dan DataLength hanya jika bidang AllocationPossible berisi nilai 0.

6.4 Templat Generik Entri Direktori Sekunder

Tujuan pusat entri direktori sekunder adalah untuk memberikan informasi tambahan tentang kumpulan entri direktori. Kemampuan untuk menafsirkan templat Generic Secondary DirectoryEntry adalah wajib.

Definisi entri direktori sekunder penting dan jinak berkorelasi dengan nomor revisi exFAT minor. Dukungan untuk setiap entri direktori sekunder, baik yang penting maupun jinak, yang didefinisikan oleh spesifikasi ini atau spesifikasi berikutnya adalah bersifat opsional.

Semua struktur entri direktori sekunder berasal dari templat Generic Secondary DirectoryEntry (lihat Tabel 18), yang berasal dari templat Generic DirectoryEntry (lihat Bagian 6.2).

Tabel 18 Templat Entri Direktori Sekunder Generik

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
Jenis Entri 0 1 Bidang ini wajib dan Bagian 6.4.1 mendefinisikan kontennya.
GeneralSecondaryFlags 1 1 Bidang ini wajib dan Bagian 6.4.2 mendefinisikan kontennya.
DidefinisikanSecaraKustom 2 18 Bidang ini wajib dan struktur yang berasal dari templat ini menentukan isinya.
FirstCluster 20 4 Bidang ini wajib dan Bagian 6.4.3 mendefinisikan kontennya.
PanjangData 24 8 Bidang ini wajib dan Bagian 6.4.4 mendefinisikan kontennya.

6.4.1 Bidang EntryType

Bidang EntryType harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.1)

6.4.1.1 Bidang TypeCode

Bidang TypeCode harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.1.1).

6.4.1.2 Bidang PentingnyaTipe

Bidang TypeImportance harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.1.2).

6.4.1.2.1 Entri Direktori Sekunder Penting

Entri direktori sekunder penting berisi informasi yang sangat penting untuk manajemen yang tepat dari kumpulan entri direktori yang berisi. Meskipun dukungan untuk entri direktori sekunder penting tertentu bersifat opsional, entri direktori penting yang tidak dikenal merender seluruh entri direktori yang ditetapkan sebagai tidak dikenali (di luar definisi templat entri direktori yang berlaku).

Namun, jika set entri direktori berisi setidaknya satu entri direktori sekunder penting yang tidak dikenali implementasi, maka implementasi harus paling banyak menginterpretasikan templat entri direktori dalam kumpulan entri direktori dan bukan data alokasi apa pun yang terkait dengan entri direktori apa pun dalam set entri direktori berisi (Entri direktori file adalah pengecualian, lihat Bagian 7.4).

6.4.1.2.2 Entri Direktori Sekunder Tidak Berbahaya

Entri direktori sekunder jinak berisi informasi tambahan yang mungkin berguna untuk mengelola kumpulan entri direktori yang berisinya. Dukungan untuk entri direktori sekunder jinak tertentu bersifat opsional. Entri direktori sekunder jinak yang tidak dikenali tidak menjadikan seluruh kumpulan entri direktori yang ditetapkan sebagai tidak dikenali.

Implementasi dapat mengabaikan entri sekunder jinak yang tidak dikenalinya.

6.4.1.3 Bidang TypeCategory

Bidang TypeCategory harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.1.3).

Untuk templat ini, nilai yang valid untuk bidang ini adalah 1.

6.4.1.4 Bidang Penggunaan

Bidang InUse harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.1.4).

6.4.2 Bidang GeneralSecondaryFlags

Bidang GeneralSecondaryFlags berisi bendera (lihat Tabel 19).

Tabel 19 Struktur Bidang Generik GeneralSecondaryFlags

Nama Bidang

Offset

(bit)

Ukuran

(bit)

Komentar
Pengalokasian Mungkin 0 1 Bidang ini wajib dan Bagian 6.4.2.1 mendefinisikan kontennya.
NoFatChain 1 1 Bidang ini wajib dan Bagian 6.4.2.2 mendefinisikan kontennya.
DidefinisikanSecaraKustom 2 6 Bidang ini wajib dan struktur yang berasal dari templat ini dapat menentukan bidang ini.
6.4.2.1 Bidang Alokasi Mungkin

Bidang AllocationPossible harus memiliki definisi yang sama dengan bidang bernama yang sama di templat Generic Primary DirectoryEntry (lihat Bagian 6.3.4.1).

6.4.2.2 Bidang NoFatChain

Bidang NoFatChain harus memiliki definisi yang sama dengan bidang bernama yang sama dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.4.2).

6.4.3 Bidang ClusterPertama

Bidang FirstCluster harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.2).

Jika bit NoFatChain adalah 1 maka FirstCluster harus menunjuk ke kluster yang valid dalam tumpukan kluster.

6.4.4 Bidang PanjangData

Bidang DataLength harus sesuai dengan definisi yang disediakan dalam templat Generic DirectoryEntry (lihat Bagian 6.2.3).

Jika bit NoFatChain adalah 1, maka DataLength tidak boleh nol. Jika bidang FirstCluster adalah nol, maka DataLength juga harus nol.

7 Definisi Entri Direktori

Revisi 1.00 dari sistem file exFAT menentukan entri direktori berikut:

7.1 Entri Direktori Bitmap Alokasi

Dalam sistem file exFAT, FAT tidak menggambarkan status alokasi kluster; melainkan, Bitmap Alokasi yang melakukannya. Bitmap Alokasi ada di Tumpukan Kluster (lihat Bagian 7.1.5) dan memiliki entri direktori utama penting yang sesuai di direktori akar (lihat Tabel 20).

Bidang NumberOfFats menentukan jumlah entri direktori Bitmap Alokasi yang valid di direktori akar. Jika bidang NumberOfFats berisi nilai 1, maka satu-satunya jumlah entri direktori Bitmap Alokasi yang valid adalah 1. Selanjutnya, satu entri direktori Bitmap Alokasi hanya valid jika menjelaskan Bitmap Alokasi Pertama (lihat Bagian 7.1.2.1). Jika bidang NumberOfFats berisi nilai 2, maka satu-satunya jumlah entri direktori Bitmap Alokasi yang valid adalah 2. Selanjutnya, dua entri direktori Bitmap Alokasi hanya valid jika satu menjelaskan Bitmap Alokasi Pertama dan yang lainnya menjelaskan Bitmap Alokasi Kedua.

Tabel 20 Bitmap Alokasi Struktur Entri Direktori

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
Jenis Entri 0 1 Bidang ini wajib dan Bagian 7.1.1 mendefinisikan kontennya.
BitmapFlags 1 1 Bidang ini wajib dan Bagian 7.1.2 mendefinisikan kontennya.
Sudah Dipesan 2 18 Bidang ini wajib dan isinya dibatasi.
FirstCluster 20 4 Bidang ini wajib dan Bagian 7.1.3 mendefinisikan kontennya.
PanjangData 24 8 Bidang ini wajib dan Bagian 7.1.4 mendefinisikan kontennya.

7.1.1 Bidang EntryType

Bidang EntryType harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.1).

7.1.1.1 Bidang TypeCode

Bidang TypeCode harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.1.1).

Untuk entri direktori Bitmap Alokasi, nilai yang valid untuk kolom ini adalah 1.

7.1.1.2 Bidang TypeImportance

Bidang TypeImportance harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.1.2).

Untuk entri direktori Bitmap Alokasi, nilai yang valid untuk kolom ini adalah 0.

7.1.1.3 Bidang KategoriTipe

Bidang TypeCategory harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.1.3).

7.1.1.4 Bidang Penggunaan

Bidang InUse harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.1.4).

7.1.2 Bidang BitmapFlags

Bidang BitmapFlags berisi bendera (lihat Tabel 21).

Tabel 21 Struktur Bidang BitmapFlags

Nama Bidang

Offset

(bit)

Ukuran

(bit)

Komentar
BitmapIdentifier 0 1 Bidang ini wajib dan Bagian 7.1.2.1 mendefinisikan kontennya.
Sudah Dipesan 1 7 Bidang ini wajib dan isinya dibatasi.
7.1.2.1 Bidang BitmapIdentifier

Bidang BitmapIdentifier akan menunjukkan Peta Bit Alokasi mana yang dijelaskan oleh entri direktori yang diberikan. Implementasi harus menggunakan Bitmap Alokasi Pertama bersama dengan FAT Pertama dan harus menggunakan Bitmap Alokasi Kedua bersama dengan FAT Kedua. Bidang ActiveFat menjelaskan FAT dan Bitmap Alokasi mana yang aktif.

Nilai yang valid untuk bidang ini adalah:

  • 0, yang berarti entri direktori yang diberikan menjelaskan Bitmap Alokasi Pertama
  • 1, yang berarti entri direktori yang diberikan menjelaskan Bitmap Alokasi Kedua dan hanya dimungkinkan ketika NumberOfFats berisi nilai 2

7.1.3 Bidang FirstCluster

Bidang FirstCluster harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.5).

Bidang ini berisi indeks kluster pertama dari rantai klaster, seperti yang dijelaskan oleh FAT, yang menghosting Bitmap Alokasi.

7.1.4 Bidang DataLength

Bidang DataCluster harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.6).

7.1.5 Bitmap Alokasi

Bitmap Alokasi mencatat status alokasi kluster dalam Tumpuk Kluster. Setiap bit dalam Bitmap Alokasi menunjukkan apakah kluster yang sesuai tersedia untuk alokasi atau tidak.

Bitmap Alokasi mewakili kluster dari indeks terendah hingga tertinggi (lihat Tabel 22). Untuk alasan historis, kluster pertama memiliki indeks 2.

Nota

Bit pertama dalam bitmap adalah bit urutan terendah dari byte pertama.

Tabel 22 Struktur Bitmap Alokasi

Nama Bidang

Offset

(bit)

Ukuran

(bit)

Komentar
BitmapEntry[2] 0 1 Bidang ini wajib dan Bagian 7.1.5.1 mendefinisikan kontennya.

.

.

.

.

.

.

.

.

.

.

.

.

BitmapEntry[ClusterCount+1] ClusterCount - 1 1

Bidang ini wajib dan Bagian 7.1.5.1 mendefinisikan kontennya.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang ClusterCount.

Sudah Dipesan Jumlah Klaster (DataLength * 8) – ClusterCount

Bidang ini wajib dan isinya, jika ada, dicadangkan.

Catatan: Sektor Boot Utama dan Cadangan keduanya berisi bidang ClusterCount.

7.1.5.1 BitmapEntry[2] ... BitmapEntry[ClusterCount+1] Bidang

Setiap bidang BitmapEntry dalam array ini mewakili kluster dalam Cluster Heap. BitmapEntry[2] mewakili kluster pertama dalam Cluster Heap dan BitmapEntry[ClusterCount+1] mewakili kluster terakhir dalam Cluster Heap.

Nilai yang valid untuk bidang ini adalah:

  • 0, yang menjelaskan kluster yang sesuai sebagaimana tersedia untuk alokasi
  • 1, yang menjelaskan kluster yang sesuai sebagai tidak tersedia untuk alokasi (alokasi kluster mungkin sudah menggunakan kluster yang sesuai atau FAT aktif dapat menggambarkan kluster yang sesuai sebagai buruk)

7.2 Entri Direktori Tabel Up-case

Tabel Huruf Besar/Kecil menentukan konversi dari karakter huruf kecil ke huruf besar. Ini penting karena entri direktori Nama File (lihat Bagian 7.7) menggunakan karakter Unicode dan sistem file exFAT menjadi tidak peka huruf besar/kecil dan mempertahankan kasus. Tabel Up-case ada di Tumpukan Kluster (lihat Bagian 7.2.5) dan memiliki entri direktori utama penting yang sesuai di direktori akar (lihat Tabel 23). Jumlah entri direktori Up-case Table yang valid adalah 1.

Karena hubungan antara Tabel Up-case dan nama file, implementasi tidak boleh mengubah Tabel Up-case, kecuali sebagai hasil dari operasi format.

Tabel 23 Struktur Direktori Tabel Up-caseEntry

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
Jenis Entri 0 1 Bidang ini wajib dan Bagian 7.2.1 mendefinisikan kontennya.
Dicadangkan1 1 3 Bidang ini wajib dan isinya dibatasi.
TableChecksum 4 4 Bidang ini wajib dan Bagian 7.2.2 mendefinisikan kontennya.
Dicadangkan2 8 12 Bidang ini wajib dan isinya dibatasi.
FirstCluster 20 4 Bidang ini wajib dan Bagian 7.2.3 mendefinisikan kontennya.
PanjangData 24 8 Bidang ini wajib dan Bagian 7.2.4 mendefinisikan kontennya.

7.2.1 Bidang EntryType

Bidang EntryType harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.1).

Bidang TypeCode 7.2.1.1

Bidang TypeCode harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.1.1).

Untuk entri direktori Tabel Up-case, nilai yang valid untuk bidang ini adalah 2.

7.2.1.2 Bidang PentingnyaTipe

Bidang TypeImportance harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.1.2).

Untuk entri direktori Tabel Up-case, nilai yang valid untuk bidang ini adalah 0.

7.2.1.3 Bidang Kategori Tipe

Bidang TypeCategory harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.1.3).

7.2.1.4 Bidang Penggunaan

Bidang InUse harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.1.4).

7.2.2 Bidang TableChecksum

Bidang TableChecksum berisi checksum Tabel Up-case seperti yang dijelaskan oleh bidang FirstCluster dan DataLength. Implementasi harus memverifikasi konten bidang ini valid sebelum menggunakan Tabel Up-case.

Gambar 3 Komputasi 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 Bidang FirstCluster

Bidang FirstCluster harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.5).

Bidang ini berisi indeks kluster pertama rantai kluster, seperti yang dijelaskan FAT, yang menghosting Tabel Up-case.

7.2.4 Bidang DataLength

Bidang DataCluster harus sesuai dengan definisi yang disediakan dalam templat Generic Primary DirectoryEntry (lihat Bagian 6.3.6).

7.2.5 Tabel Up-case

Tabel huruf besar adalah serangkaian pemetaan karakter Unicode. Pemetaan karakter terdiri dari bidang 2-byte, dengan indeks bidang dalam tabel up-case yang mewakili karakter Unicode yang akan diubah menjadi huruf besar, dan bidang 2-byte yang mewakili karakter Unicode yang sudah diubah menjadi huruf besar.

128 karakter Unicode pertama memiliki pemetaan wajib (lihat Tabel 24). Tabel up-case yang memiliki pemetaan karakter lain untuk salah satu dari 128 karakter Unicode pertama tidak valid.

Implementasi yang hanya mendukung karakter dari rentang pemetaan wajib dapat mengabaikan pemetaan tabel up-case lainnya. Implementasi tersebut hanya boleh menggunakan karakter dari rentang pemetaan wajib saat membuat atau mengganti nama file (melalui entri direktori Nama File, lihat Bagian 7.7). Ketika mengubah nama file yang ada menjadi huruf kapital, implementasi tersebut tidak boleh mengubah karakter dari rentang pemetaan opsional, tetapi harus membiarkannya tetap utuh dalam nama file yang dihasilkan (ini adalah pengubahan huruf kapital parsial). Saat membandingkan nama file, implementasi tersebut akan memperlakukan nama file yang berbeda dari nama di bawah perbandingan hanya dengan karakter Unicode dari rentang pemetaan yang tidak wajib sebagai setara. Meskipun nama file tersebut hanya berpotensi setara, implementasi tersebut tidak dapat menjamin bahwa nama file yang sepenuhnya dalam huruf besar tidak bertabrakan dengan nama yang dibandingkan.

Tabel 24 Wajib 128 entri tabel up-case pertama

Indeks tabel + 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

(Catatan: entri dengan pemetaan bukan identitas ke huruf besar dalam huruf tebal)

Setelah memformat volume, implementasi dapat menghasilkan tabel up-case dalam format terkompresi menggunakan kompresi pemetaan identitas, karena sebagian besar ruang karakter Unicode tidak memiliki konsep kasus (yang berarti karakter "huruf kecil" dan "huruf besar" setara). Implementasi mengompres tabel up-case dengan mewakili serangkaian pemetaan identitas dengan nilai FFFFh diikuti dengan jumlah pemetaan identitas.

Misalnya, implementasi dapat mewakili pemetaan karakter 100 (64 jam) pertama dengan delapan entri berikut dari tabel up-case terkompresi:

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

Dua entri pertama menunjukkan 97 (61h) karakter pertama (dari 0000h hingga 0060h) memiliki pemetaan identitas. Karakter berikutnya, 0061h sampai 0063h, masing-masing dipetakan ke karakter 0041h sampai 0043h.

Kemampuan untuk menyediakan tabel up-case terkompresi saat memformat volume bersifat opsional. Namun, kemampuan untuk menafsirkan tabel up-case yang tidak dikompresi dan terkompresi adalah wajib. Nilai kolom TableChecksum selalu sesuai dengan bagaimana tabel up-case ada pada volume data, yang mungkin dalam format terkompresi atau tidak terkompresi.

Saat memformat volume, implementasi harus merekam tabel up-case yang direkomendasikan dalam format terkompresi (lihat Tabel 25), yang nilai bidang TableChecksum-nya adalah E619D30Dh.

Jika implementasi mendefinisikan tabel up-case sendiri, baik dikompresi atau tidak dikompresi, maka tabel tersebut akan mencakup rentang karakter Unicode lengkap (dari kode karakter 0000h hingga FFFFh inklusif).