spesifikasi sistem file exFAT

1 Pendahuluan

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 yang relatif sederhana dan mudah diimplementasikan.

  2. Aktifkan file dan perangkat penyimpanan yang sangat besar.

    Sistem file exFAT menggunakan 64 bit untuk menggambarkan 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 Khusus

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

Jangka Waktu Definisi
Akan Spesifikasi ini menggunakan istilah "harus" untuk menggambarkan perilaku yang wajib.
Harus 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 implementasinya harus memodifikasi dan harus menafsirkan seperti yang dijelaskan spesifikasi ini.
Opsional Istilah ini menjelaskan bidang atau struktur yang mungkin atau tidak didukung implementasi. Jika implementasi mendukung bidang atau struktur opsional tertentu, implementasi harus memodifikasi dan harus menafsirkan bidang atau struktur seperti yang dijelaskan spesifikasi ini.
Tidak ditentukan Istilah ini menjelaskan isi bidang atau struktur yang dapat dimodifikasi oleh implementasi seperlunya (yaitu jelas ke nol saat mengatur bidang atau struktur di sekitarnya) dan tidak boleh menafsirkan untuk menyimpan arti tertentu.
Dicadangkan

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 Output Input Dasar
CPU Unit Pemrosesan Pusat
exFAT Tabel Alokasi File yang dapat diperluas
LEMAK Tabel Alokasi File
FAT12 Tabel Alokasi File, indeks kluster 12-bit
FAT16 Tabel Alokasi File, indeks kluster 16-bit
FAT32 Tabel Alokasi File, indeks kluster 32-bit
GPT Tabel Partisi GUID
GUID Pengidentifikasi Unik Global (lihat Bagian 10.1)
INT Interupsi
MBR Catatan Boot Master
texFAT ExFAT yang aman untuk transaksi
UTC Waktu Universal Terkoordinasi

1.4 Kualifikasi Bidang dan Struktur Default

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

  1. Tidak ditandatangani

  2. Gunakan notasi desimal untuk menjelaskan nilai, jika tidak disebutkan; spesifikasi ini menggunakan huruf pasca-perbaikan "h" untuk menunjukkan angka heksadesimal dan mengapit GUID dalam kurung kurawal

  3. Dalam format little-endian

  4. Tidak memerlukan karakter null-terminating 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 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 sekumpulan 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
Wilayah 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 dicadangkan.
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.
Parameter OEM Cadangan 21 1 Sub-wilayah ini wajib dan Bagian 3.3 mendefinisikan kontennya.
Cadangan Dicadangkan 22 1 Sub-wilayah ini wajib dan isinya dicadangkan.
Checksum Boot Cadangan 23 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 FatLength

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 * 2SektorPerClusterShift

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 * 2SektorPerClusterShift)

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

Catatan: Sektor Boot Utama dan Cadangan keduanya 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. Boot-strap 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 isi bidang VolumeFlags dan PercentInUse sebagai basi.

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.

Sementara 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 Checksum Boot 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.
PartitionOffset 64 8 Bidang ini wajib dan Bagian 3.1.4 mendefinisikan kontennya.
VolumeLength 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.
FatLength 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.
ClusterCount 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.
PercentInUse 112 1 Bidang ini wajib dan Bagian 3.1.18 mendefinisikan kontennya.
Dicadangkan 113 7 Bidang ini wajib dan isinya dicadangkan.
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 2BytePerSectorShift – 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 urutan rendah ke byte urutan tinggi) 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 harus secara langsung sesuai dengan rentang byte yang dikemas blok parameter BIOS yang dikonsumsi 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 menggambarkan offset sektor relatif media dari partisi yang menghosting volume exFAT yang diberikan. Bidang ini membantu boot-strapping 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 VolumeLength

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) * 2SektorPerClusterShift.

3.1.6 Bidang FatOffset

Bidang FatOffset harus menggambarkan offset sektor volume-relatif 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 memperkirakan sektor yang digunakan wilayah Boot Utama dan Boot Cadangan

  • Paling banyak ClusterHeapOffset - (FatLength * NumberOfFats), yang memperkirakan sektor yang dikonsumsi Cluster Heap

