exFAT 파일 시스템 사양

1 소개

exFAT 파일 시스템은 FAT 파일 시스템 제품군에서 FAT32의 후속 제품입니다. 이 사양은 exFAT 파일 시스템을 설명하고 exFAT 파일 시스템을 구현하는 데 필요한 모든 정보를 제공합니다.

1.1 디자인 목표

exFAT 파일 시스템의 가장 중요한 목표는 세 가지가 있습니다(아래 목록 참조).

  1. FAT 기반 파일 시스템의 단순성을 유지합니다.

    FAT 기반 파일 시스템의 두 가지 강점은 상대적인 단순성과 구현의 용이성입니다. 이전 제품의 명맥을 이어받은 exFAT는 비교적 간단하고 쉽게 구현할 수 있습니다.

  2. 매우 큰 파일 및 스토리지 디바이스를 사용하도록 설정합니다.

    exFAT 파일 시스템은 64비트를 사용하여 파일 크기를 설명하므로 매우 큰 파일에 의존하는 애플리케이션을 사용할 수 있습니다. exFAT 파일 시스템은 32MB의 큰 클러스터를 허용하므로 매우 큰 스토리지 디바이스를 효과적으로 사용할 수 있습니다.

  3. 향후 혁신을 위한 확장성을 통합합니다.

    exFAT 파일 시스템은 확장성을 디자인에 통합하여 파일 시스템이 스토리지의 혁신과 사용량의 변화를 따라가도록 합니다.

1.2 특정 용어

이 사양의 컨텍스트에서 특정 용어(표 1 참조)는 exFAT 파일 시스템의 디자인 및 구현에 있어서 특정한 의미를 지니고 있습니다.

표 1 매우 특정한 의미를 포함하는 용어의 정의

기간 정의
해야 한다 이 사양은 필수 행위를 설명할 때 "해야 한다"라는 용어를 사용합니다.
하는 것이 좋다 이 사양은 강력하게 권장하지만 필수는 아닌 행위를 설명할 때 "하는 것이 좋다"라는 용어를 사용합니다.
5월 이 사양은 선택적 행위를 설명할 때 "할 수 있다"라는 용어를 사용합니다.
필수 이 용어는 이 사양에 설명된 대로 구현이 수정해야 하고 해석해야 하는 필드 또는 구조를 설명합니다.
선택 사항 이 용어는 구현이 지원하거나 지원하지 않을 수 있는 필드 또는 구조에 대해 설명합니다. 구현이 특정한 선택적 필드 또는 구조를 지원하는 경우 이 사양에 설명된 대로 필드 또는 구조를 수정하고 해석해야 합니다.
정의되지 않음 이 용어는 구현이 필요에 따라 수정할 수 있고(예: 주변 필드 또는 구조를 설정할 때 0이 되도록 지우기) 특정한 의미를 지닌 것으로 해석하지 않아야 하는 필드 또는 구조 콘텐츠를 설명합니다.
예약됨

이 용어는 다음에 해당하는 필드 또는 구조 콘텐츠를 설명합니다.

  1. 구현이 0으로 초기화해야 하며 어떤 목적으로도 사용하지 않아야 합니다.

  2. 구현이 체크섬을 계산하는 경우를 제외하고 해석하지 않는 것이 좋습니다.

  3. 구현이 주변 필드 또는 구조를 수정하는 작업 전반에 걸쳐 보존해야 합니다.

1.3 일반 머리글자어의 전체 텍스트

이 사양은 개인용 컴퓨터 업계에서 일반적으로 사용되는 머리글자어를 사용합니다(표 2 참조).

표 2 일반 머리글자어의 전체 텍스트

머리글자어 전체 텍스트
ASCII American Standard Code for Information Interchange
BIOS Basic Input Output System
CPU Central Processing Unit
exFAT extensible File Allocation Table
FAT File Allocation Table
FAT12 File Allocation Table, 12비트 클러스터 인덱스
FAT16 File Allocation Table, 16비트 클러스터 인덱스
FAT32 File Allocation Table, 32비트 클러스터 인덱스
GPT GUID 파티션 테이블
GUID Globally Unique Identifier(섹션 10.1 참조)
INT Interrupt
MBR 마스터 부트 레코드
texFAT Transaction-safe exFAT
UTC 협정 세계시

1.4 기본 필드 및 구조 한정자

이 사양의 필드 및 구조에는 달리 명시되지 않는 한 다음과 같은 한정자(아래 목록 참조)가 있습니다.

  1. 부호가 없습니다.

  2. 10진수 표기법을 사용하여 값을 설명합니다(달리 명시되지 않은 경우). 이 사양은 후위 문자 "h"를 사용하여 16진수를 나타내고 GUID를 중괄호로 묶습니다.

  3. Little-Endian 형식입니다.

  4. 문자열에 null 종료 문자가 필요하지 않습니다.

1.5 Windows CE 및 TexFAT

TexFAT는 exFAT에 대한 확장으로, 기본 파일 시스템 위에 트랜잭션에 안전한 운영 의미 체계를 추가합니다. TexFAT는 Windows CE에서 사용됩니다. TexFAT는 트랜잭션에서 사용할 두 개의 FAT 및 할당 비트맵을 필요로 합니다. 또한 안쪽 여백 설명자 및 보안 설명자를 포함하여 몇 가지 추가 구조를 정의합니다.

2 볼륨 구조

볼륨은 사용자 데이터를 저장하고 검색하는 데 필요한 모든 파일 시스템 구조 및 데이터 공간의 집합입니다. 모든 exFAT 볼륨에는 4개의 영역이 포함됩니다(표 3 참조).

표 3 볼륨 구조

하위 영역 이름

Offset

(섹터)

크기

(섹터)

설명
메인 부팅 영역
Main Boot Sector 0 1 이 하위 영역은 필수이며 해당 콘텐츠는 섹션 3.1에 정의되어 있습니다.
Main Extended Boot Sectors 1 8 이 하위 영역은 필수이며 해당 콘텐츠는 섹션 3.2에 정의되어 있습니다.
Main OEM Parameters 9 1 이 하위 영역은 필수이며 해당 콘텐츠는 섹션 3.3에 정의되어 있습니다.
Main Reserved 10 1 이 하위 영역은 필수이며 해당 콘텐츠는 예약되어 있습니다.
Main Boot Checksum 11 1 이 하위 영역은 필수이며 해당 콘텐츠는 섹션 3.4에 정의되어 있습니다.
백업 부팅 영역
Backup Boot Sector 12 1 이 하위 영역은 필수이며 해당 콘텐츠는 섹션 3.1에 정의되어 있습니다.
Backup Extended Boot Sectors 13 8 이 하위 영역은 필수이며 해당 콘텐츠는 섹션 3.2에 정의되어 있습니다.
Backup OEM Parameters 21 1 이 하위 영역은 필수이며 해당 콘텐츠는 섹션 3.3에 정의되어 있습니다.
Backup Reserved 22 1 이 하위 영역은 필수이며 해당 콘텐츠는 예약되어 있습니다.
Backup Boot Checksum 23 1 이 하위 영역은 필수이며 해당 콘텐츠는 섹션 3.4에 정의되어 있습니다.
FAT 영역
FAT 맞춤 24 FatOffset – 24

이 하위 영역은 필수이며 해당 콘텐츠(있는 경우)는 정의되어 있지 않습니다.

참고: Main 및 Backup Boot Sector에는 모두 FatOffset 필드가 포함됩니다.

첫 번째 FAT FatOffset FatLength

이 하위 영역은 필수이며 해당 콘텐츠는 섹션 4.1에 정의되어 있습니다.

참고: Main 및 Backup Boot Sector에는 모두 FatOffset 및 FatLength 필드가 포함됩니다.

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

이 하위 영역은 필수이며 해당 콘텐츠(있는 경우)는 섹션 4.1에 정의되어 있습니다.

참고: Main 및 Backup Boot Sector에는 모두 FatOffset, FatLength 및 NumberOfFats 필드가 포함됩니다. NumberOfFats 필드에는 1과 2 값만 포함될 수 있습니다.

데이터 영역
Cluster Heap Alignment FatOffset + FatLength * NumberOfFats ClusterHeapOffset – (FatOffset + FatLength * NumberOfFats)

이 하위 영역은 필수이며 해당 콘텐츠(있는 경우)는 정의되어 있지 않습니다.

참고: Main 및 Backup Boot Sector에는 모두 FatOffset, FatLength, NumberOfFats 및 ClusterHeapOffset 필드가 포함됩니다. NumberOfFats 필드의 유효한 값은 1과 2입니다.

Cluster Heap ClusterHeapOffset ClusterCount * 2SectorsPerClusterShift

이 하위 영역은 필수이며 해당 콘텐츠는 섹션 5.1에 정의되어 있습니다.

참고: Main 및 Backup Boot Sector에는 모두 ClusterHeapOffset, ClusterCount 및 SectorsPerClusterShift 필드가 포함됩니다.

Excess Space ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift VolumeLength – (ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift)

이 하위 영역은 필수이며 해당 콘텐츠(있는 경우)는 정의되어 있지 않습니다.

참고: Main 및 Backup Boot Sector에는 모두 ClusterHeapOffset, ClusterCount, SectorsPerClusterShift 및 VolumeLength 필드가 포함됩니다.

메인 및 백업 부팅 영역 3개

메인 부팅 영역은 구현이 다음을 수행할 수 있도록 필요한 모든 부트스트래핑 명령, 식별 정보 및 파일 시스템 매개 변수를 제공합니다.

  1. exFAT 볼륨에서 컴퓨터 시스템을 부트스트랩합니다.

  2. 볼륨의 파일 시스템을 exFAT로 식별합니다.

  3. exFAT 파일 시스템 구조의 위치를 검색합니다.

백업 부팅 영역은 메인 부팅 영역의 백업입니다. 메인 부팅 영역이 일관성 없는 상태인 경우 exFAT 볼륨의 복구를 지원합니다. 부트스트래핑 명령을 업데이트하는 경우와 같은 드문 경우를 제외하고 구현은 백업 부팅 영역의 콘텐츠를 수정하지 않는 것이 좋습니다.

3.1 Main 및 Backup Boot Sector 하위 영역

Main Boot Sector에는 exFAT 볼륨의 부트스트래핑 코드와 볼륨 구조를 설명하는 기본 exFAT 매개 변수가 포함되어 있습니다(표 4 참조). BIOS, MBR 또는 기타 부트스트래핑 에이전트가 이 섹터를 검사할 수 있으며, 그 안에 포함된 부트스트래핑 명령을 로드하고 실행할 수 있습니다.

