FAT 파일시스템 – 예약된 영역 (Reserved Area)
예약된 영역(Reserved Area)는 FAT 파일시스템에서 가장 앞 부분에 위치하는 구조로서 여러 개의 섹터로 구성된다. 예약된 영역의 크기는 기본적으로 FAT12/16 에서는 1 섹터, FAT32 에서는 32 섹터를 사용한다. 예약된 영역은 다시 부트 섹터(Boot Sector), FSINFO(File System INFOrmation) 섹터, 추가적인 섹터로 구분된다. 다음은 예약된 영역의 추상적인 구조이다.
1. 부트 섹터
부트 섹터의 크기는 1섹터로 FAT 파일시스템의 처음에 위치한다. 부트섹터(512 바이트)의 구조는 다음과 같다.
FAT 형식 | 범위 | 설명 | |
10진수 | 16진수 | ||
FAT12/16 | 0 – 2 | 0x0000 – 0x0002 | Jump command to boot code |
FAT32 | |||
FAT12/16 | 3 – 61 | 0x0003 – 0x003D | BIOS Parameter Block (BPB) |
FAT32 | 3 – 89 | 0x000 – 0x0059 | |
FAT12/16 | 62 – 509 | 0x003E- 0x01FD | Boot code and error message |
FAT32 | 90 – 509 | 0x005A – 0x01FD | |
FAT12/16 | 510 – 511 | 0x01FE – 0x01FF | Signature (0x55AA) |
FAT32 |
부트 섹터의 처음 3 바이트는 0x003E 또는 0x005A의 부트 코드로 점프하기 위한 점프 명령어가 위치한다. 이후 클러스터 크기, FAT 크기, 루트 디렉터리 위치, 총 섹터 수 등의 파일시스템 정보를 기록한 BPB 영역이 온다. 이후에는 해당 파일시스템을 부팅하기 위한 부트 코드가 위치한다. 부트 코드는 점프 명령에 의해 실행되는데 이때 BPB 정보를 참조하여 파일시스템을 부팅한다. (NTLDR : NT Loader 실행) 부트 코드 실행과정에서 정상적이지 않은 동작이 발생할 경우 저장된 에러 메시지를 출력하게 된다.
각 BPB 영역에 대해 자세히 살펴보면 다음과같다.
[ FAT12/16/32 ] 공통된 데이터 구조
범위 | 설명 | |
10진수 | 16진수 | |
0 – 2 | 0x0000 – 0x0002 | Jump command to boot code (usually 0xEB5890) |
3 – 10 | 0x0003 – 0x000A | OEM ID (Win95=MSWIN4.0, Win98=MSWIN4.1, Win2K/XP/Vista=MSDOS5.0, Linux=mkdosfs) |
11 – 12 | 0x000B – 0x000C | Bytes per sector |
13 – 13 | 0x000D – 0x000D | Sectors per cluster |
14 – 15 | 0x000E – 0x000F | Reserved sector count (FAT12/16=1) |
16 – 16 | 0x0010 – 0x0010 | Number of FAT tables |
17 – 18 | 0x0011 – 0x0012 | Root directory entry count (FAT12/16=512, FAT32=0) |
19 – 20 | 0x0013 – 0x0014 | Total sector 16 (FAT12/16=variable, FAT32=0) |
21 – 21 | 0x0015 – 0x0015 | Media Type |
22 – 23 | 0x0016 – 0x0017 | FAT size 16 (FAT12/16=variable, FAT32=0) |
24 – 25 | 0x0018 – 0x0019 | Sector per track (typically 32 for hard drive) |
26 – 27 | 0x001A – 0x001B | Number of heads (typically 255 for hard drive) |
28 – 31 | 0x001C – 0x001F | Hidden sectors |
32 – 35 | 0x0020 – 0x0023 | Total sector32 |
[ FAT12/16 ] 추가적인 데이터 구조
범위 | 설명 | |
10진수 | 16진수 | |
36 – 36 | 0x0024 – 0x0024 | INT 0x13 drive number (Floppy=0x00, Hard Drvie=0x80) |
37 – 37 | 0x0025 – 0x0025 | Not used |
38 – 38 | 0x0026 – 0x0026 | Boot signature |
39 – 42 | 0x0027 – 0x002A | Volume serial number |
43 – 53 | 0x002B – 0x0035 | Volume label (ASCII) |
54 – 61 | 0x0036 – 0x003D | File system type |
62 – 509 | 0x003E – 0x01FD | Boot code and error message |
510 – 511 | 0x01FE – 0x01FF | Signature (0x55AA) |
[ FAT32 ] 추가적인 데이터 구조
범위 | 설명 | |
10진수 | 16진수 | |
36 – 39 | 0x0024 – 0x0027 | FAT size 32 |
40 – 41 | 0x0028 – 0x0029 | Ext flags |
42 – 43 | 0x002A – 0x002B | FAT32 volume version |
44 – 47 | 0x002C – 0x002F | Root directory cluster offset |
48 – 49 | 0x0030 – 0x0031 | FSINFO(File System INFOrmation) offset |
50 – 51 | 0x0032 – 0x0033 | Backup boot sector offset |
52 – 63 | 0x0034 – 0x003F | Reserved |
64 – 64 | 0x0040 – 0x0040 | INT 0x13 drive number (Floppy=0x00, Hard Drive=0x80) |
65 – 65 | 0x0041 – 0x0041 | Not used (typically 0) |
66 – 66 | 0x0042 – 0x0042 | Boot signature |
67 – 70 | 0x0043 – 0x0046 | Volume serial number |
71 – 81 | 0x0047 – 0x0051 | Volume label (ASCII) |
82 – 89 | 0x0052 – 0x0059 | File system type |
90 – 509 | 0x0060 – 0x01FD | Boot code and error message |
510 – 511 | 0x01FE – 0x01FF | Signature (0x55AA) |
다음 그림은 실제 필자의 컴퓨터를 FAT32로 포맷한 후 덤프한 결과이다.
위의 부트 섹터는 볼륨의 0번째 섹터이다. FAT32의 경우에는 부트 섹터가 손상될 것을 대비하여 6번째 섹터에 내용을 백업해 둔다. 따라서, 파티션 복구 도구들의 경우에 부트 섹터가 정상적이지 않을 경우 백업되어 있는 부트 섹터를 복사하여 사용하여 복구하곤 한다.
2. FSINFO(File System INFOrmation)
FSINFO는 일반적으로 1번째 섹터(부트 섹터 다음)에 저장되는 구조로 7번째 섹터에 내용을 백업해 둔다. 이것의 위치는 BPB에 정의되어 있기 때문에 임의로 지정이 가능하다. FSINFO 구조의 용도는 운영체제에게 첫 비할당 클러스터의 위치와 전체 비할당 클러스터의 수를 알려준다.
이것이 무슨 의미가 있을까? 우선 첫번재 비할당 클러스터의 위치를 알려줌으로써 해당 볼륨에 저장하고자 하는 파일을 빠르게 할당할 수 있도록 도와준다. 그리고 전체 비할당 클러스터의 수를 통해 해당 파일이 볼륨에 할당 가능한지 여부도 알 수 있다. 특정 볼륨에 파일을 복사할 경우 여유 공간이 있는지 없는지를 파악하기 위해서는 기존에는 FAT 영역 전체를 검색해봐야 했다. 하지만 FSINFO 구조때문에 볼륨의 여유 공간을 빠르게 파악할 수 있다. 다음은 FSINFO 섹터의 데이터 구조이다.
범위 | 설명 | |
10진수 | 16진수 | |
0 – 3 | 0x0000 – 0x0003 | Signature (0x41615252) |
4 – 483 | 0x0004 – 0x01E3 | Not used |
484 – 487 | 0x01E4 – 0x01E7 | Signature (0x61417272) |
488 – 491 | 0x01E8 – 0x01EB | Number of free clusters |
492 – 495 | 0x01EC – 0x01EF | Next free cluster |
496 – 509 | 0x01F0 – 0x01FD | Not used |
510 – 511 | 0x01FE – 0x01FF | Signature (0x55AA) |
다음은 필자의 볼륨에서 FSINFO 섹터를 확인한 것이다. 내용에서 알 수 있듯이 여유 클러스터의 수는 0x032D70(208240) 이고, 첫 여유 클러스터의 주소는 0x48E1(18657) 이다.
3. 추가적인 예약된 영역
앞서 부트 섹터는 0, 6번 섹터를 사용하고, FSINFO는 1, 7번 섹터를 사용한다고 했다. 이외에도 2번 섹터는 부트 섹터의 부트 코드 영역이 부족할 경우 추가적으로 사용할 수 있는 섹터이다. 그리고 이 내용은 8번에 백업해 둔다. 이렇게 기본적으로 FAT32는 0, 1, 2, 6, 7, 8번의 섹터를 사용한다.
결과적으로 총 32섹터 중 6개 섹터만 사용하고 나머지 섹터는 만약을 대비해 예약되어 있다. 따라서 이러한 섹터는 일반적으로 어플리케이션에서 접근하지 않기 때문에 간혹 예약된 나머지 영역에 데이터를 숨겨두는 경우도 있다.
그렇다면 항상 FAT32에서 예약된 영역을 32섹터를 가질까? 다음은 필자의 USB를 FAT32로 포맷한 후 EnCase를 통해 해당 볼륨을 살펴본 것이다. 보는 바와 같이 예약된 영역이 38섹터의 크기를 가지고 있다. 결국, 예약된 영역은 장치 타입이나 포맷 소프트웨어에 따라 변할 수 있기 때문에 반드시 부트 섹터의 오프셋 14-15의 예약된 영역 섹터 수를 확인한 후 접근해야 한다.
0 개의 댓글