3.1.7 Bidang FatLength

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/ 2BytesPerSectorShiftdibulatkan ke bilangan bulat terdekat, yang memastikan setiap FAT memiliki ruang yang cukup untuk menjelaskan semua kluster dalam Tumpukan Kluster

  • Paling banyak (ClusterHeapOffset - FatOffset) / NumberOfFats dibulatkan ke bawah ke bilangan bulat terdekat, yang memastikan FATs ada sebelum Tumpukan Kluster

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

3.1.8 Bidang ClusterHeapOffset

Bidang ClusterHeapOffset harus menggambarkan offset sektor volume-relatif dari Cluster Heap. 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 memperkirakan sektor yang dikonsumsi semua wilayah sebelumnya

  • Paling banyak 232- 1 atau VolumeLength - (ClusterCount * 2SektorPerClusterShift), perhitungan mana pun yang lebih sedikit

3.1.9 Bidang ClusterCount

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

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

  • (VolumeLength - ClusterHeapOffset) / 2SectorsPerClusterShiftdibulatkan ke bilangan bulat terdekat, yang merupakan jumlah kluster yang tepat yang dapat pas antara awal Tumpukan Kluster dan akhir volume

  • 232- 11, yang merupakan jumlah maksimum kluster yang dapat dijelaskan FAT

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

3.1.10 Bidang FirstClusterOfRootDirectory

Bidang FirstClusterOfRootDirectory harus berisi indeks kluster kluster pertama dari direktori akar. Implementasi harus melakukan setiap upaya untuk menempatkan kluster pertama direktori akar di kluster non-buruk pertama setelah kluster bitmap alokasi dan Tabel Up-case mengkonsumsi.

Rentang nilai yang valid untuk bidang ini adalah:

  • Setidaknya 2, indeks kluster pertama di Cluster Heap

  • 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 adalah spesifik implementasi.

Semua nilai yang mungkin untuk bidang ini valid.

3.1.12 FileSystemRevision Field

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

Byte urutan tinggi adalah nomor revisi utama dan byte urutan rendah adalah nomor revisi kecil. Misalnya, jika byte urutan tinggi berisi nilai 01h dan jika byte urutan rendah berisi nilai 05h, bidang FileSystemRevision menjelaskan nomor revisi 1,05. Demikian juga, jika byte urutan tinggi berisi nilai 0Ah dan jika byte urutan rendah berisi nilai 0Fh, 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 akan berisi bendera yang menunjukkan status berbagai struktur sistem file pada volume exFAT (lihat Tabel 5).

Implementasi tidak boleh mencakup bidang ini saat menghitung checksum wilayah Boot Utama atau Boot Cadangan masing-masing. Jika mengacu pada Sektor Boot Cadangan, implementasi akan memperlakukan bidang ini sebagai basi.

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.
MediaFailure 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.
Dicadangkan 4 12 Bidang ini wajib dan isinya dicadangkan.
3.1.13.1 Bidang ActiveFat

Bidang ActiveFat harus menjelaskan FAT dan Bitmap Alokasi mana yang aktif (dan implementasinya akan digunakan), 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 tidak aktif sebagai basi. Hanya implementasi yang sadar TexFAT yang akan mengalihkan FAT aktif dan Bitmap Alokasi (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 setelah mengalami inkonsistensi metadata sistem file yang tidak mereka 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 MediaFailure

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 telah gagal membaca atau menulis operasi)

Implementasi harus mengatur bidang ini ke 1 ketika:

  1. Media hosting gagal mengakses upaya ke wilayah mana pun dalam volume

  2. Implementasi telah menghabiskan algoritma percobaan kembali 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 Bidang BytePerSectorShift

Bidang BytesPerSectorShift harus menggambarkan 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 SektorPerClusterShift Bidang

Bidang SectorsPerClusterShift harus menggambarkan 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

  • Paling banyak 25 - BytesPerSectorShift, yang mengevaluasi ke ukuran kluster 32MB