Backup Boot Sector는 Main Boot Sector의 백업이며 구조가 동일합니다(표 4 참조). Backup Boot Sector는 복구 작업을 지원할 수 있습니다. 그러나 구현은 VolumeFlags 및 PercentInUse 필드의 콘텐츠를 부실한 것으로 처리해야 합니다.

메인 또는 Backup Boot Sector의 콘텐츠를 사용하기 전에 구현은 해당 부팅 체크섬의 유효성을 검사하고 모든 필드가 유효한 값 범위 내에 있는지 확인하는 방식으로 콘텐츠를 확인해야 합니다.

초기 형식 작업은 Main 및 Backup Boot Sector 모두의 콘텐츠를 초기화하지만 구현은 필요에 따라 이러한 섹터를 업데이트할 수 있으며 해당 부팅 체크섬도 업데이트해야 합니다. 그러나 구현은 해당 부팅 체크섬을 업데이트하지 않고 VolumeFlags 또는 PercentInUse 필드를 업데이트할 수 있습니다(체크섬에서는 이러한 두 필드를 특별히 제외함).

표 4 Main 및 Backup Boot Sector 구조

필드 이름

Offset

(바이트)

크기

(바이트)

설명
JumpBoot 0 3 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.1에 정의되어 있습니다.
FileSystemName 3 8 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.2에 정의되어 있습니다.
MustBeZero 11 53 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.3에 정의되어 있습니다.
PartitionOffset 64 8 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.4에 정의되어 있습니다.
VolumeLength 72 8 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.5에 정의되어 있습니다.
FatOffset 80 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.6에 정의되어 있습니다.
FatLength 84 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.7에 정의되어 있습니다.
ClusterHeapOffset 88 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.8에 정의되어 있습니다.
ClusterCount 92 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.9에 정의되어 있습니다.
FirstClusterOfRootDirectory 96 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.10에 정의되어 있습니다.
VolumeSerialNumber 100 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.11에 정의되어 있습니다.
FileSystemRevision 104 2 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.12에 정의되어 있습니다.
VolumeFlags 106 2 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.13에 정의되어 있습니다.
BytesPerSectorShift 108 1 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.14에 정의되어 있습니다.
SectorsPerClusterShift 109 1 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.15에 정의되어 있습니다.
NumberOfFats 110 1 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.16에 정의되어 있습니다.
DriveSelect 111 1 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.17에 정의되어 있습니다.
PercentInUse 112 1 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.18에 정의되어 있습니다.
예약됨 113 7 이 필드는 필수이며 해당 콘텐츠는 예약되어 있습니다.
BootCode 120 390 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.19에 정의되어 있습니다.
BootSignature 510 2 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.20에 정의되어 있습니다.
ExcessSpace 512 2BytesPerSectorShift – 512

이 필드는 필수이며 해당 콘텐츠(있는 경우)는 정의되어 있지 않습니다.

참고: Main 및 Backup Boot Sector에는 모두 BytesPerSectorShift 필드가 포함됩니다.

3.1.1 JumpBoot 필드

JumpBoot 필드에는 개인용 컴퓨터에서 일반적인 CPU에 대한 점프 명령이 포함되어야 합니다. 이 명령을 실행하면 CPU를 "점프"하여 BootCode 필드의 부트스트래핑 명령을 실행합니다.

이 필드에 유효한 값은 EBh 76h 90h(저차 바이트에서 고차 바이트 순서)입니다.

3.1.2 FileSystemName 필드

FileSystemName 필드에는 볼륨의 파일 시스템 이름이 포함되어야 합니다.

이 필드에 유효한 값은 ASCII 문자로 "EXFAT"이며, 여기에는 세 개의 후행 공백이 포함됩니다.

3.1.3 MustBeZero 필드

MustBeZero 필드는 FAT12/16/32 볼륨에서 압축된 BIOS 매개 변수 블록이 사용하는 바이트 범위와 직접 일치해야 합니다.

이 필드에 유효한 값은 0으로, FAT12/16/32 구현이 exFAT 볼륨을 실수로 탑재하지 못하도록 하는 데 도움이 됩니다.

3.1.4 PartitionOffset 필드

PartitionOffset 필드는 지정된 exFAT 볼륨을 호스트하는 파티션의 미디어 상대 섹터 오프셋을 설명해야 합니다. 이 필드는 개인용 컴퓨터에서 확장된 INT 13h를 사용한 볼륨의 부트스트래핑을 지원합니다.

이 필드에 사용할 수 있는 모든 값은 유효합니다. 그러나 값 0은 구현이 이 필드를 무시해야 함을 나타냅니다.

3.1.5 VolumeLength 필드

VolumeLength 필드는 섹터에서 지정된 exFAT 볼륨의 크기를 설명해야 합니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 최소 220/ 2BytesPerSectorShift. 가장 작은 볼륨이 1MB 이상인지 확인합니다.

  • 최대 264- 1. 이 필드에서 설명할 수 있는 가장 큰 값입니다.

    그러나 Excess Space 하위 영역의 크기가 0인 경우 이 필드의 가장 큰 값은 ClusterHeapOffset + (232- 11) * 2SectorsPerClusterShift입니다.

3.1.6 FatOffset 필드

FatOffset 필드는 첫 번째 FAT의 볼륨 상대 섹터 오프셋을 설명해야 합니다. 이 필드를 사용하면 구현에서 첫 번째 FAT를 기본 스토리지 미디어의 특성에 맞출 수 있습니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 최소 24. 이는 메인 부팅 및 백업 부팅 영역에서 사용하는 섹터를 설명합니다.

  • 최대 ClusterHeapOffset - (FatLength * NumberOfFats). 이는 Cluster Heap에서 사용하는 섹터를 설명합니다.

3.1.7 FatLength Field

FatLength 필드는 각 FAT 테이블의 길이(섹터)를 설명해야 합니다(볼륨에 최대 2개의 FAT가 포함될 수 있음).

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 최소 (ClusterCount + 2) * 22/ 2BytesPerSectorShift(가장 가까운 정수로 올림). 이는 각 FAT가 Cluster Heap의 모든 클러스터를 설명할 수 있는 충분한 공간을 확보하도록 합니다.

  • 최대 ClusterHeapOffset - FatOffset) / NumberOfFats(가장 가까운 정수로 버림). 이는 FAT가 Cluster Heap 앞에 있도록 합니다.

이 필드에는 Second FAT(있는 경우)도 기본 스토리지 미디어의 특성에 맞출 수 있도록 하한을 초과하는 값이 포함되어 있을 수 있습니다. FAT 자체에 필요한 것(있는 경우)을 초과하는 공간의 콘텐츠는 정의되지 않습니다.

3.1.8 ClusterHeapOffset 필드

ClusterHeapOffset 필드는 Cluster Heap의 볼륨 상대 섹터 오프셋을 설명해야 합니다. 이 필드를 사용하면 구현에서 Cluster Heap을 기본 스토리지 미디어의 특성에 맞출 수 있습니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 최소 FatOffset + FatLength * NumberOfFats. 이는 이전의 모든 영역에서 사용하는 섹터를 설명합니다.

  • 최대 232- 1 또는 VolumeLength - (ClusterCount * 2SectorsPerClusterShift)(둘 중 더 작은 값)

3.1.9 ClusterCount 필드

ClusterCount 필드는 Cluster Heap에 포함된 클러스터 수를 설명해야 합니다.

이 필드에 유효한 값은 다음 중 더 작은 값이어야 합니다.

  • (VolumeLength - ClusterHeapOffset) / 2SectorsPerClusterShift(가장 가까운 정수로 내림). 이는 정확히 Cluster Heap의 시작 부분과 볼륨의 끝 부분 사이에 맞을 수 있는 클러스터 수입니다.

  • 232- 11. 이는 FAT에서 설명할 수 있는 최대 클러스터 수입니다.

ClusterCount 필드의 값에 따라 FAT의 최소 크기가 결정됩니다. 매우 큰 FAT를 방지하기 위해 구현은 SectorsPerClusterShift 필드를 통해 클러스터 크기를 늘려 Cluster Heap의 클러스터 수를 제어할 수 있습니다. 이 사양은 Cluster Heap에 224- 2개 이하의 클러스터를 권장합니다. 그러나 구현은 Cluster Heap에서 최대 232- 11개 클러스터로 볼륨을 처리할 수 있어야 합니다.

3.1.10 FirstClusterOfRootDirectory 필드

FirstClusterOfRootDirectory 필드에는 루트 디렉터리의 첫 번째 클러스터의 클러스터 인덱스가 포함되어야 합니다. 구현은 Allocation Bitmap 및 Up-case Table이 사용하는 클러스터 이후 첫 번째 정상 클러스터에 루트 디렉터리의 첫 번째 클러스터를 배치하는 데 모든 노력을 기울이는 것이 좋습니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 최소 2. Cluster Heap에 있는 첫 번째 클러스터의 인덱스

  • 최대 ClusterCount + 1. Cluster Heap의 마지막 클러스터 인덱스

3.1.11 VolumeSerialNumber 필드

VolumeSerialNumber 필드에는 고유한 일련 번호가 포함되어야 합니다. 이렇게 하면 구현이 서로 다른 exFAT 볼륨을 구분할 수 있습니다. 구현은 exFAT 볼륨의 서식을 지정하는 날짜와 시간을 결합하여 일련 번호를 생성해야 합니다. 날짜와 시간을 결합하여 일련 번호를 형성하는 메커니즘은 구현에 따라 다릅니다.

이 필드에 사용할 수 있는 모든 값은 유효합니다.

3.1.12 FileSystemRevision 필드

FileSystemRevision 필드는 지정된 볼륨에 있는 exFAT 구조의 주 및 부 수정 번호를 설명해야 합니다.

고차 바이트는 주 수정 버전 번호이고 저차 바이트는 부 수정 번호입니다. 예를 들어 고차 바이트에 값 01h가 포함되어 있고 저차 바이트에 값 05h가 포함된 경우 FileSystemRevision 필드는 수정 번호 1.05를 설명합니다. 마찬가지로 고차 바이트에 값 0Ah가 포함되어 있고 저차 바이트에 값 0Fh가 포함된 경우 FileSystemRevision 필드는 수정 번호 10.15를 설명합니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 저차 바이트의 경우 최소 0, 고차 바이트의 경우 최소 1

  • 저차 바이트의 경우 최대 99, 고차 바이트의 경우 최대 99

