FAT32 파일 구조
FAT32 파일 시스템 구조
FAT(File Allocation Table) 파일 시스템은 Microsoft에서 개발한 파일 시스템으로, 디스크의 파일 할당 정보를 테이블 형태로 관리하는 방식입니다. FAT 파일 시스템은 구조가 단순하여 USB 메모리, SD 카드 등 다양한 저장 장치에서 널리 사용됩니다. FAT의 주요 버전으로는 FAT12, FAT16, FAT32, exFAT 등이 있으며, 이 글에서는 FAT32 파일 시스템에 대해 집중적으로 다룹니다.
FAT32 파일 시스템 개요
FAT32는 FAT16보다 더욱 복잡한 파일 구조를 가지고 있으며, 파티션의 최대 크기가 32GB로 제한됩니다. FAT32는 크게 예약된 영역(Reserved Area), FAT 영역(File Allocation Table Area), 데이터 영역(Data Area)의 세 부분으로 나뉩니다.
1. 예약된 영역 (Reserved Area)
예약된 영역은 파일 시스템의 주요 정보를 저장하는 중요한 영역으로, FAT32에서는 32개의 섹터로 구성됩니다. 주요 구성 요소는 다음과 같습니다.
1.1 부트 섹터(Boot Sector) - 0, 6번 섹터
부트 섹터는 운영체제가 파일 시스템을 인식하고 부팅을 수행하는 데 필요한 정보를 포함하는 영역입니다. FAT32 파일 시스템에서는 부트 섹터가 0번과 6번 섹터에 위치합니다.
부트 섹터 주요 항목
- Jump Command to Boot Code (0x00 ~ 0x02, 3Byte): CPU의 명령 실행 분기를 부트 코드로 옮기는 역할을 합니다.
File System Format | CPU Jump Command(little endian) |
Fat12/16 | 0x903CEB |
FAT32 | 0x9058EB |
NTFS | 0x9052EB |
- OEM ID (0x03 ~ 0x0A, 8Byte): 파일 시스템을 생성한 OS 또는 프로그램의 ID 정보입니다.
- BIOS Parameter Block (BPB, 0x0B ~ 0x59, 78Byte): 디스크의 기본적인 정보(섹터 크기, 클러스터 크기 등)를 포함합니다.
Address Range | Size | Field Name | Description |
0x0B ~ 0x0C | 2Byte | Byte per sector | 한 섹터 당 할당되는 Byte 크기 |
0x0D ~ 0x0D | 1Byte | Sector per cluster | 한 클러스터 당 할당되는 섹터 수 |
0x0E ~ 0x0F | 2Byte | Reserved Sector Count | FAT Area가 나오기 전에 예약된 영역의 섹터 수 |
0x10 ~ 0x10 | 1Byte | Number of FAT | FAT Area의 개수, 대부분 #1과 #2로 2개가 있다 |
0x11 ~ 0x12 | 2Byte | Root Directory Entry Count | FAT12/16의 할당된 루트 디렉터리 엔트리 개수 |
0x13 ~ 0x14 | 2Byte | Total Sector 16 | 볼륨상에 있는 총 섹터 수 |
0x15 ~ 0x15 | 1Byte | Media Type | 볼륨에 어떤 미디어가 저장되어있는지 나타냄 (플로피 디스크를 제외하고 전부다 0xF8) |
0x16 ~ 0x17 | 2Byte | FAT Size 16 | FAT Area의 섹터 수를 나타낸다(FAT32 사용X) |
0x18 ~0x19 | 2Byte | Sector per track | 트랙당 섹터 수 |
0x1A ~ 0x1B | 2Byte | Number of Heads | 헤더 수 |
0x1C ~ 0x1F | 4Byte | Hidden Sectors | 볼륨 앞에 숨겨진 섹터 수 |
0x20 ~ 0x23 | 4Byte | FAT32 Size | FAT 하나의 영격이 가지는 4바이트 크기의 섹터 수 |
0x28 ~ 0x29 | 2Byte | Ext Flags | 여러 개의 FAT 영역을 사용할 경우 설정 값 |
0x2A ~ 0x2B | 2Byte | File System Version | 파일 시스템의 주 버전과 하위 버전 |
0x2C ~ 0x2F | 4Byte | Root Directory Cluster | 루트 디렉터리가 위치한 클러스터 값 |
0x30 ~ 0x31 | 2Byte | File System information | FSINFO 구조체가 저장된 섹터 번호 |
0x32 ~ 0x33 | 2Byte | Backup Boot Sector | 백업된 부트 섹터의 위치 |
0x34 ~ 0x3F | 12Byte | Reserved | 예약된 영역 |
0x40 ~ 0x40 | 1Byte | Drive Number | BIOS INT13h 드라이브 번호 |
0x41 ~ 0x41 | 1Byte | Reserved1 | 예약된 영역 |
0x42 ~ 0x42 | 1Byte | Boot Signature | 확장 부트 시그니처 |
0x43 ~ 0x46 | 4Byte | Volume ID | 볼륨 시리얼 번호 |
0x47 ~ 0x51 | 11Byte | Volume Label | 볼륨 레이블(없을 경우 NO NAME) |
0x52 ~ 0x59 | 7Byte | File System Type | 파일 시스템 형식 |
BIOS Parameter Block Total 0x0B ~ 0x59 (Size : 51 Byte) |
- Boot Code Error Message (0x5A ~ 0x1FD, 419Byte): 부팅 실패 시 출력되는 오류 메시지를 포함합니다.
- Signature (0x1FE ~ 0x1FF, 2Byte): 부트 섹터의 끝을 나타내는 0x55AA 값이 위치합니다.
1.2 파일 시스템 정보(FSINFO) - 1, 7번 섹터
FSINFO(File System Information) 섹터는 FAT32에서 파일 시스템의 상태를 빠르게 탐색할 수 있도록 도와주는 구조체입니다. 사용 가능한 클러스터 공간과 관련된 정보를 포함하고 있습니다.
Lead Signature | Reserved | ||
Struct Signature | Free cluster count | Next free cluster | |
Reserved | Trail signature |
FSINFO 주요 항목
- Lead Signature (0x41615252): FSINFO 섹터임을 나타내는 값
- Struct Signature (0x61517272): FSINFO 구조체의 시작을 나타내는 값
- Free Cluster Count: 사용 가능한 클러스터의 개수를 나타냅니다.
- Next Free Cluster: 다음에 사용할 수 있는 클러스터 위치를 저장합니다.
- Trail Signature (0xAA550000): FSINFO 구조체의 끝을 나타내는 값
2. FAT 영역 (File Allocation Table Area)
FAT 영역은 파일과 디렉터리의 클러스터 할당 정보를 관리하는 테이블이 저장된 영역입니다. FAT32에서는 두 개의 FAT 테이블이 존재하며, 하나는 원본 FAT 영역이고, 다른 하나는 백업용 FAT 영역입니다.
FAT 영역 주요 항목
- FAT1 (Original FAT): 파일이나 디렉터리에 대한 할당 정보를 기록하는 테이블입니다.
- FAT2 (Backup FAT): FAT1 영역의 백업 영역으로, FAT1과 동일한 구조를 가집니다.
- FAT 엔트리: 파일의 클러스터 연결 정보를 나타내며, FAT32에서는 4바이트 크기의 엔트리를 사용합니다.
- Root Directory 시작 클러스터: 2번 클러스터에서 시작합니다.
FAT 테이블 구조
FAT 엔트리는 특정한 값을 가지며, 파일이 어떻게 클러스터에 저장되는지를 나타냅니다.
값의미
FAT32 | Description |
0x00000000 | 비할당 클러스터 |
0x00000002 ~ 0x0FFFFFEF | 할당된 클러스터 |
0x0FFFFFF8 ~ 0x0FFFFFFF | 마지막 클러스터(파일 끝) |
0x0FFFFFF7 | 손상된 클러스터(Bad Cluster) |
0x0FFFFFF0 ~ 0x0FFFFFFR6 | 예약된 값(Reserved Values) |
3. 데이터 영역 (Data Area)
데이터 영역은 실제 파일과 디렉터리의 내용이 저장되는 공간으로, FAT 영역에서 할당된 클러스터들이 이곳을 참조합니다.
데이터 영역 주요 항목
- Root Directory: 파일 시스템의 최상위 디렉터리로, 클러스터 2번에서 시작합니다.
- 파일 및 폴더 데이터: 모든 파일과 폴더의 내용이 클러스터 단위로 저장됩니다.
- Directory Entry: 파일과 디렉터리 정보를 저장하는 구조체로, 크기는 32Byte입니다.
Directory Entry 구조
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 |
Name | Extension | Attr | Reserved | Create Time | |||||||||||
Created Date | Last Accessed Date |
Starting Cluster Hi |
Last Written Time |
Last Written Date |
Starting Cluster Low |
File Size |
필드 | 크기(Byte) | 설명 |
Name | 8 | 파일 이름 |
Extension | 3 | 확장자 |
Attributes | 1 | 파일 속성(읽기 전용, 시스템 파일 등) |
Create Time | 2 | 생성 시간 |
Create Date | 2 | 생성 날짜 |
Last Access Date | 2 | 마지막 접근 날짜 |
Starting Cluster | 4 | 파일의 첫 번째 클러스터 위치 |
File Size | 4 | 파일 크기 (Byte) |
롱 파일 네임(Long File Name, LFN)
FAT32는 기본적으로 8.3 형식의 짧은 파일명을 사용하지만, LFN(Long File Name) 방식을 통해 최대 255자까지 지원합니다. LFN 엔트리는 UTF-16 인코딩을 사용하며, 일반적인 디렉터리 엔트리와 함께 저장됩니다.
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 |
Order | Nmae1 | Atrr | type | Check sum |
Name2 | ||||||||||
Name2 | Start cluster low |
Name3 |
- Order : LFNs의 순서, 상태를 기록하는 항목(0xE5 : 삭제된 파일/폴더, 01 : 첫번째 순서)
- Name1~ : 파일/폴더 이름, 빈 영역은 0xFF로 채워짐
- Atrr : 0x0F일 경우 확장된 파일명이라는 뜻
- Type : 일반적으로 0x00의 값을 가짐
- Checksum : LFNs와 대응되는 Short Directory Entry 의 Checksum을 저장
- Start cluster low : 0x00으로 고정