3.1.16 Bidang NumberOfFats

Bidang NumberOfFats harus menjelaskan jumlah FAT dan Bitmap Alokasi yang dikandung volume.

Rentang nilai yang valid untuk bidang ini adalah:

  • 1, yang menunjukkan volume hanya berisi Fat Pertama dan Bitmap Alokasi Pertama

  • 2, yang menunjukkan volume berisi FAT Pertama, FAT Kedua, Bitmap Alokasi Pertama, dan Bitmap Alokasi Kedua; nilai ini hanya valid untuk volume TexFAT

3.1.17 DrivePilih Bidang

Bidang DriveSelect harus berisi nomor drive INT 13h yang diperluas, yang membantu boot-strapping 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 PersenInUse

Bidang PercentInUse harus menjelaskan persentase kluster dalam Cluster Heap 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 akan mengubah nilai bidang ini untuk mencerminkan perubahan alokasi kluster dalam Tumpukan Kluster atau harus mengubahnya menjadi FFh.

Implementasi tidak boleh mencakup bidang ini saat menghitung checksum wilayah Boot Utama atau Boot Cadangan masing-masing. Jika mengacu pada Sektor Boot Cadangan, implementasi akan memperlakukan bidang ini sebagai basi.

3.1.19 Bidang BootCode

Bidang BootCode harus berisi instruksi boot-strapping. Implementasi dapat mengisi bidang ini dengan instruksi CPU yang diperlukan untuk boot-strapping sistem komputer. Implementasi yang tidak memberikan instruksi boot-strapping harus menginisialisasi setiap byte di bidang ini ke F4h (instruksi penghentian untuk CPU yang umum di komputer pribadi) sebagai bagian dari operasi format mereka.

3.1.20 Bidang BootSignature

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

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

3.2 Sub-wilayah Utama dan Backup Extended Boot

Setiap sektor Main Extended Boot Sectors memiliki struktur yang sama; namun, setiap sektor dapat 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.

Backup Extended Boot Sectors adalah cadangan dari Sektor Boot Utama yang Diperluas dan memiliki struktur yang sama (lihat Tabel 6).

Sebelum menjalankan instruksi Sektor Boot Utama atau Cadangan yang Diperluas, 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 Diperluas, implementasi dapat memperbarui sektor-sektor ini (dan juga harus memperbarui Boot Checksum masing-masing) sesuai kebutuhan.

Tabel 6 Struktur Sektor Boot Yang Diperluas

Nama Bidang

Offset

(byte)

Ukuran

(Byte)

Komentar
ExtendedBootCode 0 2BytePerSectorShift – 4

Bidang ini wajib dan Bagian 3.2.1 mendefinisikan kontennya.

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

ExtendedBootSignature 2BytePerSectorShift – 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 ExtendedBootCode

Bidang ExtendedBootCode harus berisi instruksi boot-strapping. Implementasi dapat mengisi bidang ini dengan instruksi CPU yang diperlukan untuk boot-strapping 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 ExtendedBootSignature Field

Bidang ExtendedBootSignature harus menjelaskan apakah niat sektor yang diberikan adalah untuk menjadi Sektor Boot Diperpanjang atau tidak.

Nilai yang valid untuk bidang ini adalah AA550000h. Nilai lain dalam bidang ini membatalkan Sektor Boot Utama atau Cadangan yang Diperluas masing-masing. Implementasi harus memverifikasi konten bidang ini sebelum bergantung pada bidang lain di Extended Boot Sector masing-masing.

3.3 Sub-wilayah Parameter OEM Utama dan Cadangan

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.
Dicadangkan 480 2BytePerSectorShift – 480

Bidang ini wajib dan isinya dicadangkan.

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