이 사양에서 설명하는 exFAT의 수정 번호는 1.00입니다. 이 사양의 구현은 주 수정 번호가 1인 exFAT 볼륨을 탑재하는 것이 좋으며, 다른 주 수정 번호가 있는 exFAT 볼륨을 탑재하지 않아야 합니다. 구현은 부 수정 번호를 따라야 하며, 작업을 수행하거나 지정된 부 수정 번호의 해당 사양에 설명되지 않은 파일 시스템 구조를 만들지 않아야 합니다.

3.1.13 VolumeFlags 필드

VolumeFlags 필드에는 exFAT 볼륨의 다양한 파일 시스템 구조 상태를 나타내는 플래그가 포함되어야 합니다(표 5 참조).

각 메인 부팅 또는 백업 부팅 영역 체크섬을 계산할 때는 구현에 이 필드가 포함되지 않습니다. Backup Boot Sector를 참조할 때 구현은 이 필드를 부실한 것으로 처리해야 합니다.

표 5 VolumeFlags 필드 구조

필드 이름

Offset

(비트)

크기

(비트)

설명
ActiveFat 0 1 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.13.1에 정의되어 있습니다.
VolumeDirty 1 1 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.13.2에 정의되어 있습니다.
MediaFailure 2 1 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.13.3에 정의되어 있습니다.
ClearToZero 3 1 이 필드는 필수이며 해당 콘텐츠는 섹션 3.1.13.4에 정의되어 있습니다.
예약됨 4 12 이 필드는 필수이며 해당 콘텐츠는 예약되어 있습니다.
3.1.13.1 ActiveFat 필드

ActiveFat 필드는 다음과 같이 활성 상태이고 구현에서 사용해야 하는 FAT 및 할당 비트맵을 설명해야 합니다.

  • 0. 이는 First FAT 및 First Allocation Bitmap이 활성화되어 있음을 의미합니다.

  • 1. 이는 Second FAT 및 Second Allocation Bitmap이 활성화되어 있음을 의미하며 NumberOfFats 필드에 값 2가 포함된 경우에만 가능합니다.

구현은 비활성 FAT 및 할당 비트맵을 부실한 것으로 간주해야 합니다. TexFAT 인식 구현만 활성 FAT 및 할당 비트맵을 전환해야 합니다(섹션 7.1 참조).

3.1.13.2 VolumeDirty 필드

VolumeDirty 필드는 다음과 같이 볼륨이 더티인지 여부를 설명해야 합니다.

  • 0. 이는 볼륨이 일관성 있는 상태임을 의미합니다.

  • 1. 이는 볼륨이 일관성 없는 상태임을 의미합니다.

구현은 해결되지 않는 파일 시스템 메타데이터 불일치가 발견될 경우 이 필드의 값을 1로 설정하는 것이 좋습니다. 볼륨을 탑재할 때 이 필드의 값이 1이면 파일 시스템 메타데이터 불일치를 해결하는 구현만 이 필드의 값을 지우고 0으로 만들 수 있습니다. 이러한 구현은 파일 시스템이 일관된 상태인지 확인한 후에만 이 필드의 값을 지워서 0으로 만들어야 합니다.

볼륨을 탑재할 때 이 필드의 값이 0인 경우 구현은 파일 시스템 메타데이터를 업데이트하기 전에 이 필드를 1로 설정하고, 나중에 이 필드를 섹션 8.1에 설명된 권장 쓰기 순서와 유사하게 0이 되도록 지워야 합니다.

3.1.13.3 MediaFailure 필드

MediaFailure 필드는 다음과 같이 구현에서 미디어 오류를 발견했는지 여부를 설명해야 합니다.

  • 0. 이는 호스팅 미디어가 오류를 보고하지 않았거나 알려진 오류가 FAT에 이미 "불량" 클러스터로 기록되었음을 의미합니다.

  • 1. 이는 호스팅 미디어가 오류를 보고했음을 의미합니다(즉, 읽기 또는 쓰기 작업에 실패).

구현은 다음과 같은 경우 이 필드를 1로 설정하는 것이 좋습니다.

  1. 볼륨의 모든 영역에 대한 호스팅 미디어의 액세스 시도가 실패하는 경우

  2. 구현에 액세스 재시도 알고리즘(있는 경우)을 모두 사용한 경우

볼륨을 탑재할 때 이 필드의 값이 1이면 전체 볼륨에서 미디어 오류를 검사하고 모든 오류를 FAT에 "불량" 클러스터로 기록하거나 미디어 오류를 해결하는 구현은 이 필드의 값을 지우고 0으로 만들 수 있습니다.

3.1.13.4 ClearToZero 필드

ClearToZero 필드는 이 사양에서 큰 의미가 없습니다.

이 필드에 유효한 값은 다음과 같습니다.

  • 0. 이는 특별한 의미가 없습니다.

  • 1. 이는 구현이 파일 시스템 구조, 디렉터리 또는 파일을 수정하기 전에 이 필드를 지우고 0으로 만드는 것이 좋음을 의미합니다.

3.1.14 BytesPerSectorShift 필드

BytesPerSectorShift 필드는 log2(N)로 표현된 섹터당 바이트를 설명하는 것이 좋습니다. 여기서 N은 섹터당 바이트 수입니다. 예를 들어 섹터당 512바이트인 경우 이 필드의 값은 9입니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 최소 9(섹터 크기 512바이트). 이는 exFAT 볼륨에 가능한 가장 작은 섹터입니다.

  • 최대 12(섹터 크기 4096바이트). 이는 개인용 컴퓨터에서 일반적인 CPU의 메모리 페이지 크기입니다.

3.1.15 SectorsPerClusterShift 필드

SectorsPerClusterShift 필드는 log2(N)로 표현된 클러스터당 섹터를 설명해야 합니다. 여기서 N은 클러스터당 섹터 수입니다. 예를 들어 클러스터당 8개 섹터의 경우 이 필드의 값은 3입니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 최소 0(클러스터당 1개 섹터). 이는 가능한 가장 작은 클러스터입니다.

  • 최대 25 - BytesPerSectorShift. 이는 클러스터 크기 32MB로 평가됩니다.

3.1.16 NumberOfFats 필드

NumberOfFats 필드는 볼륨에 포함된 FAT 및 Allocation Bitmap 수를 설명해야 합니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 1. 이는 볼륨에 First FAT 및 First Allocation Bitmap만 포함됨을 나타냅니다.

  • 2. 이는 볼륨에 First FAT, Second FAT, First Allocation Bitmap 및 Second Allocation Bitmap이 포함됨을 나타냅니다. 이 값은 TexFAT 볼륨에만 유효합니다.

3.1.17 DriveSelect 필드

DriveSelect 필드에는 개인용 컴퓨터에서 확장된 INT 13h를 사용하여 이 볼륨의 부트스트래핑을 지원하는 확장된 INT 13h 드라이브 번호가 포함되어야 합니다.

이 필드에 사용할 수 있는 모든 값은 유효합니다. 이전 FAT 기반 파일 시스템의 유사한 필드에는 80h 값이 포함된 경우가 많습니다.

3.1.18 PercentInUse 필드

PercentInUse 필드는 할당된 Cluster Heap의 클러스터 비율을 설명해야 합니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 0~100(포함). 이는 Cluster Heap에 할당된 클러스터의 비율로, 가장 가까운 정수로 내림됩니다.

  • 정확히 FFh. 이는 Cluster Heap에 할당된 클러스터의 비율을 사용할 수 없음을 나타냅니다.

구현은 Cluster Heap의 클러스터 할당 변경 내용을 반영하도록 이 필드의 값을 변경하거나 FFh로 변경해야 합니다.

각 메인 부팅 또는 백업 부팅 영역 체크섬을 계산할 때는 구현에 이 필드가 포함되지 않습니다. Backup Boot Sector를 참조할 때 구현은 이 필드를 부실한 것으로 처리해야 합니다.

3.1.19 BootCode 필드

BootCode 필드에는 부트스트래핑 명령이 포함되어야 합니다. 구현은 컴퓨터 시스템을 부트스트랩하는 데 필요한 CPU 명령으로 이 필드를 채울 수 있습니다. 부트스트래핑 명령을 제공하지 않는 구현은 포맷 작업 중에 이 필드의 각 바이트를 F4h(개인용 컴퓨터에서 일반적인 CPU에 대한 중지 명령)로 초기화해야 합니다.

3.1.20 BootSignature 필드

BootSignature 필드는 지정된 섹터의 의도가 Boot Sector가 되는 것인지 여부를 설명해야 합니다.

이 필드에 유효한 값은 AA55h입니다. 이 필드의 다른 모든 값은 해당 Boot Sector를 무효화합니다. 구현은 해당 Boot Sector의 다른 필드에 따라 이전에 이 필드의 콘텐츠를 확인해야 합니다.

3.2 Main 및 Backup Extended Boot Sectors 하위 영역

Main Extended Boot Sectors의 각 섹터는 구조가 동일합니다. 그러나 각 섹터에는 고유한 부트스트래핑 명령이 포함될 수 있습니다(표 6 참조). Main Boot Sector의 부트스트래핑 명령, 대체 BIOS 구현 또는 임베디드 시스템의 펌웨어와 같은 부트스트래핑 에이전트는 이러한 섹터를 로드하고 포함된 명령을 실행할 수 있습니다.

Backup Extended Boot Sectors는 Main Extended Boot Sectors의 백업이며 구조가 동일합니다(표 6 참조).

구현은 Main 또는 Backup Extended Boot Sectors의 명령을 실행하기 전에 각 섹터의 ExtendedBootSignature 필드에 규정된 값이 포함되어 있는지 확인하여 콘텐츠를 확인하는 것이 좋습니다.

초기 형식 작업은 Main 및 Backup Extended Boot Sector 모두의 콘텐츠를 초기화하지만 구현은 필요에 따라 이러한 섹터를 업데이트할 수 있으며 해당 부팅 체크섬도 업데이트해야 합니다.

표 6 Extended Boot Sector 구조

필드 이름

Offset

(바이트)

크기

(바이트)

설명
ExtendedBootCode 0 2BytesPerSectorShift – 4

이 필드는 필수이며 해당 콘텐츠는 섹션 3.2.1에 정의되어 있습니다.

참고: Main 및 Backup Boot Sector에는 모두 BytesPerSectorShift 필드가 포함됩니다.

ExtendedBootSignature 2BytesPerSectorShift – 4 4

이 필드는 필수이며 해당 콘텐츠는 섹션 3.2.2에 정의되어 있습니다.

참고: Main 및 Backup Boot Sector에는 모두 BytesPerSectorShift 필드가 포함됩니다.

3.2.1 ExtendedBootCode 필드

