본문 바로가기

File System

exFAT(Extended File Allocation Table) File System Structure Analysis

이번에 분석할 파일은 exFAT File System 입니다.

exFAT 이라고 불리지만 FAT64 라고 불리기도 합니다.

 

exFAT 파일 시스템을 다른 파일 시스템과 볼륨 크기 및 파일의 최대 크기를 비교 해 보겠습니다.

Compare Other File System Features 

exFAT 파일의 구조를 한번 알아 보겠습니다.

exFAT Structure Layout

- Main Root Region : 주 부트 영역

- Backup Boot Region : 백업 부트 영역

- FAT Region : FAT 영역(일반 적으로 FAT #1 만 있지만 TFAT15로 설정된 경우에는 FAT #2 가 존재 합니다.)

- Data Region : Data 영역

 

위의 exFAT 파일의 구조 중에서 Main Root RegionVolume Boot Record(VBR) 을 자세히 알아 보면 아래와 같습니다.

exFAT Volume Boot Record Structure Layout

 

1. Volume Boot Record

 

보통 VBR 이라고 불리는 영역인 Volume Boot Record 영역은 위의 구조 레이아웃과 같이 exFAT File System 에서는 총 12개의 섹터를 가지게 됩니다.

 

Sector 0 : Boot Sector

Sector 1~8 : Extended Boot Sector

Sector 9 : OEM Parameter Record Sector

Sector 10 : Reserved Sector

Sector 11 : CheckSum Sector

 

Boot Sector : BIOS Parameter Block(BPB), 부트 코드, 시그니처

Extended Boot Sector : 추가적인 부트 코드

OEM Parameter Record Sector : 공장에서 매체 제조사에 의해 기록된 내용

Reserved Sector : 정의되어 있지 않은 예약된 영역

Checksum Sector : 이전 11 섹터에 대한 체크섬 값

 

Sector 9 ~ Sector 11 까지는 Boot Signature 인 0x55AA 가 존재 하지 않습니다.

 

0번섹터에 존재하는 Boot Sector를 먼저 살펴 보겠습니다.

 

1.1 Boot Sector - 0번 Sector

 

아래의 표는 Boot Sector 에서 크게 보았을때 아래와 같이 구조가 나뉘게 됩니다.

Boot Sector Brief Structure

Boot Sector 에서는 세부적으로 어떤 값들을 가지고 있는지 확인해 보겠습니다.

 

1.1.1 Jump Command to Boot Code(0x00 ~ 0x02 3Byte)

 

FAT16 File System 관련해서 글을 작성했을때 언급한 적이 있는 내용입니다.

Jump Command to Boot Code는 CPU Jump Command 라고도 불립니다.

해당 코드는 CPU의 명령 실행 분기를 Boot Code 로 옮기는 역할을 하는 영역입니다.

아래의 표는 FAT12/16, FAT32, NTFS, exFAT 의 CPU Jump Command를 비교한 표입니다.

 

exFAT File System Format - Jump Command Value

exFAT 파일 시스템의 Hex 데이터는 아래와 같습니다.

exFAT File System Format - Jump Command to Boot Code

1.1.2 File System Name(OEM ID)(0x03 ~ 0x0A 8Byte)

 

해당 파일 시스템의 이름이 들어가는 자리 입니다.

exFAT File System Format - File System Name

1.1.3 Must Be Zero(0x0B ~ 0x3F 53Byte)

 

FAT 간의 오류가 발생하는 것을 막기 위해서 53바이트가 전부 0x00으로 채워져 있습니다.

exFAT File System Format - Must Be Zero

1.1.4 BPB(BIOS Parameter Block)(0x40 ~ 0x77 53Byte)

 

exFAT File System Format - BIOS Parameter Block

위의 블록처리된 부분의 영역을 BIOS Parameter Block이라고 이야기 합니다.

0x40~0x77 까지 BPB 라고 불리는 영역에는 아래와 같은 다양한 데이터를 담고 있습니다.

exFAT File System Format - BIOS Parameter Block Data

모든 데이터가 다 중요하지만 하이라이트 되어 있는 데이터가 매우 중요합니다.

 

1.1.5 Boot Code(0x78 ~ 0x 1FDByte)

 

BPB 영역 바로 다음 부터는 Boot Code 가 들어 있습니다.

exFAT File System Format - Boot Code

위의 데이터 중에서 하이라이트 된 부분이 Boot Code 이며 부트 프로그램 이라고도 이야기 하는 영역 입니다.

 

1.1.6 Signature(0x1FE ~ 0x 1FFByte)

 

Volume Boot Record Sector 에서 0번 섹터를 시작으로 8번 섹터 까지 해당 위치에 같은 시그니처가 존재 합니다.

exFAT File System Format - Signature

1.2 Extended Boot Sector - 1번~8번 Sector

 

Extended Boot Sector 는 1번 섹터부터 8번 섹터 까지를 의미 합니다.

추가 적인 부트 코드가 들어가는 영역이며, 8번 섹터까지 전부 기록되지 않은 경우 빈 섹터는 0x00으로 채워져 있다.

또한 1.5 에서 언급한 시그니쳐인 0x55AA가 전부 기록 되어 있다.

 

1.3 OEM Parameter Record - 9번 Sector

 

OEM Parameter Record 는 공장에서 매체 제조사에 의해서 작성된 기록 내용이 들어 있습니다.

하드 디스크 에서는 현재 사용되고 있지 않습니다.

포맷 종류 중에서 완전 삭제가 아닌 일반 삭제의 포맷일 경우 해당 영역은 지워 지지 않습니다.

 

한 필드당 48바이트를 차지 하기 때문에 총 10개의 필드를 입력할 수 있습니다.

16바이트 GUID + 32바이트 파라미터 = 48바이트

 

1.4. Checksum Sector - 11번 Sector

 

Checksum Sector는 4개의 바이트가 반복적으로 1섹터를 채워져 있는 영역입니다.

해당 값은 이전 11섹터에 대한 체크섬 값이 들어있습니다.

 

예제 파일 시스템에서는 0x06E8CBA3(Little Endian) 이라고 적혀 있습니다.

exFAT File System Format - Checksum Sector

 

2. Backup Volume Boot Record

 

앞에서 확인한 Volume Boot Record에 들어있는 데이터 들이 총 12개의 섹터 에 들어가 있습니다.

12섹터 부터 23섹터 까지 Volume Boot Record 순서 대로 값이 들어 있습니다.

 

3. FAT

 

FAT 영역은 아래와 같이 FAT#1 과 FAT#2 로 나뉘어 집니다.

exFAT File System Format - FAT

2개의 영역으로 나뉘어 지는데 FAT#1 에는 일반적인 데이터가 들어가 있고 FAT#2에는 FAT#1에 들어가 있는 데이터의 백업 용으로 똑같은 값이 들어가 있습니다. 그렇기 때문에 크기도 동일하게 같습니다.

 

FAT#2 는 TexFAT 에서만 지원을 하고 있습니다.

버전 1.0 에서는 TexFAT 인 Transactional exFAT 를 지원하고 있지 않습니다.

FAT12/16/32 에서의 FAT의 역할을 클러스터 체인과 할당 상태를 표시하기 위해서 존재 했었습니다.

하지만 exFAT 에서는 할당 상태의 역할이 사라지고 비트맵을 이용한 관리를 적용 했습니다.

=> I/O의 성능이 향상

 

연속적인 클러스터일 경우에 FAT를 사용하지 않고, 비연속적인 클러스터일 경우에는 클러스터 체인만 사용합니다.

 

FAT 영역의 시작 섹터 위치는 0x50~0x53 에 있습니다.

exFAT File System Format - FAT Offset

Value가 0x80 섹터 라고 되어있기 때문에 128번섹터에 존재 할 것입니다.

exFAT File System Format - FAT Area in 128 Sector

FAT 구조는 아래와 같은 구조를 가지고 있습니다.

exFAT File System Format - FAT Area Layout

Media Type 과 Parition Status 에는 아래와 같은 데이터가 들어가게 됩니다.

exFAT File System Format - Media Type & Status Byte

앞에서 본 FAT 영역을 다시 확인해 보면 아래와 같습니다.

exFAT File System Format - FAT Area in 128 Sector

Cluster2~Cluster4 까지 전부 0xFFFFFFFF 으로 덮여 있는 것을 확인 할 수 있습니다.

각각의 Cluster 에는 어떤 데이터가 들어가야하는지 정해져 있습니다.

 

Cluster 2 : Allocation Bitmap

Cluster 3 : UP-Case Table

Cluster 4 : Root Directory

 

위와 같이 정해져 있는데 전부 0xFFFFFFFF 를 덮고 있는 이유는 각각의 섹터가 EOF(End of File) 를 의미하기 때문입니다.

 

클러스터 값에 들어갈 수있는 데이터들을 확인해 보겠습니다.

exFAT File System Format - Cluster Value

위와 같이 전부 0xFFFFFFFF 을 담고 있다면 각각의 데이터가 들어있는 섹터로 가서 확인하면 그만이지만, 하나의 섹터로 EOF 를 확인 하지못하고 데이터가 방대 하다면 클러스터를 보고 연결되는 섹터를 확인 해야 합니다.

 

exFAT File System Format - Example FAT 1

위의 구조처럼 존재 한다면 그냥 바로 0xFFFFFFFF 를 만나서 파일 끝을 확인 하게 됩니다.

 

하지만 아래의 구조 처럼 0xFFFFFFFF 가 바로 나오지 않고 방대한 데이터로 인해서 클러스터가 필요 할때는 아래와 같이 참조를 하게 됩니다.

exFAT File System Format - Example FAT 2

Directory Record 의 클러스터 값이 20일때 20클러스터로 가서 해당 값을 확인해서 Linked List 로 연결되는 것을 확인 할 수 있습니다.

 

4. Data Region

 

Data Region은 주요 데이터가 들어있는 영역입니다.

 

- Cluster Heap Area

- UP-Case Table Area

- Volume label Directory Entry

- Allocation Bitmap Directory Entry

- UP-Case Table Directory Entry

- Volume GUID Directory Entey

- File Directory Entry

- Stream Extension Entry

- File Name Extension Entry

- Windows CE Access Control Table Directory Entry

 

위의 내용을 Data Region에서 전부 확인 할수 있습니다.

앞에서 언급한 Data Region 영역을 확인해 보기 위해서 구조를 확인해 보겠습니다.

exFAT File System Format - Data Region Structure

먼저 Data Region의 첫 섹터를 찾아 보겠습니다.

데이터 영역의 섹터 주소는 앞서 확인한 VBR에 존재 합니다.

VBR의 0x58~0x5B에 있습니다.

exFAT File System Format - Cluster Heap Offset

0x280 (640 섹터)라는 값을 가지고 있습니다. 

640 섹터에 가보면 Cluster Heap 영역을 확인 할수 있습니다.

exFAT File System Format - Cluster Heap Data

Data Region 영역에서는 클러스터 단위로 나눠져 있기 때문에 1클러스터가 몇 섹터인지 계산해 보면 아래와 같습니다.

1클러스터에 대한 섹터 값과 1섹터에 대한 바이트 값은 앞서 확인한 VBR에 같이 존재 합니다.

섹터당 바이트 수 : 0x6C

클러스터당 섹터수 : 0x6D

 

exFAT File System Format - Bytes Per Sector, Sectors Per Cluster

2^n승으로 계산 하기 때문에 섹터당 바이트 수는 2^9 = 512바이트, 클러스터당 섹터 수는 2^6 = 64바이트 입니다.

 

2번 클러스터가 Cluster Heap [640 섹터] 였으니까 3번 클러스터인 UP-Case Table은 704섹터에 존재 합니다.

704 섹터를 확인해 보면 아래와 같이 출력합니다.

exFAT File System Format - UP-Case Table

UP-Case Table를 간략하게 설명을 해보자면 일련의 유니코드 문자를 mapping 해둔 테이블 이라고 보면 좋습니다.

 

4번 클러스터의 위치는 768섹터이며, 파일시스템에서 가장 중요한 Directory Entry 가 있는 클러스터입니다.

exFAT File System Format - Directory Entry

다른 FAT 파일과 달리 exFAT 파일은 앞서 언급한것 처럼 Directory Entry가 다양합니다.

 

- Volume label Directory Entry

- Allocation Bitmap Directory Entry

- UP-Case Table Directory Entry

- Volume GUID Directory Entey

- File Directory Entry

- Stream Extension Entry

- File Name Extension Entry

- Windows CE Access Control Table Directory Entry

 

위의 Directory Entry 순서대로 구조를 분석해 보도록 하겠습니다.

현재 포맷한 이후로 hello.txt 파일을 생성해둔 상태 입니다.

 

4.1 Volume Label Directory Entry 

 

Volume Label Directory Entry 를 확인해 보면 아래와 같습니다.

exFAT File System Format - Volume Label Directory Entry

구조 레이아웃을 확인해 보면 아래와 같습니다.

exFAT File System Format - Volume Label Directory Entry Layout

각각의 요소는 아래와 같은 값을 가지고 있습니다.

exFAT File System Format - Volume Label Directory Entry Data

볼륨 레이블은 총 11글자가 최대 이며 볼륨 레이블이 없다면 entry type은 0x03 입니다.

 

4.2 Allocation Bitmap Directory Entry 

 

Allocation Bitmap Directory Entry 를 확인해 보면 아래와 같습니다.

exFAT File System Format - Allocation Bitmap Directory Entry

구조 레이아웃을 확인해 보면 아래와 같습니다.

exFAT File System Format - Allocation Bitmap Directory Entry Layout

각각의 요소는 아래와 같은 값을 가지고 있습니다.

exFAT File System Format - Allocation Bitmap Directory Entry Data

할당 비트맵 테이블은 최대 2개 (TexFAT 사용 시)

2번 클러스터는 Cluster Heap 영역을 의미합니다.

 

0x01인 Bitmap Flags에 0이들어가면 1st Bitmap 을 의미하고 1이 들어가면 2st Bitmap 을 의미합니다.

 

4.3 UP-Case Table Directory Entry

 

UP-Case Table Directory Entry 를 확인해 보면 아래와 같습니다.

exFAT File System Format - UP-Case Table Directory Entry

구조 레이아웃을 확인해 보면 아래와 같습니다.

exFAT File System Format - UP-Case Table Directory Entry Layout

각각의 요소는 아래와 같습니다.

exFAT File System Format - UP-Case Table Directory Entry Data

파일명을 대문자로 변환할때 UP-Case Table Directory Entry 를 사용합니다.

 

4.4 Volume GUID Directory Entey

 

Volume GUID Directory Entry 를 확인해 보면 아래와 같습니다.

해당 GUID Directory Entry는 있을 수도 있고 없을 수도 있는데 해당 예제 파일에서는 없습니다.

 

구조 레이아웃을 살펴 보겠습니다.

exFAT File System Format - Volume GUID Directory Entry Layout

각각의 요소는 아래와 같습니다.

exFAT File System Format - Volume GUID Directory Entry Data

4.5 File Directory Entry

 

File Directory Entry 를 확인해 보면 아래와 같습니다.

exFAT File System Format - File Directory Entry

구조 레이아웃을 확인해 보면 아래와 같습니다.

exFAT File System Format - File Directory Entry  Layout

각각의 요소는 아래와 같습니다.

exFAT File System Format - File Directory Entry  Data

- 생성시간, 마지막 수정시간, 마지막 접근시간 DOS TimeStamp 형식으로 저장

- 10ms 단위의 생성 및 마지막 수정시간 저장

- 윈도우 XP 환경에서 10ms 단위의 시간 필드 이상 동작 (확인 필요)

 

Entry Type 에 들어갈 수 있는 값은 아래와 같습니다.

└ 0x00 : 파일이름이 사용된 적이 없음

└ 0xE5 : 파일이 이미 삭제 되었지만 파일의 이름은 확인이 가능한 상태

└ 0x05 : 파일명의 첫번째 문자가 'σ'인 경우 ('σ' 의 아스키 코드 값이 0xE5 이기 때문에 0x05로 표기됨.)

 

파일 속성에 들어가는 값은 아래와 같습니다.

└ 0x01 : ReadOnly

└ 0x02 : Hidden

└ 0x04 : System

└ 0x10 : Directory

└ 0x20 : Archive

 

Timezone 위치는 파일을 생성한 위치가 사용하고 있는 Timezone에 해당하는 값이 입력됩니다.

└ 0x80 : UTC+00:00  : GreenwichStandardTime

└ 0x84 : UTC+01:00 : CentralEuropeTime

└ 0x88 : UTC+02:00 : EasternEuropeStandardTime

└ 0x8C : UTC+03:00 : MoscowStandardTime

└ 0x90 : UTC+04:00 : ArabianStandardTime

└ 0x94 : UTC+05:00 : WestAsiaStandardTime

└ 0x98 : UTC+06:00 : CentralAsiaStandardTime

└ 0x9C : UTC+07:00 : NorthAsiaStandardTime

└ 0xA0 : UTC+08:00 : NorthAsiaEastStandardTime

└ 0xA4 : UTC+09:00 : TokyoStandardTime

└ 0xA8 : UTC+10:00 : WestPacificStandardTime

└ 0xAC : UTC+11:00 : CentralPacificStandardTime

└ 0xB0 : UTC+12:00 : NewZealandStandardTime

└ 0xB4 : UTC+13:00 : TongaStandardTime

└ 0xD0 : UTC-12:00 : DatelineStandardTime

└ 0xD4 : UTC-11:00 : SamoaStandardTime

└ 0xD8 : UTC-10:00 : HawaiiStandardTime

└ 0xDC : UTC-09:00 : AlaskaStandardTime

└ 0xE0 : UTC-08:00 : PacificStandardTime

└ 0xE4 : UTC-07:00 : MountainStandardTime

└ 0xE8 : UTC-06:00 : CentralStandardTime

└ 0xEC : UTC-05:00 : EasternStandardTime

└ 0xF0 : UTC-04:00 : AtlanticStandardtime

└ 0xF2 : UTC-03:30 : NewfoundlandStandardTime

└ 0xF4 : UTC-03:00 : GreenlandStandardTime

└ 0xF8 : UTC-02:00 : Mid-AtlanticStandardTime

└ 0xFC : UTC-01:00 : AzoresStandardTime

 

4.6 Stream Extension Entry

 

Stream Extension Entry 를 확인해 보면 아래와 같습니다.

exFAT File System Format - Stream Extension Entry

구조 레이아웃을 확인해 보면 아래와 같습니다.

exFAT File System Format - Stream Extension Entry  Layout

각각의 요소는 아래와 같습니다.

exFAT File System Format - Stream Extension Entry  Data

2차 플래그에 들어가는 값은 아래와 같습니다.

└ 0x00 : Allocation Possible

    => 0 : No , 1 : Yes

└ 0x01 : No FAT Chain

    => 0 : Valid , 1 : Invalid

 

No FAT Chain 플래그가 1일때 클러스터가 연속적으로 할당 되어 있음을 의미, 시작 클러스터부터 파일 용량 만큼 획득

 

4.7 File Name Extension Entry

 

File Name Extension Entry 를 확인해 보면 아래와 같습니다.

exFAT File System Format - File Name Extension Entry

구조 레이아웃을 확인해 보면 아래와 같습니다.

exFAT File System Format - File Name Extension Entry Layout

각각의 요소는 아래와 같습니다.

exFAT File System Format - File Name Extension Entry Data

HxD 에서 확인 할 수 있는 데이터를 보면 32바이트 보다 파일명이 길어진다면 하나의 구조가 더 붙는 것을 확인 할 수 있습니다.

 

또한 파일 이름으로 사용이 불가능한 문자가 존재합니다.

[ 0x00~0x1F , " , * , / , : , < , > , ? , \ , | ]

 

4.8 Windows CE Access Control Table Directory Entry

 

Windows CE Access Control Table Directory Entry 를 확인해 보면 아래와 같습니다.

이 구조도 마찬 가지로 해당 예제 파일에는 존재 하지 않습니다.

 

그래서 구조 레이아웃만 확인해 보겠습니다.

exFAT File System Format - Windows CE Access Control Table Directory Entry

각각의 요소는 아래와 같습니다.

exFAT File System Format - Windows CE Access Control Table Directory Data

버전 1.0 에서는 지원하지 않습니다.(윈도우 CE만 지원)

 

여기까지가 구조를 다룬 내용이고 이제 2가지의 경우를 만들어서 파일 내용을 찾아 보겠습니다.

1. 루트디렉터리에 파일생성.

2. 루트디렉터리에 디렉터리 생성후 그 안에 파일 생성.

 

1번 방법으로 파일을 만들어보면 루트 디렉터리에서 구조를 확인 할 수 있습니다.

exFAT File System Format - hello.txt File Entry

해당 Directory Entry를 확인해 보면 hello.txt 라는 이름을 가지고 있는 것을 확인 할 수 있고, 해당 파일 내용은 8번 클러스터에 있는것을 알 수 있습니다.

파일 속성이 0x20 인것으로 보아 아카이브로 일반적인 파일이라는 것을 알 수 있습니다.

 

640섹터(2클러스터) + 64*6(6클러스터) = 1024섹터(8클러스터) 로 가면됩니다.

exFAT File System Format - hello.txt File Contents

2번 방법으로 파일을 만들어 보면 루트 디렉터리에서 구조를 확인 할 수 있습니다.

exFAT File System Format - Hello Directory Directory Entry

해당 Directory Entry를 확인해 보면 해당 폴더가 Hello Directory 라는 이름을 가지고 있는 것을 확인 할 수 있고, 파일 속성을 확인해 보면 0x10 으로 디렉터리라는 것을 알 수 있습니다.

 

해당 디렉터리에 들어있는 파일 은 9번 클러스터에 있는것을 알 수 있습니다.

 

9번 클러스터는 1088 섹터에 있습니다.

exFAT File System Format - Hello File.txt Entry in Hello Directory

파일이름은 Hello File.txt 인것을 알 수 있으며 파일 내용은 10번 클러스터인 1152섹터입니다.

exFAT File System Format - Hello File.txt File Contents