3.3.1 Parameters[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 akan dijelaskan sebagai berisi struktur Parameter Null (lihat Bagian 3.3.3).

3.3.2 Templat Parameter Generik

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.

Templat Parameter Generik Tabel 8

Nama Bidang

Offset

(byte)

Ukuran

(Byte)

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

Bidang ParametersGuid harus 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 memperoleh struktur parameter kustom dari templat ini.

3.3.3 Parameter Null

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
ParametersGuid 0 16 Bidang ini wajib dan Bagian 3.3.3.1 mendefinisikan kontennya.
Dicadangkan 16 32 Bidang ini wajib dan isinya dicadangkan.
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 lampu kilat 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 durning pemformatan media.

Dukungan untuk struktur Parameter Flash bersifat opsional.

Tabel 10 Struktur Parameter Flash

Nama Bidang

Offset

(byte)

Ukuran

(Byte)

Komentar
ParametersGuid 0 16 Bidang ini wajib dan Bagian 3.3.4.1 mendefinisikan kontennya.
HapusBlockSize 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.
ProgrammingTime 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.
Dicadangkan 44 4 Bidang ini wajib dan isinya dicadangkan.

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

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

3.3.4.3 Bidang Ukuran Halaman

Bidang PageSize akan menjelaskan ukuran, dalam byte halaman media flash.

3.3.4.4 Bidang SpareSectors

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

3.3.4.5 Bidang RandomAccessTime

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

3.3.4.6 Bidang ProgrammingTime

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

3.3.4.7 Bidang Siklus Baca

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

3.3.4.8 Bidang Siklus Tulis

Bidang WriteCycle harus menggambarkan 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 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 checksum empat byte mengisi sub-wilayah Boot Checksum masing-masing dari awal hingga akhir sub-wilayah.

Sebelum menggunakan konten sub-wilayah lain di wilayah Utama atau Boot Cadangan, implementasi harus memverifikasi kontennya dengan memvalidasi Checksum Boot 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 berisi 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 memperlakukan FAT yang tidak aktif sebagai basi. Penggunaan FAT yang tidak aktif dan peralihan antar FAT bersifat spesifik implementasi.

4.1 Sub-wilayah FAT Pertama dan Kedua

FAT harus menjelaskan rantai kluster dalam Cluster Heap (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 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 pernah dapat melebihi FFFFFFF6h.

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

Ruang Berlebih (ClusterCount + 2) * 4 (FatLength * 2BytesPerSectorShift) – ((ClusterCount + 2) * 4)

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

Catatan: Sektor Boot Utama dan Cadangan keduanya 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 akan berisi FFh dalam tiga byte yang tersisa.

Jenis media (byte pertama) harus F8h.

4.1.2 FatEntry[1] Bidang

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 isinya 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 Cluster Heap. FatEntry[2] mewakili kluster pertama dalam Cluster Heap dan FatEntry[ClusterCount+1] mewakili kluster terakhir dalam Cluster Heap.

Rentang nilai yang valid untuk 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 apa pun yang mendahuluinya dalam rantai kluster yang diberikan

  • Tepat FFFFFFF7h, yang menandai kluster yang sesuai dengan FatEntry yang diberikan sebagai "buruk"

  • Tepat FFFFFFFFh, yang menandai 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 tertentu

5 Wilayah Data

Wilayah Data berisi Tumpukan Kluster, yang menyediakan ruang terkelola untuk struktur, direktori, dan file sistem 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 Cluster Heap.

Tabel 12 Struktur Timbunan 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] ... Cluster[ClusterCount+1] Fields

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 nyanyian.

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

Satu atau beberapa entri direktori digabungkan ke dalam set 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 Direktori GenerikEntry

Templat Generic DirectoryEntry menyediakan definisi dasar untuk entri direktori (lihat Tabel 14). Semua struktur entri direktori yang 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 menginterpretasikan templat Generic DirectoryEntry adalah wajib.

Templat Direktori Generik Tabel 14

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
EntryType 0 1 Bidang ini wajib dan Bagian 6.2.1 mendefinisikan kontennya.
CustomDefined 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.
DataLength 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 benar-benar dicadangkan

    • Semua entri direktori berikutnya dalam direktori yang diberikan juga merupakan penanda akhir direktori

    • Penanda akhir direktori hanya valid di luar set entri direktori

    • Implementasi dapat menimpa penanda akhir direktori seperlunya

  • Antara 01 jam dan 7Fh secara inklusif, 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 menimpa entri direktori yang tidak digunakan seperlunya

    • Rentang nilai ini sesuai dengan bidang InUse (lihat Bagian 6.2.1.4) yang berisi nilai 0

  • Antara 81 jam dan FFh secara inklusif, yang merupakan entri direktori reguler 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 set 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
TypeCode 0 5 Bidang ini wajib dan Bagian 6.2.1.1 mendefinisikan kontennya.
TypeImportance 5 1 Bidang ini wajib dan Bagian 6.2.1.2 mendefinisikan kontennya.
TypeCategory 6 1 Bidang ini wajib dan Bagian 6.2.1.3 mendefinisikan kontennya.
InUse 7 1 Bidang ini wajib dan Bagian 6.2.1.4 mendefinisikan kontennya.
6.2.1.1 Bidang TypeCode

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 kritis sekunder penting, masing-masing)

  • 1, yang berarti entri direktori yang diberikan jinak (lihat Bagian 6.3.1.2.2 dan Bagian 6.4.1.2.2 untuk entri direktori primer dan sekunder jinak, masing-masing)

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 kluster pertama alokasi dalam Cluster Heap yang terkait dengan entri direktori yang diberikan.

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 menginterpretasikan 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).