ExtendedBootCode 필드에는 부트스트래핑 명령이 포함되어야 합니다. 구현은 컴퓨터 시스템을 부트스트랩하는 데 필요한 CPU 명령으로 이 필드를 채울 수 있습니다. 부트스트래핑 명령을 제공하지 않는 구현은 포맷 작업 중에 이 필드의 각 바이트를 00h로 초기화해야 합니다.

3.2.2 ExtendedBootSignature 필드

ExtendedBootSignature 필드는 지정된 섹터의 의도가 Extended Boot Sector가 되는 것인지 여부를 설명해야 합니다.

이 필드에 유효한 값은 AA550000h입니다. 이 필드의 다른 모든 값은 해당 Main 또는 Backup Extended Boot Sector를 무효화합니다. 구현은 해당 Extended Boot Sector의 다른 필드에 따라 이전에 이 필드의 콘텐츠를 확인해야 합니다.

3.3 Main 및 Backup OEM Parameters 하위 영역

Main OEM Parameters 하위 영역에는 제조업체별 정보를 포함할 수 있는 10개의 매개 변수 구조가 포함되어 있습니다(표 7 참조). 10개의 매개 변수 구조는 각각 Generic Parameters 템플릿에서 파생됩니다(섹션 3.3.2 참조). 제조업체는 Generic Parameters 템플릿에서 고유한 사용자 지정 매개 변수 구조를 파생시킬 수 있습니다. 이 사양 자체는 Null Parameters(섹션 3.3.3 참조) 및 Flash Parameters(섹션 3.3.4 참조)의 두 매개 변수 구조를 정의합니다.

Backup OEM Parameters는 Main OEM Parameters의 백업이며 구조가 동일합니다(표 7 참조).

구현은 Main 또는 Backup OEM Parameters의 콘텐츠를 사용하기 전에 해당 Boot Checksum의 유효성을 검사하여 해당 콘텐츠를 확인해야 합니다.

제조업체는 Main 및 Backup OEM Parameters를 고유한 사용자 지정 매개 변수 구조(있는 경우) 및 기타 매개 변수 구조로 채우는 것이 좋습니다. 후속 포맷 작업은 Main 및 Backup OEM Parameters의 콘텐츠를 보존해야 합니다.

구현은 필요에 따라 Main 및 Backup OEM Parameters를 업데이트할 수 있으며 해당 Boot Checksum도 업데이트해야 합니다.

표 7 OEM Parameters 구조

필드 이름

Offset

(바이트)

크기

(바이트)

설명
Parameters[0] 0 48 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.1에 정의되어 있습니다.

.

.

.

.

.

.

.

.

.

.

.

.

Parameters[9] 432 48 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.1에 정의되어 있습니다.
예약됨 480 2BytesPerSectorShift – 480

이 필드는 필수이며 해당 콘텐츠는 예약되어 있습니다.

참고: Main 및 Backup Boot Sector에는 모두 BytesPerSectorShift 필드가 포함됩니다.

3.3.1 Parameters[0] ... Parameters[9]

이 배열의 각 Parameters 필드에는 Generic Parameters 템플릿에서 파생되는 매개 변수 구조가 포함됩니다(섹션 3.3.2 참조). 사용되지 않는 모든 Parameters 필드는 Null Parameters 구조를 포함하는 것으로 설명되어야 합니다(섹션 3.3.3 참조).

3.3.2 Generic Parameters 템플릿

Generic Parameters 템플릿은 매개 변수 구조의 기본 정의를 제공합니다(표 8 참조). 모든 매개 변수 구조는 이 템플릿에서 파생됩니다. 이 Generic Parameters 템플릿에 대한 지원은 필수입니다.

표 8 Generic Parameters 템플릿

필드 이름

Offset

(바이트)

크기

(바이트)

설명
ParametersGuid 0 16 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.2.1에 정의되어 있습니다.
CustomDefined 16 32 이 필드는 필수이며 해당 콘텐츠는 이 템플릿에서 파생되는 구조가 정의합니다.
3.3.2.1 ParametersGuid 필드

ParametersGuid 필드는 지정된 매개 변수 구조의 나머지 부분의 레이아웃을 결정하는 GUID를 설명해야 합니다.

이 필드에 사용할 수 있는 모든 값은 유효합니다. 그러나 제조업체는 이 템플릿에서 사용자 지정 매개 변수 구조를 파생시킬 때 GuidGen.exe 같은 GUID 생성 도구를 사용하여 GUID를 선택하는 것이 좋습니다.

3.3.3 Null Parameters

Null Parameters 구조는 Generic Parameters 템플릿(섹션 3.3.2 참조)에서 파생되며 사용되지 않는 Parameters 필드를 설명해야 합니다(표 9 참조). 구현은 OEM Parameters 구조를 만들거나 업데이트할 때 사용되지 않는 Parameters 필드를 Null Parameters 구조로 채워야 합니다. 또한 구현은 OEM Parameters 구조를 만들거나 업데이트할 때 배열의 끝에 Null Parameters 구조를 통합하여 다른 모든 Parameters 구조를 OEM Parameters 구조의 시작 부분에 두는 것이 좋습니다.

Null Parameters 구조에 대한 지원은 필수입니다.

표 9 Null Parameters 구조

필드 이름

Offset

(바이트)

크기

(바이트)

설명
ParametersGuid 0 16 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.3.1에 정의되어 있습니다.
예약됨 16 32 이 필드는 필수이며 해당 콘텐츠는 예약되어 있습니다.
3.3.3.1 ParametersGuid 필드

ParametersGuid 필드는 Generic Parameters 템플릿이 제공하는 정의를 준수해야 합니다(섹션 3.3.2.1 참조).

GUID 표기법으로 이 필드에 유효한 값은 {00000000-0000-0000-0000-000000000000}입니다.

3.3.4 Flash Parameters

Flash Parameter 구조는 Generic Parameters 템플릿(섹션 3.3.2 참조)에서 파생되며 플래시 미디어에 대한 매개 변수를 포함합니다(표 10 참조). 플래시 기반 스토리지 디바이스 제조업체는 Parameters 필드(Parameters[0] 필드 권장)를 이 매개 변수 구조로 채울 수 있습니다. 구현은 읽기/쓰기 중에 액세스 작업을 최적화하고 미디어 포맷 중에 파일 시스템 구조를 정렬하기 위해 Flash Parameters 구조의 정보를 사용할 수 있습니다.

Flash Parameters 구조에 대한 지원은 선택 사항입니다.

표 10 Flash Parameters 구조

필드 이름

Offset

(바이트)

크기

(바이트)

설명
ParametersGuid 0 16 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.4.1에 정의되어 있습니다.
EraseBlockSize 16 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.4.2에 정의되어 있습니다.
PageSize 20 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.4.3에 정의되어 있습니다.
SpareSectors 24 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.4.4에 정의되어 있습니다.
RandomAccessTime 28 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.4.5에 정의되어 있습니다.
ProgrammingTime 32 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.4.6에 정의되어 있습니다.
ReadCycle 36 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.4.7에 정의되어 있습니다.
WriteCycle 40 4 이 필드는 필수이며 해당 콘텐츠는 섹션 3.3.4.8에 정의되어 있습니다.
예약됨 44 4 이 필드는 필수이며 해당 콘텐츠는 예약되어 있습니다.

ParametersGuid 필드를 제외한 모든 Flash Parameters 필드에 사용할 수 있는 모든 값이 유효합니다. 그러나 값 0은 필드가 실제로 의미가 없음을 나타냅니다(구현이 지정된 필드를 무시해야 함).

3.3.4.1 ParametersGuid 필드

ParametersGuid 필드는 Generic Parameters 템플릿에 제공된 정의를 준수해야 합니다(섹션 3.3.2.1 참조).

GUID 표기법으로 이 필드에 유효한 값은 {0A0C7E46-3399-4021-90C8-FA6D389C4BA2}입니다.

3.3.4.2 EraseBlockSize 필드

EraseBlockSize 필드는 플래시 미디어 지우기 블록의 크기(바이트)를 설명해야 합니다.

3.3.4.3 PageSize 필드

PageSize 필드는 플래시 미디어 페이지의 크기(바이트)를 설명해야 합니다.

3.3.4.4 SpareSectors 필드

SpareSectors 필드는 플래시 미디어가 내부 스파링 작업에 사용할 수 있는 섹터 수를 설명해야 합니다.

3.3.4.5 RandomAccessTime 필드

RandomAccessTime 필드는 플래시 미디어의 평균 임의 액세스 시간을 나노초 단위로 설명해야 합니다.

3.3.4.6 ProgrammingTime 필드

ProgrammingTime 필드는 플래시 미디어의 평균 프로그래밍 시간을 나노초 단위로 설명해야 합니다.

3.3.4.7 ReadCycle 필드

ReadCycle 필드는 플래시 미디어의 평균 읽기 주기 시간을 나노초 단위로 설명해야 합니다.

3.3.4.8 WriteCycle 필드

WriteCycle 필드는 평균 쓰기 주기 시간을 나노초 단위로 설명해야 합니다.

3.4 Main 및 Backup Boot Checksum 하위 영역

Main 및 Backup Boot Checksum에는 각각 해당 부팅 영역에 있는 다른 모든 하위 영역의 콘텐츠에 대한 4바이트 체크섬의 반복 패턴이 포함됩니다. 해당 부팅 섹터의 VolumeFlags 및 PercentInUse 필드는 체크섬 계산에 포함되지 않습니다(그림 1 참조). 4바이트 체크섬의 반복 패턴은 해당 부팅 체크섬 하위 영역을 처음부터 끝까지 채웁니다.

구현은 Main 또는 Backup Boot 영역에서 다른 하위 영역의 콘텐츠를 사용하기 전에 해당 Boot Checksum의 유효성을 검사하여 해당 콘텐츠를 확인해야 합니다.

초기 포맷 작업은 Main 및 Backup Boot Checksum을 반복 체크섬 패턴으로 채웁니다. 구현은 해당 Boot 영역의 다른 섹터 콘텐츠가 변경되면 해당 섹터를 업데이트해야 합니다.

그림 1 부팅 체크섬 계산

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

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

    return Checksum;
}

4 File Allocation Table 영역

FAT(File Allocation Table) 영역에는 First FAT 하위 영역과 Second FAT 하위 영역에 각각 하나씩 최대 두 개의 FAT가 포함될 수 있습니다. NumberOfFats 필드는 이 영역에 포함된 FAT 수를 설명합니다. NumberOfFats 필드에 유효한 값은 1과 2입니다. 따라서 첫 번째 FAT 하위 영역에는 항상 FAT가 포함됩니다. NumberOfFats 필드가 2이면 Second FAT 하위 영역에도 FAT가 포함됩니다.