Templat Direktori Utama Generik Tabel 16

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
EntryType 0 1 Bidang ini wajib dan Bagian 6.3.1 mendefinisikan kontennya.
SecondaryCount 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.
CustomDefined 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.
DataLength 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 jinak berisi informasi tambahan yang mungkin berguna untuk mengelola volume exFAT. Direktori apa pun mungkin berisi entri direktori utama yang jinak.

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

6.3.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 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 terdiri dari 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 semua entri direktori 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 EntrySetKomputasiChecksum

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
AllocationPossible 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.
CustomDefined 2 14 Bidang ini wajib dan struktur yang berasal dari templat ini dapat menentukan bidang ini.
6.3.4.1 Bidang AlokasiPossible

Bidang AllocationPossible harus menjelaskan apakah alokasi dalam Tumpukan Kluster dimungkinkan atau tidak 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 sebagaimana didefinisikan

6.3.4.2 Bidang NoFatChain

Bidang NoFatChain akan menunjukkan apakah FAT aktif menjelaskan rantai kluster 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 akan 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 penting yang berasal dari templat ini mendefinisikan ulang bidang GeneralPrimaryFlags, maka entri FAT yang sesuai untuk rantai kluster alokasi terkait valid.

6.3.5 BidangCluster Pertama

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 DataLength

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 Direktori Sekunder Generik

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

Definisi entri direktori sekunder penting dan jinak berkorelasi dengan nomor revisi minor exFAT. Dukungan untuk setiap entri direktori sekunder penting atau jinak spesifikasi ini, atau spesifikasi berikutnya, mendefinisikan bersifat opsional.

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

Tabel 18 Templat Direktori Sekunder Generik

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
EntryType 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.
CustomDefined 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.
DataLength 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)

Bidang TypeCode 6.4.1.1

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

6.4.1.2 Bidang TypeImportance

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 Kritis

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 dikenali merender seluruh set entri direktori 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 Jinak

Entri direktori sekunder jinak berisi informasi tambahan yang mungkin berguna untuk mengelola kumpulan entri direktori yang berisi. Dukungan untuk entri direktori sekunder jinak tertentu bersifat opsional. Entri direktori sekunder jinak yang tidak dikenal tidak merender seluruh set entri direktori 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 GeneralSecondaryFlags Struktur Bidang Generik

Nama Bidang

Offset

(bit)

Ukuran

(bit)

Komentar
AllocationPossible 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.
CustomDefined 2 6 Bidang ini wajib dan struktur yang berasal dari templat ini dapat menentukan bidang ini.
6.4.2.1 Bidang AlokasiPossible