VolumeFlags 필드의 ActiveFat 필드는 활성 상태인 FAT를 설명합니다. Main Boot Sector의 VolumeFlags 필드만 최신 상태입니다. 구현은 활성 상태가 아닌 FAT를 부실한 것으로 처리해야 합니다. 비활성 FAT의 사용 및 FAT 간 전환은 구현에 따라 다릅니다.

4.1 First 및 Second FAT 하위 영역

FAT는 Cluster Heap의 클러스터 체인을 설명해야 합니다(표 11 참조). 클러스터 체인은 파일, 디렉터리 및 기타 파일 시스템 구조의 콘텐츠를 기록하기 위한 공간을 제공하는 일련의 클러스터입니다. FAT는 클러스터 체인을 클러스터 인덱스의 단일 연결 목록으로 나타냅니다. 처음 두 항목을 제외하고 FAT의 모든 항목은 정확히 하나의 클러스터를 나타냅니다.

표 11 파일 할당 테이블 구조

필드 이름

Offset

(바이트)

크기

(바이트)

설명
FatEntry[0] 0 4 이 필드는 필수이며 해당 콘텐츠는 섹션 4.1.1에 정의되어 있습니다.
FatEntry[1] 4 4 이 필드는 필수이며 해당 콘텐츠는 섹션 4.1.2에 정의되어 있습니다.
FatEntry[2] 8 4 이 필드는 필수이며 해당 콘텐츠는 섹션 4.1.3에 정의되어 있습니다.

.

.

.

.

.

.

.

.

.

.

.

.

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

이 필드는 필수이며 해당 콘텐츠는 섹션 4.1.3에 정의되어 있습니다.

ClusterCount + 1은 FFFFFFF6h를 초과할 수 없습니다.

참고: Main 및 Backup Boot Sector에는 모두 ClusterCount 필드가 포함됩니다.

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

이 필드는 필수이며 해당 콘텐츠(있는 경우)는 정의되어 있지 않습니다.

참고: Main 및 Backup Boot Sector에는 모두 ClusterCount, FatLength 및 BytesPerSectorShift 필드가 포함됩니다.

4.1.1 FatEntry[0] 필드

FatEntry[0] 필드는 첫 번째 바이트(최저차 바이트)에 미디어 형식을 설명하고 나머지 3바이트에 FFh를 포함해야 합니다.

미디어 유형(첫 번째 바이트)은 F8h여야 합니다.

4.1.2 FatEntry[1] 필드

FatEntry[1] 필드는 기록 우선 순위로 인해 존재하며 관심 있는 항목을 설명하지 않습니다.

이 필드에 유효한 값은 FFFFFFFFh입니다. 구현은 이 필드를 규정된 값으로 초기화해야 하며 어떤 목적으로든 이 필드를 사용하지 않는 것이 좋습니다. 구현은 이 필드를 해석하지 않는 것이 좋으며 주변 필드를 수정하는 작업 간에 해당 콘텐츠를 보존해야 합니다.

4.1.3 FatEntry[2] ... FatEntry[ClusterCount+1] 필드

이 배열의 각 FatEntry 필드는 Cluster Heap의 클러스터를 나타냅니다. FatEntry[2]는 Cluster Heap의 첫 번째 클러스터를 나타내고 FatEntry[ClusterCount+1]는 Cluster Heap의 마지막 클러스터를 나타냅니다.

이러한 필드에 유효한 값의 범위는 다음과 같습니다.

  • 2와 ClusterCount + 1(포함) 사이. 이는 지정된 클러스터 체인의 다음 FatEntry를 가리킵니다. 지정된 FatEntry는 지정된 클러스터 체인에서 앞에 오는 FatEntry를 가리키지 않아야 합니다.

  • 정확히 FFFFFFF7h. 이는 지정된 FatEntry의 해당 클러스터를 "불량"으로 표시합니다.

  • 정확히 FFFFFFFFh. 이는 지정된 FatEntry의 해당 클러스터를 클러스터 체인의 마지막 클러스터로 표시합니다. 이는 지정된 클러스터 체인의 마지막 FatEntry에 유일한 유효한 값입니다.

5 데이터 영역

데이터 영역에는 파일 시스템 구조, 디렉터리 및 파일에 대한 관리 공간을 제공하는 Cluster Heap이 포함됩니다.

5.1 Cluster Heap 하위 영역

Cluster Heap의 구조는 매우 간단합니다(표 12 참조). 각 연속 섹터 시리즈는 SectorsPerClusterShift 필드가 정의하는 대로 하나의 클러스터를 설명합니다. 중요한 것은 Cluster Heap의 첫 번째 클러스터에 FatEntry[2]의 인덱스에 직접 해당하는 인덱스 2가 있다는 사실입니다.

exFAT 볼륨에서 할당 비트맵(섹션 7.1.5 참조)은 모든 클러스터의 할당 상태 레코드를 유지 관리합니다. 이는 FAT가 Cluster Heap에 있는 모든 클러스터의 할당 상태 기록을 유지 관리했던 exFAT의 이전 제품(FAT12, FAT16 및 FAT32)과 큰 차이점입니다.

표 12 Cluster Heap 구조

필드 이름

Offset

(섹터)

크기

(섹터)

설명
Cluster[2] ClusterHeapOffset 2SectorsPerClusterShift

이 필드는 필수이며 해당 콘텐츠는 섹션 5.1.1에 정의되어 있습니다.

참고: Main 및 Backup Boot Sector에는 모두 ClusterHeapOffset 및 SectorsPerClusterShift 필드가 포함됩니다.

.

.

.

.

.

.

.

.

.

.

.

.

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

이 필드는 필수이며 해당 콘텐츠는 섹션 5.1.1에 정의되어 있습니다.

참고: Main 및 Backup Boot Sector에는 모두 ClusterCount, ClusterHeapOffset 및 SectorsPerClusterShift 필드가 포함됩니다.

5.1.1 Cluster[2] ... Cluster[ClusterCount+1] Fields

이 배열의 각 Cluster 필드는 일련의 인접한 섹터로, 해당 크기는 SectorsPerClusterShift 필드로 정의됩니다.

6 디렉터리 구조

exFAT 파일 시스템은 디렉터리 트리 접근 방식을 사용하여 Cluster Heap에 있는 파일 시스템 구조 및 파일을 관리합니다. 디렉터리는 디렉터리 트리의 부모 및 자식 간에 일대다 관계가 있습니다.

FirstClusterOfRootDirectory 필드가 참조하는 디렉터리가 디렉터리 트리의 루트입니다. 다른 모든 디렉터리는 단일 연결 방식의 루트 디렉터리에서 내림차순입니다.

각 디렉터리는 일련의 디렉터리 항목으로 구성됩니다(표 13 참조).

하나 이상의 디렉터리 항목이 파일 시스템 구조, 하위 디렉터리 또는 파일과 같은 관심 있는 항목을 설명하는 디렉터리 항목 집합으로 결합됩니다.

표 13 디렉터리 구조

필드 이름

Offset

(바이트)

크기

(바이트)

설명
DirectoryEntry[0] 0 32 이 필드는 필수이며 해당 콘텐츠는 섹션 6.1에 정의되어 있습니다.

.

.

.

.

.

.

.

.

.

.

.

.

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

이 필드는 필수이며 해당 콘텐츠는 섹션 6.1에 정의되어 있습니다.

N(DirectoryEntry 필드 수)은 지정된 디렉터리를 포함하는 클러스터 체인의 크기(바이트 단위)를 DirectoryEntry 필드의 크기(32바이트)로 나눈 것입니다.

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

이 배열의 각 DirectoryEntry 필드는 Generic DirectoryEntry 템플릿에서 파생됩니다(섹션 6.2 참조).

6.2 Generic DirectoryEntry 템플릿

Generic DirectoryEntry 템플릿은 디렉터리 항목에 대한 기본 정의를 제공합니다(표 14 참조). 모든 디렉터리 항목 구조는 이 템플릿에서 파생되며 Microsoft에서 정의한 디렉터리 항목 구조만 유효합니다(exFAT에는 섹션 7.8섹션 7.9에 정의된 경우를 제외하고 제조업체에서 정의한 디렉터리 항목 구조에 대한 프로비전이 없음). Generic DirectoryEntry 템플릿을 해석하는 기능은 필수입니다.

표 14 Generic DirectoryEntry 템플릿

필드 이름

Offset

(바이트)

크기

(바이트)

설명
EntryType 0 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.2.1에 정의되어 있습니다.
CustomDefined 1 19 이 필드는 필수이며 해당 콘텐츠는 이 템플릿에서 파생되는 구조가 정의할 수 있습니다.
FirstCluster 20 4 이 필드는 필수이며 해당 콘텐츠는 섹션 6.2.2에 정의되어 있습니다.
DataLength 24 8 이 필드는 필수이며 해당 콘텐츠는 섹션 6.2.3에 정의되어 있습니다.

6.2.1 EntryType 필드

EntryType 필드에는 필드 값이 정의하는 세 가지 사용 모드가 있습니다(아래 목록 참조).

  • 00h. 이는 디렉터리 끝 마커이며 다음 조건이 적용됩니다.

    • 지정된 DirectoryEntry의 다른 모든 필드는 실제로 예약되어 있습니다.

    • 지정된 디렉터리의 모든 후속 디렉터리 항목도 디렉터리 끝 마커입니다.

    • 디렉터리 끝 마커는 디렉터리 항목 집합 외부에서만 유효합니다.

    • 구현은 필요에 따라 디렉터리 끝 마커를 덮어쓸 수 있습니다.

  • 01h와 7Fh(포함) 사이. 이는 사용되지 않는 디렉터리 항목 마커이며 다음 조건이 적용됩니다.

    • 지정된 DirectoryEntry의 다른 모든 필드는 실제로 정의되어 있지 않습니다.

    • 사용되지 않는 디렉터리 항목은 디렉터리 항목 집합 외부에서만 유효합니다.

    • 구현은 필요에 따라 사용되지 않는 디렉터리 항목을 덮어쓸 수 있습니다.

    • 이 값 범위는 값 0이 포함된 InUse 필드(섹션 6.2.1.4 참조)에 해당합니다.

  • 81h와 FFh(포함) 사이. 이는 일반 디렉터리 항목이며 다음 조건이 적용됩니다.

    • EntryType 필드의 콘텐츠(표 15 참조)에 따라 DirectoryEntry 구조의 나머지 부분의 레이아웃이 결정됩니다.

    • 디렉터리 항목 집합 내에서는 이 값 범위만 유효합니다.

    • 이 값 범위는 값 1이 포함된 InUse 필드(섹션 6.2.1.4 참조)에 직접 해당합니다.

InUse 필드(섹션 6.2.1.4 참조)가 잘못 수정되어 디렉터리 끝 마커가 생기는 것을 방지하기 위해 값 80h는 유효하지 않은 것으로 인식됩니다.

표 15 Generic EntryType 필드 구조

필드 이름

Offset

(비트)

크기

(비트)

설명
TypeCode 0 5 이 필드는 필수이며 해당 콘텐츠는 섹션 6.2.1.1에 정의되어 있습니다.
TypeImportance 5 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.2.1.2에 정의되어 있습니다.
TypeCategory 6 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.2.1.3에 정의되어 있습니다.
InUse 7 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.2.1.4에 정의되어 있습니다.
6.2.1.1 TypeCode 필드

TypeCode 필드는 지정된 디렉터리 항목의 특정 형식을 부분적으로 설명합니다. 이 필드와 TypeImportance 및 TypeCategory 필드(각각 섹션 6.2.1.2섹션 6.2.1.3 참조)는 지정된 디렉터리 항목의 형식을 고유하게 식별합니다.

TypeImportance 및 TypeCategory 필드에 모두 값 0이 포함되어 있지 않는 한 이 필드에 사용할 수 있는 모든 값이 유효합니다. 이 경우 값 0이 이 필드에 유효하지 않습니다.

6.2.1.2 TypeImportance 필드

TypeImportance 필드는 지정된 디렉터리 항목의 중요성을 설명해야 합니다.

이 필드에 유효한 값은 다음과 같습니다.

  • 0. 이는 지정된 디렉터리 항목이 심각함을 의미합니다(중요한 기본 및 중요한 보조 디렉터리 항목은 각각 섹션 6.3.1.2.1섹션 6.4.1.2.1 참조).

  • 1. 이는 지정된 디렉터리 항목이 무해함을 의미합니다(유용한 기본 및 유용한 보조 디렉터리 항목은 각각 섹션 6.3.1.2.2섹션 6.4.1.2.2 참조).

6.2.1.3 TypeCategory 필드

TypeCategory 필드는 지정된 디렉터리 항목의 범주를 설명해야 합니다.

이 필드에 유효한 값은 다음과 같습니다.

  • 0. 이는 지정된 디렉터리 항목이 기본 항목임을 의미합니다(섹션 6.3 참조).

  • 1. 이는 지정된 디렉터리 항목이 보조 항목임을 의미합니다(섹션 6.4 참조).

6.2.1.4 InUse 필드

InUse 필드는 지정된 디렉터리 항목이 사용 중인지 여부를 설명해야 합니다.

이 필드에 유효한 값은 다음과 같습니다.

  • 0. 이는 지정된 디렉터리 항목이 사용되지 않음을 의미합니다. 즉, 지정된 구조가 실제로 사용되지 않는 디렉터리 항목입니다.

  • 1. 지정된 디렉터리 항목이 사용 중임을 의미합니다. 즉, 지정된 구조가 일반 디렉터리 항목입니다.

6.2.2 FirstCluster 필드

FirstCluster 필드에는 지정된 디렉터리 항목과 연결된 Cluster Heap에 할당된 첫 번째 클러스터의 인덱스가 포함되어야 합니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 정확히 0. 이는 클러스터 할당이 없음을 의미합니다.

  • 2와 ClusterCount + 1 사이. 이는 유효한 클러스터 인덱스의 범위입니다.

클러스터 할당이 파생 구조와 호환되지 않는 경우 이 템플릿에서 파생되는 구조가 FirstCluster 및 DataLength 필드를 모두 재정의할 수 있습니다.

6.2.3 DataLength 필드

DataLength 필드는 연결된 클러스터 할당에 포함된 데이터의 크기(바이트)를 설명합니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 최소 0. FirstCluster 필드에 값 0이 포함되어 있으면 이 필드의 유일한 유효한 값은 0입니다.

  • 최대 ClusterCount * 2SectorsPerClusterShift* 2BytesPerSectorShift

파생 구조에 클러스터 할당이 가능하지 않은 경우 이 템플릿에서 파생되는 구조가 FirstCluster 및 DataLength 필드를 모두 재정의할 수 있습니다.

6.3 Generic Primary DirectoryEntry 템플릿

디렉터리 항목 집합의 첫 번째 디렉터리 항목은 기본 디렉터리 항목이어야 합니다. 디렉터리 항목 집합의 모든 후속 디렉터리 항목(있는 경우)은 보조 디렉터리 항목이어야 합니다(섹션 6.4 참조).

Generic Primary DirectoryEntry 템플릿을 해석하는 기능은 필수입니다.

모든 기본 디렉터리 항목 구조는 Generic DirectoryEntry 템플릿(섹션 6.2 참조)에서 파생되는 Generic Primary DirectoryEntry 템플릿(표 16 참조)에서 파생됩니다.

표 16 Generic Primary DirectoryEntry 템플릿

필드 이름

Offset

(바이트)

크기

(바이트)

설명
EntryType 0 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.3.1에 정의되어 있습니다.
SecondaryCount 1 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.3.2에 정의되어 있습니다.
SetChecksum 2 2 이 필드는 필수이며 해당 콘텐츠는 섹션 6.3.3에 정의되어 있습니다.
GeneralPrimaryFlags 4 2 이 필드는 필수이며 해당 콘텐츠는 섹션 6.3.4에 정의되어 있습니다.
CustomDefined 6 14 이 필드는 필수이며 해당 콘텐츠는 이 템플릿에서 파생되는 구조가 정의합니다.
FirstCluster 20 4 이 필드는 필수이며 해당 콘텐츠는 섹션 6.3.5에 정의되어 있습니다.
DataLength 24 8 이 필드는 필수이며 해당 콘텐츠는 섹션 6.3.6에 정의되어 있습니다.

6.3.1 EntryType 필드

EntryType 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.1 참조).

6.3.1.1 TypeCode 필드

TypeCode 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.1.1 참조).

6.3.1.2 TypeImportance 필드

TypeImportance 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.1.2 참조).

6.3.1.2.1 중요한 기본 디렉터리 항목

중요한 기본 디렉터리 항목에는 exFAT 볼륨의 적절한 관리에 중요한 정보가 포함되어 있습니다. 루트 디렉터리에만 중요한 기본 디렉터리 항목이 포함됩니다(File 디렉터리 항목은 예외, 섹션 7.4 참조).

중요한 기본 디렉터리 항목의 정의는 주 exFAT 수정 번호와 상관 관계가 있습니다. 구현은 모든 중요한 기본 디렉터리 항목을 지원해야 하며, 이 사양에서 정의하는 중요한 기본 디렉터리 항목 구조만 기록해야 합니다.

6.3.1.2.2 유용한 기본 디렉터리 항목

유용한 기본 디렉터리 항목에는 exFAT 볼륨을 관리하는 데 유용할 수 있는 추가 정보가 포함됩니다. 모든 디렉터리에는 유용한 기본 디렉터리 항목이 포함될 수 있습니다.

유용한 기본 디렉터리 항목의 정의는 부 exFAT 수정 번호와 상관 관계가 있습니다. 이 사양 또는 후속 사양에서 정의하는 유용한 기본 디렉터리 항목에 대한 지원은 선택 사항입니다. 인식할 수 없는 유용한 기본 디렉터리 항목은 해당 디렉터리 항목 템플릿의 정의뿐만 아니라 전체 디렉터리 항목 집합을 인식할 수 없게 만듭니다.

6.3.1.3 TypeCategory 필드

TypeCategory 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.1.3 참조).

이 템플릿의 경우 이 필드에 유효한 값은 0이어야 합니다.

6.3.1.4 InUse 필드

InUse 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.1.4 참조).

6.3.2 SecondaryCount 필드

SecondaryCount 필드는 지정된 기본 디렉터리 항목 바로 다음에 있는 보조 디렉터리 항목의 수를 설명해야 합니다. 이러한 보조 디렉터리 항목은 지정된 기본 디렉터리 항목과 함께 디렉터리 항목 집합을 구성합니다.

이 필드에 유효한 값의 범위는 다음과 같습니다.

  • 최소 0. 이는 이 기본 디렉터리 항목이 디렉터리 항목 집합의 유일한 항목임을 의미합니다.

  • 최대 255. 이는 다음 255개의 디렉터리 항목과 이 기본 디렉터리 항목이 디렉터리 항목 집합을 구성함을 의미합니다.

이 템플릿에서 파생되는 중요한 기본 디렉터리 항목 구조는 SecondaryCount 및 SetChecksum 필드를 모두 재정의할 수 있습니다.

6.3.3 SetChecksum 필드

SetChecksum 필드에는 지정된 디렉터리 항목 집합에 있는 모든 디렉터리 항목의 체크섬이 포함되어야 합니다. 그러나 체크섬은 이 필드를 제외합니다(그림 2 참조). 구현은 지정된 디렉터리 항목 집합의 다른 디렉터리 항목을 사용하기 전에 이 필드의 콘텐츠가 유효한지 확인해야 합니다.

이 템플릿에서 파생되는 중요한 기본 디렉터리 항목 구조는 SecondaryCount 및 SetChecksum 필드를 모두 재정의할 수 있습니다.

그림 2 EntrySetChecksum 계산

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

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

6.3.4 GeneralPrimaryFlags 필드

GeneralPrimaryFlags 필드에는 플래그가 포함됩니다(표 17 참조).

이 템플릿에서 파생되는 중요한 기본 디렉터리 항목 구조가 이 필드를 재정의할 수 있습니다.

표 17 Generic GeneralPrimaryFlags 필드 구조

필드 이름

Offset

(비트)

크기

(비트)

설명
AllocationPossible 0 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.3.4.1에 정의되어 있습니다.
NoFatChain 1 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.3.4.2에 정의되어 있습니다.
CustomDefined 2 14 이 필드는 필수이며 이 필드는 이 템플릿에서 파생되는 구조가 정의할 수 있습니다.
6.3.4.1 AllocationPossible 필드

AllocationPossible 필드는 지정된 디렉터리 항목의 Cluster Heap에 할당할 수 있는지 여부를 설명해야 합니다.