Bidang AllocationPossible harus memiliki definisi yang sama dengan bidang bernama yang sama dalam 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 BidangCluster Pertama

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 DataLength

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 menjelaskan status alokasi kluster; sebaliknya, Bitmap Alokasi tidak. 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 salah satunya menjelaskan Bitmap Alokasi Pertama dan yang lainnya menjelaskan Bitmap Alokasi Kedua.

Tabel 20 Struktur Direktori Bitmap Alokasi

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
EntryType 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.
Dicadangkan 2 18 Bidang ini wajib dan isinya dicadangkan.
FirstCluster 20 4 Bidang ini wajib dan Bagian 7.1.3 mendefinisikan kontennya.
DataLength 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).

Bidang TypeCode 7.1.1.1

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 bidang 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 bidang ini adalah 0.

7.1.1.3 Bidang TypeCategory

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.
Dicadangkan 1 7 Bidang ini wajib dan isinya dicadangkan.
7.1.2.1 Bidang BitmapIdentifier

Bidang BitmapIdentifier akan menunjukkan Bitmap Alokasi mana yang dijelaskan entri direktori yang diberikan. Implementasi akan menggunakan Bitmap Alokasi Pertama bersama dengan FAT Pertama dan akan 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 BidangCluster Pertama

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 kluster, seperti yang dijelaskan 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 merekam status alokasi kluster di 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. Catatan: 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.

Dicadangkan ClusterCount (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 di 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 mendefinisikan 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 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 Tabel Kasus 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.

Table 23 Up-case Table DirectoryEntry Structure

Nama Bidang

Offset

(byte)

Ukuran

(byte)

Komentar
EntryType 0 1 Bidang ini wajib dan Bagian 7.2.1 mendefinisikan kontennya.
Dicadangkan1 1 3 Bidang ini wajib dan isinya dicadangkan.
TableChecksum 4 4 Bidang ini wajib dan Bagian 7.2.2 mendefinisikan kontennya.
Dicadangkan2 8 12 Bidang ini wajib dan isinya dicadangkan.
FirstCluster 20 4 Bidang ini wajib dan Bagian 7.2.3 mendefinisikan kontennya.
DataLength 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 Huruf Besar/Kecil, nilai yang valid untuk bidang ini adalah 2.

7.2.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 Tabel Huruf Besar/Kecil, nilai yang valid untuk bidang ini adalah 0.

7.2.1.3 Bidang TypeCategory

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 (yang dijelaskan 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 Petunjuk Pertama

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 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 up-case adalah serangkaian pemetaan karakter Unicode. Pemetaan karakter terdiri dari bidang 2-byte, dengan indeks bidang dalam tabel up-case yang mewakili karakter Unicode menjadi up-cased, dan bidang 2-byte mewakili karakter Unicode yang diperbarui.

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 akan menggunakan karakter dari rentang pemetaan wajib saat membuat atau mengganti nama file (melalui entri direktori Nama File, lihat Bagian 7.7). Ketika up-casing nama file yang ada, implementasi tersebut tidak akan up-case karakter dari rentang pemetaan non-wajib, tetapi harus membiarkannya utuh dalam nama file yang dihasilkan dari huruf besar/kecil (ini adalah up-casing 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 yang setara. Meskipun nama file tersebut hanya berpotensi setara, implementasi tersebut tidak dapat memastikan nama file yang sepenuhnya ditingkatkan tidak bertabrakan dengan nama di bawah perbandingan.

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 kasus up-identity non-identitas 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 tabel up-case terkompresi berikut:

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

Dua entri pertama menunjukkan 97 (61h) karakter pertama (dari 0000h hingga 0060h) memiliki pemetaan identitas. Karakter berikutnya, masing-masing 0061h hingga 0063h, memetakan ke karakter 0041h hingga 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 bidang TableChecksum selalu sesuai dengan bagaimana tabel up-case ada pada volume, yang mungkin dalam format terkompresi atau tidak dikompresi.

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 terkompresi atau tidak dikompresi, maka tabel tersebut akan mencakup rentang karakter Unicode lengkap (dari kode karakter 0000h hingga FFFFh inklusif).