이 필드에 유효한 값은 다음과 같습니다.

  • 0. 이는 클러스터의 연결된 할당이 불가능하고 FirstCluster 및 DataLength 필드가 실제로 정의되지 않음을 의미합니다(이 템플릿에서 파생되는 구조가 해당 필드를 재정의할 수 있음).

  • 1. 이는 클러스터의 연결된 할당이 가능하고 FirstCluster 및 DataLength 필드가 정의되어 있음을 의미합니다.

6.3.4.2 NoFatChain 필드

NoFatChain 필드는 활성 FAT가 지정된 할당의 클러스터 체인을 설명하는지 여부를 나타냅니다.

이 필드에 유효한 값은 다음과 같습니다.

  • 0. 이는 해당 FAT 항목이 할당의 클러스터 체인에 유효하고 구현에서 이를 해석해야 함을 의미합니다. AllocationPossible 필드에 값 0이 포함되어 있거나 AllocationPossible 필드에 값 1이 포함되어 있고 FirstCluster 필드에 값 0이 포함된 경우 이 필드의 유일한 유효한 값은 0입니다.

  • 1. 연결된 할당이 하나의 연속 클러스터 시리즈임을 의미합니다. 해당 FAT 항목이 클러스터에 유효하지 않으며 구현에서 이를 해석하지 않습니다. 구현은 연결된 할당의 크기를 계산하기 위해 DataLength / (2SectorsPerClusterShift* 2BytesPerSectorShift) 수식(가장 가까운 정수로 올림)을 사용할 수 있습니다.

이 템플릿에서 파생되는 중요한 기본 디렉터리 항목 구조가 GeneralPrimaryFlags 필드를 재정의하면 연결된 할당의 클러스터 체인에 해당하는 FAT 항목이 유효합니다.

6.3.5 FirstCluster 필드

FirstCluster 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.2 참조).

NoFatChain 비트가 1이면 FirstCluster는 클러스터 힙의 유효한 클러스터를 가리켜야 합니다.

이 템플릿에서 파생되는 중요한 기본 디렉터리 항목 구조는 FirstCluster 및 DataLength 필드를 재정의할 수 있습니다. 이 템플릿에서 파생되는 다른 구조는 AllocationPossible 필드에 값 0이 포함된 경우에만 FirstCluster 및 DataLength 필드를 재정의할 수 있습니다.

6.3.6 DataLength 필드

DataLength 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.3 참조).

NoFatChain 비트가 1이면 DataLength는 0이 아니어야 합니다. FirstCluster 필드가 0이면 DataLength도 0이어야 합니다.

이 템플릿에서 파생되는 중요한 기본 디렉터리 항목 구조는 FirstCluster 및 DataLength 필드를 재정의할 수 있습니다. 이 템플릿에서 파생되는 다른 구조는 AllocationPossible 필드에 값 0이 포함된 경우에만 FirstCluster 및 DataLength 필드를 재정의할 수 있습니다.

6.4 Generic Secondary DirectoryEntry 템플릿

보조 디렉터리 항목의 가장 중요한 목적은 디렉터리 항목 집합에 대한 추가 정보를 제공하는 것입니다. Generic Secondary DirectoryEntry 템플릿을 해석하는 기능은 필수입니다.

중요한 보조 디렉터리 항목 및 유용한 보조 디렉터리 항목의 정의는 부 exFAT 수정 번호와 상관 관계가 있습니다. 이 사양 또는 후속 사양에서 정의하는 중요한 보조 디렉터리 항목 또는 유용한 보조 디렉터리 항목에 대한 지원은 선택 사항입니다.

모든 보조 디렉터리 항목 구조는 Generic DirectoryEntry 템플릿(섹션 6.2 참조)에서 파생되는 Generic Secondary DirectoryEntry 템플릿(표 18 참조)에서 파생됩니다.

표 18 Generic Secondary DirectoryEntry 템플릿

필드 이름

Offset

(바이트)

크기

(바이트)

설명
EntryType 0 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.4.1에 정의되어 있습니다.
GeneralSecondaryFlags 1 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.4.2에 정의되어 있습니다.
CustomDefined 2 18 이 필드는 필수이며 해당 콘텐츠는 이 템플릿에서 파생되는 구조가 정의합니다.
FirstCluster 20 4 이 필드는 필수이며 해당 콘텐츠는 섹션 6.4.3에 정의되어 있습니다.
DataLength 24 8 이 필드는 필수이며 해당 콘텐츠는 섹션 6.4.4에 정의되어 있습니다.

6.4.1 EntryType 필드

EntryType 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.1 참조).

6.4.1.1 TypeCode 필드

TypeCode 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.1.1 참조).

6.4.1.2 TypeImportance 필드

TypeImportance 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.1.2 참조).

6.4.1.2.1 중요한 보조 디렉터리 항목

중요한 보조 디렉터리 항목에는 포함된 디렉터리 항목 집합의 적절한 관리에 중요한 정보가 포함됩니다. 특정 중요한 보조 디렉터리 항목에 대한 지원은 선택 사항이지만 인식할 수 없는 중요한 디렉터리 항목은 해당 디렉터리 항목 템플릿의 정의뿐만 아니라 전체 디렉터리 항목 집합을 인식할 수 없게 만듭니다.

그러나 디렉터리 항목 집합에 구현이 인식할 수 없는 중요한 보조 디렉터리 항목이 하나 이상 포함된 경우, 구현은 디렉터리 항목 집합의 디렉터리 항목 템플릿을 최대한 해석해야 하며 디렉터리 항목 집합의 디렉터리 항목과 관련된 할당에 포함된 데이터는 해석하지 않아야 합니다(File 디렉터리 항목은 예외, 섹션 7.4 참조).

6.4.1.2.2 유용한 보조 디렉터리 항목

유용한 보조 디렉터리 항목에는 포함된 디렉터리 항목 집합을 관리하는 데 유용할 수 있는 추가 정보가 포함됩니다. 특정 유용한 보조 디렉터리 항목에 대한 지원은 선택 사항입니다. 인식할 수 없는 유용한 보조 디렉터리 항목은 전체 디렉터리 항목 집합을 인식할 수 없게 만들지 않습니다.

구현은 인식할 수 없는 유용한 보조 항목을 무시할 수 있습니다.

6.4.1.3 TypeCategory 필드

TypeCategory 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.1.3 참조).

이 템플릿의 경우 이 필드에 유효한 값은 1입니다.

6.4.1.4 InUse 필드

InUse 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.1.4 참조).

6.4.2 GeneralSecondaryFlags 필드

GeneralSecondaryFlags 필드에는 플래그가 포함됩니다(표 19 참조).

표 19 Generic GeneralSecondaryFlags 필드 구조

필드 이름

Offset

(비트)

크기

(비트)

설명
AllocationPossible 0 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.4.2.1에 정의되어 있습니다.
NoFatChain 1 1 이 필드는 필수이며 해당 콘텐츠는 섹션 6.4.2.2에 정의되어 있습니다.
CustomDefined 2 6 이 필드는 필수이며 이 필드는 이 템플릿에서 파생되는 구조가 정의할 수 있습니다.
6.4.2.1 AllocationPossible 필드

AllocationPossible 필드에는 Generic Primary DirectoryEntry 템플릿의 이름이 동일한 필드와 동일한 정의가 있어야 합니다(섹션 6.3.4.1 참조).

6.4.2.2 NoFatChain 필드

NoFatChain 필드에는 Generic Primary DirectoryEntry 템플릿의 이름이 동일한 필드와 동일한 정의가 있어야 합니다(섹션 6.3.4.2 참조).

6.4.3 FirstCluster 필드

FirstCluster 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.2 참조).

NoFatChain 비트가 1이면 FirstCluster는 클러스터 힙의 유효한 클러스터를 가리켜야 합니다.

6.4.4 DataLength 필드

DataLength 필드는 Generic DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.2.3 참조).

NoFatChain 비트가 1이면 DataLength는 0이 아니어야 합니다. FirstCluster 필드가 0이면 DataLength도 0이어야 합니다.

7 디렉터리 항목 정의

exFAT 파일 시스템의 수정 버전 1.00은 다음 디렉터리 항목을 정의합니다.

7.1 Allocation Bitmap 디렉터리 항목

exFAT 파일 시스템에서 FAT는 클러스터의 할당 상태를 설명하지 않습니다. 대신 할당 비트맵이 이를 설명합니다. Allocation Bitmap은 Cluster Heap(섹션 7.1.5 참조)에 있으며 루트 디렉터리에 해당하는 중요한 기본 디렉터리 항목이 있습니다(표 20 참조).

NumberOfFats 필드는 루트 디렉터리의 유효한 Allocation Bitmap 디렉터리 항목 수를 결정합니다. NumberOfFats 필드에 값 1이 포함된 경우 유효한 Allocation Bitmap 디렉터리 항목 수는 1입니다. 또한 First Allocation Bitmap을 설명하는 경우 하나의 Allocation Bitmap 디렉터리 항목만 유효합니다(섹션 7.1.2.1 참조). NumberOfFats 필드에 값 2가 포함된 경우 유효한 Allocation Bitmap 디렉터리 항목 수는 2입니다. 또한 하나는 First Allocation Bitmap을 설명하고 다른 하나는 Second Allocation Bitmap을 설명하는 경우에만 두 Allocation Bitmap 디렉터리 항목이 유효합니다.

표 20 할당 비트맵 DirectoryEntry 구조

필드 이름

Offset

(바이트)

크기

(바이트)

설명
EntryType 0 1 이 필드는 필수이며 해당 콘텐츠는 섹션 7.1.1에 정의되어 있습니다.
BitmapFlags 1 1 이 필드는 필수이며 해당 콘텐츠는 섹션 7.1.2에 정의되어 있습니다.
예약됨 2 18 이 필드는 필수이며 해당 콘텐츠는 예약되어 있습니다.
FirstCluster 20 4 이 필드는 필수이며 해당 콘텐츠는 섹션 7.1.3에 정의되어 있습니다.
DataLength 24 8 이 필드는 필수이며 해당 콘텐츠는 섹션 7.1.4에 정의되어 있습니다.

7.1.1 EntryType 필드

EntryType 필드는 기본 DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.1 참조).

7.1.1.1 TypeCode 필드

TypeCode 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.1.1 참조).

Allocation Bitmap 디렉터리 항목의 경우 이 필드에 유효한 값은 1입니다.

7.1.1.2 TypeImportance 필드

TypeImportance 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.1.2 참조).

Allocation Bitmap 디렉터리 항목의 경우 이 필드에 유효한 값은 0입니다.

7.1.1.3 TypeCategory 필드

TypeCategory 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.1.3 참조).

7.1.1.4 InUse 필드

InUse 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.1.4 참조).

7.1.2 BitmapFlags 필드

BitmapFlags 필드에는 플래그가 포함됩니다(표 21 참조).

표 21 BitmapFlags 필드 구조

필드 이름

Offset

(비트)

크기

(비트)

설명
BitmapIdentifier 0 1 이 필드는 필수이며 해당 콘텐츠는 섹션 7.1.2.1에 정의되어 있습니다.
예약됨 1 7 이 필드는 필수이며 해당 콘텐츠는 예약되어 있습니다.
7.1.2.1 BitmapIdentifier 필드

BitmapIdentifier 필드는 지정된 디렉터리 항목에서 설명하는 Allocation Bitmap을 나타내야 합니다. 구현은 First Allocation Bitmap을 First FAT과 함께 사용해야 하며, Second Allocation Bitmap을 Second FAT과 함께 사용해야 합니다. ActiveFat 필드는 활성 상태인 FAT 및 Allocation Bitmap을 설명합니다.

이 필드에 유효한 값은 다음과 같습니다.

  • 0. 이는 지정된 디렉터리 항목이 First Allocation Bitmap을 설명함을 의미합니다.

  • 1. 이는 지정된 디렉터리 항목이 Second Allocation Bitmap을 설명함을 의미하며 NumberOfFats에 값 2가 포함된 경우에만 가능합니다.

7.1.3 FirstCluster 필드

FirstCluster 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.5 참조).

이 필드에는 FAT에서 설명한 대로 Allocation Bitmap을 호스트하는 클러스터 체인의 첫 번째 클러스터 인덱스가 포함됩니다.

7.1.4 DataLength 필드

DataCluster 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.6 참조).

7.1.5 Allocation Bitmap

Allocation Bitmap은 Cluster Heap에 있는 클러스터의 할당 상태를 기록합니다. Allocation Bitmap의 각 비트는 해당 클러스터를 할당에 사용할 수 있는지 여부를 나타냅니다.

Allocation Bitmap은 가장 낮은 인덱스에서 가장 높은 인덱스까지의 클러스터를 나타냅니다(표 22 참조). 기록상의 이유로 첫 번째 클러스터에는 인덱스 2가 있습니다. 참고: 비트맵의 첫 번째 비트는 첫 번째 바이트의 최저차 비트입니다.

표 22 Allocation Bitmap 구조

필드 이름

Offset

(비트)

크기

(비트)

설명
BitmapEntry[2] 0 1 이 필드는 필수이며 해당 콘텐츠는 섹션 7.1.5.1에 정의되어 있습니다.

.

.

.

.

.

.

.

.

.

.

.

.

BitmapEntry[ClusterCount+1] ClusterCount - 1 1

이 필드는 필수이며 해당 콘텐츠는 섹션 7.1.5.1에 정의되어 있습니다.

참고: Main 및 Backup Boot Sector에는 모두 ClusterCount 필드가 포함됩니다.

예약됨 ClusterCount (DataLength * 8) – ClusterCount

이 필드는 필수이며 해당 콘텐츠(있는 경우)는 예약되어 있습니다.

참고: Main 및 Backup Boot Sector에는 모두 ClusterCount 필드가 포함됩니다.

7.1.5.1 BitmapEntry[2] ... BitmapEntry[ClusterCount+1] 필드

이 배열의 각 BitmapEntry 필드는 Cluster Heap의 클러스터를 나타냅니다. BitmapEntry[2]는 Cluster Heap의 첫 번째 클러스터를 나타내고 BitmapEntry[ClusterCount+1]는 Cluster Heap의 마지막 클러스터를 나타냅니다.

이러한 필드에 유효한 값은 다음과 같습니다.

  • 0. 이는 할당에 사용할 수 있는 해당 클러스터를 설명합니다.

  • 1. 이는 해당 클러스터를 할당에 사용할 수 없음을 설명합니다(클러스터 할당이 해당 클러스터를 이미 사용할 수 있거나 활성 FAT가 해당 클러스터를 불량 클러스터로 설명할 수 있음).

7.2 Up-case Table 디렉터리 항목

Up-case Table은 소문자에서 대문자로의 변환을 정의합니다. 이는 유니코드 문자를 사용하는 File Name 디렉터리 항목(섹션 7.7 참조)과 대/소문자를 구분하지 않고 대/소문자를 보존하는 exFAT 파일 시스템으로 인해 중요합니다. Up-case Table은 Cluster Heap(섹션 7.2.5 참조)에 있으며 루트 디렉터리에 해당하는 중요한 기본 디렉터리 항목이 있습니다(표 23 참조). 유효한 Up-case Table 디렉터리 항목 수는 1입니다.

Up-case Table과 파일 이름 간의 관계로 인해 구현은 포맷 작업의 결과를 제외하고 Up-case Table을 수정하지 않는 것이 좋습니다.

표 23 Up-case Table DirectoryEntry 구조

필드 이름

Offset

(바이트)

크기

(바이트)

설명
EntryType 0 1 이 필드는 필수이며 해당 콘텐츠는 섹션 7.2.1에 정의되어 있습니다.
Reserved1 1 3 이 필드는 필수이며 해당 콘텐츠는 예약되어 있습니다.
TableChecksum 4 4 이 필드는 필수이며 해당 콘텐츠는 섹션 7.2.2에 정의되어 있습니다.
Reserved2 8 12 이 필드는 필수이며 해당 콘텐츠는 예약되어 있습니다.
FirstCluster 20 4 이 필드는 필수이며 해당 콘텐츠는 섹션 7.2.3에 정의되어 있습니다.
DataLength 24 8 이 필드는 필수이며 해당 콘텐츠는 섹션 7.2.4에 정의되어 있습니다.

7.2.1 EntryType 필드

EntryType 필드는 기본 DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.1 참조).

7.2.1.1 TypeCode 필드

TypeCode 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.1.1 참조).

Up-case Table 디렉터리 항목의 경우 이 필드에 유효한 값은 2입니다.

7.2.1.2 TypeImportance 필드

TypeImportance 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.1.2 참조).

Up-case Table 디렉터리 항목의 경우 이 필드에 유효한 값은 0입니다.

7.2.1.3 TypeCategory 필드

TypeCategory 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.1.3 참조).

7.2.1.4 InUse 필드

InUse 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.1.4 참조).

7.2.2 TableChecksum 필드

TableChecksum 필드에는 FirstCluster 및 DataLength 필드에서 설명하는 Up-case Table의 체크섬이 포함됩니다. 구현은 Up-case Table을 사용하기 전에 이 필드의 콘텐츠가 유효한지 확인해야 합니다.

그림 3 TableChecksum 계산

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

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

    return Checksum;
}

7.2.3 FirstCluster 필드

FirstCluster 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.5 참조).

이 필드에는 FAT에서 설명한 대로 Up-case Table을 호스트하는 클러스터 체인의 첫 번째 클러스터 인덱스가 포함됩니다.

7.2.4 DataLength 필드

DataCluster 필드는 Generic Primary DirectoryEntry 템플릿에 제공된 정의를 준수해야 합니다(섹션 6.3.6 참조).

7.2.5 Up-case Table

Up-case Table은 일련의 유니코드 문자 매핑입니다. Up-case Table의 문자 매핑은 대문자로 변환할 유니코드 문자를 나타내는 필드 인덱스와 대문자로 변환된 유니코드 문자를 나타내는 2바이트 필드로 구성됩니다.

처음 128개의 유니코드 문자에는 필수 매핑이 있습니다(표 24 참조). 처음 128개 유니코드 문자에 대한 다른 문자 매핑이 있는 Up-case Table은 유효하지 않습니다.

필수 매핑 범위의 문자만 지원하는 구현은 나머지 Up-case Table의 매핑을 무시할 수 있습니다. 이러한 구현은 파일을 만들거나 이름을 바꾸는 경우에만 필수 매핑 범위의 문자를 사용해야 합니다(File Name 디렉터리 항목을 통해, 섹션 7.7 참조). 기존 파일 이름을 대문자로 변환하는 경우 이러한 구현은 필수가 아닌 매핑 범위의 문자를 대문자로 변환하지 않고, 대문자로 변환된 결과 파일 이름에서 이를 그대로 유지해야 합니다(즉, 부분 대문자 변환). 파일 이름을 비교할 때 이러한 구현은 필수가 아닌 매핑 범위의 유니코드 문자로만 비교 중인 이름과 다른 파일 이름을 동일하게 처리해야 합니다. 이러한 파일 이름은 잠재적으로 동일할 수 있지만 이러한 구현은 완전히 대문자로 변환된 파일 이름이 비교 중인 이름과 충돌하지 않도록 보장할 수 없습니다.

표 24 필수 처음 128자 Up-case Table 항목

테이블 인덱스 + 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

(참고: ID가 아닌 대/소문자 매핑이 있는 항목은 굵게 표시됨)

유니코드 문자 공간의 많은 부분에는 대/소문자 개념이 없기 때문에(즉, "소문자" 및 "대문자"가 동일하다는 의미) 볼륨을 포맷할 때 구현은 ID 매핑 압축을 사용하여 압축된 형식으로 Up-case Table을 생성할 수 있습니다. 구현은 FFFFh 값 다음에 ID 매핑 수를 사용하여 일련의 ID 매핑을 나타내는 방식으로 Up-case Table을 압축합니다.

예를 들어 구현은 압축된 Up-case Table의 다음 8개 항목과 처음 100(64h)개 문자의 매핑을 나타낼 수 있습니다.

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

처음 두 항목은 처음 97(61h)개 문자(0000h에서 0060h까지)에 ID 매핑이 있음을 나타냅니다. 후속 문자(0061h에서 0063h까지)는 각각 0041h에서 0043h까지의 문자에 매핑됩니다.

볼륨을 포맷할 때 압축된 Up-case Table을 제공하는 기능은 선택 사항입니다. 그러나 압축되지 않은 Up-case Table과 압축된 Up-case Table을 모두 해석하는 기능은 필수입니다. TableChecksum 필드의 값은 항상 압축되거나 압축되지 않은 형식일 수 있는 Up-case Table이 볼륨에 존재하는 방식을 따릅니다.

볼륨을 포맷할 때 구현은 TableChecksum 필드의 값이 E619D30Dh인 압축된 형식(표 25 참조)으로 권장되는 Up-case Table을 기록해야 합니다.

구현이 압축되거나 압축되지 않은 자체 Up-case Table을 정의하는 경우 해당 테이블은 전체 유니코드 문자 범위(문자 코드 0000h에서 FFFFh(포함)까지)를 포함해야 합니다.