Download presentation
Presentation is loading. Please wait.
1
FAT32 File System Structure
WiseGuyz codeflaws at gmail.com 홍정우
2
1. Layout BOOT CODE (446 byte FAT1 FAT2 FAT1 FAT2 Partition Table 1
알아야 할 것들. * 섹터 : 1sector는 512 byte * cluster : 1 cluster는 8 sector 즉 4096byte 파티션마다 변경 가능함 * 0xAA55 : MBR이나 PBR은 반드시 AA55로 끝나야 정상적인 디스크로 인식이 됨. 단순한 시그니쳐. * 향후 설명되는 모든 바이트들은 little endian기준이므로 0xAA55라면 실제로 디스크에는 55 AA 라고 기록됨. * 본 그림은 전체적인 레이아웃만을 설명하기 위한 것이므로, 크기에 대한 개념은 무시해도 무관함. 실제로 MBR을 엄청 크게 그렸지만 MBR과 PBR은 전체 디스크에서 보면 도식화 하지 못 할정도로 작은 부분임. MBR과 PBR은 512byte로 크기가 같지만 그림에선 전체 개념도를 위해 크기를 다르게 나타냄. * 하나의 디스크는 파티션을 4개 가질 수 있고,현재 도식화된 그림에는 2개의 파티션만 그려넣었지만 실제론 4개가 존재 할 수 있음. BOOT CODE (446 byte Partition Table 1 MBR (512byte) Partition Table 2 Partition Table 3 Partition Table 4 0xAA55 PBR RESERVED Area FAT1 FAT2 Root Entry PARTITION 1 Clusters PBR RESERVED Area FAT1 FAT2 PARTITION 2 Root Entry Clusters
3
1. Layout BOOT CODE (446 byte FAT1 FAT2 Partition Table 1 (Valid)
파티션을 나누지 않은 상태에서 파티션 테이블은 한 개만 정상이고, 나머지는 Invalid한 상태로 남게된다. ( 디스크를 구매하여 처음 사용하는 상태) 앞으로는 이 구조로 설명을 진행함 BOOT CODE (446 byte Partition Table 1 (Valid) MBR (512byte) Partition Table 2 (Invalid) Partition Table 3 (Invalid) Partition Table 4 (Invalid) Partition Table (16byte) 0xAA55 PBR RESERVED Area FAT1 FAT2 Root Entry PARTITION 1 Clusters
4
1. LAYOUT ( MBR ) BOOT CODE (446 byte FAT1 FAT2
: 디스크의 첫 1sector (512byte) 부팅을 위한 코드들이 들어 있으며, 그 뒤에는 파티션을 위한 테이블이 위치해 있다. 파티션 테이블은 4개가 존재하며, 각기 16 바이트이다. 즉 부팅코드 바이트짜리 파티션 테이블 4개 + 시그니쳐 2바이트 = 512 다른 건 볼게 없고, AA55 가 마지막에 와야 정상적인 디스크로 인식된다 라는 사실과, 파티션 테이블이 중요한데, 파티션 테이블이 어떻게 구성 되어 있는지 알아보자. BOOT CODE (446 byte Partition Table 1 (Valid) MBR (512byte) Partition Table 2 (Invalid) Partition Table 3 (Invalid) Partition Table 4 (Invalid) 0xAA55 PBR RESERVED Area FAT1 FAT2 Root Entry PARTITION 1 Clusters
5
1. LAYOUT (Partition Table Structure)
Boot Flag Type Code CHS BEGIN CHS End LBA BEGIN Number of Sector Partition Table (16byte) Type Code : 0x06 이면 이 파티션이 FAT16 0x0B 혹은 0x0C 이면 이 파티션이 FAT32 Boot Flag , CHS BEGIN , END 는 중요하지 않음. Number of Sector 의 4바이트가 해당 파티션이 가지고 있는 섹터의 크기임. 여기에 512를 곱하고 이를 1024*1024 로 나누면 이 파티션의 크기를 메가바이트 단위로 구할 수 있음. 이것도 별로 중요치 않음. LBA BEGIN 이 가지고 있는 4바이트가 해당 파티션의 시작 주소임.
6
1. LAYOUT (PARTITION) BOOT CODE (446 byte FAT1 FAT2
PBR : 파티션에 대한 정보들이 들어있다. BOOT CODE (446 byte 역할 OFFSET 값 한 섹터당 바이트수 0x0B 512로 고정 클러스터 당 섹터수 0x0D 보통 8 예약영역이 몇 섹터인지 0x0E 보통 0x20 FAT 의 개수 0x10 무조건 2 FAT 하나당 섹터수 0x24 하드마다 다름 루트엔트리의 위치 0x2c 보통 x 시그니쳐 0x1FE 0xAA55 고정 Partition Table 1 (Valid) MBR (512byte) Partition Table 2 (Invalid) Partition Table 3 (Invalid) Partition Table 4 (Invalid) Partition Table (16byte) 0xAA55 PBR RESERVED Area FAT1 FAT2 Root Entry PBR = 512 바이트 예약영역 크기 알 수 있음 FAT1 == FAT2 FAT1의 크기 알 수 있음. Cluster의 위치를 계산 할 수 있음. Clusters
7
1. LAYOUT (PARTITION) BOOT CODE (446 byte FAT1 FAT2
Reserved Area : 안 쓰는 영역 : PBR에 이 영역이 사용중인 섹터의 개수가 저장되어 있으므로, FAT1의 위치를 계산 할 수 있다. 즉, PBR , Reversed Area , FAT1 , FAT2는 고정적으로 붙어 있음. Root Entry 역시 붙어 있지만 FAT32에서는 루트 엔트리를 임의로 수정할 수 있음. 하지만 통상 붙어있음. BOOT CODE (446 byte Partition Table 1 (Valid) MBR (512byte) Partition Table 2 (Invalid) Partition Table 3 (Invalid) Partition Table 4 (Invalid) Partition Table (16byte) 0xAA55 PBR RESERVED Area FAT1 FAT2 Root Entry Clusters
8
1. LAYOUT (PARTITION) BOOT CODE (446 byte FAT1 FAT2
: 파일에 대한 클러스터 정보가 들어있음. FAT2는 단순히 FAT1의 복사본. BOOT CODE (446 byte Partition Table 1 (Valid) MBR (512byte) Partition Table 2 (Invalid) Partition Table 3 (Invalid) Partition Table 4 (Invalid) Partition Table (16byte) 0xAA55 PBR RESERVED Area FAT1 FAT2 Root Entry Clusters 0번 , 1번 클러스터는 사용되지 않음. 2번부터 사용됨.
9
1. LAYOUT (PARTITION) BOOT CODE (446 byte FAT1 FAT2
Root Entry : 루트디렉토리 , 즉 파티션의 최상위 디렉토리 정보가 들어 있음. 디렉터리 엔트리에 대해서 자세히 알아보자. BOOT CODE (446 byte Partition Table 1 (Valid) MBR (512byte) Partition Table 2 (Invalid) Partition Table 3 (Invalid) Partition Table 4 (Invalid) Partition Table (16byte) 0xAA55 PBR RESERVED Area FAT1 FAT2 Root Entry Clusters
10
1. LAYOUT (PARTITION) FAT1 FAT2 Clusters
루트 엔트리 (실제로는 디렉토리 엔트리 혹은 루트 디렉토리 라고 부름) 역시 테이블형식으로 구성되어 있다. 각 파일, 디렉토리 구조가 32바이트짜리 테이블로 나눠져 있음. 각 테이블의 스펙은 아래와 같다. PBR RESERVED Area FAT1 FAT2 Root Entry Clusters 우리는 확장자 (MP3를 파싱해야하므로) , 시작클러스터 상,하위 주소 만 알면 됨 또한, 각 테이블의 0x00 번째 값이 0xE5면 삭제된 파일이다. * 실제로 OS에서 파일을 삭제하면 파일 데이터 전체가 사라지는 것이 아니라 루트엔트리의 첫번째 값만 0xE5로 변경되는 것. -> 파일복구프로그램 별거아님.
11
1. LAYOUT (PARTITION) BOOT CODE (446 byte FAT1 FAT2
Clusters : FAT1 에 담긴 정보대로 실제 파일 데이터들이 위치하는 곳. BOOT CODE (446 byte Partition Table 1 (Valid) Partition Table 2 (Invalid) Partition Table 3 (Invalid) Partition Table 4 (Invalid) 0xAA55 PBR RESERVED Area FAT1 FAT2 Root Entry 루트 엔트리의 파일테이블에서 해당 파일의 시작클러스터 주소를 알아낼 수 있고, 그 클러스터 주소를 FAT1 테이블에 적용하여 Linked List로 따라가면 된다. Clusters
12
2. Trip to the Files 지금까지 알 수 있는 사실 실제 예제를 통해 알아보자
디스크의 시작으로 부터 0x1C6 에 첫번째 파티션에 대한 실제 파티션 주소가 들어 있음 실제 파티션 주소는 PBR 의 주소이고 PBR로부터 다음 정보를 추출할 수 있음 * PBR + ReservedArea의 크기 = FAT1의 주소 * FAT1의 주소 + (FAT 하나당 크기 * 2) = Root Entry의 위치 루트 엔트리에서 각 엔트리의 첫번째 바이트가 0xE5가 아니라면 실제로 존재하는 파일임. 실제로 존재하는 파일이라면 0x08 번째의 3바이트로 확장자를 알 수 있음 (MP3 , AVI , EXE …) 루트엔트리의 0x14 의 두 바이트 , 0x1A의 두 바이트를 상,하위 주소로 결합하여 실제 시작 클러스터의 위치를 알 수 있음. 실제 예제를 통해 알아보자
13
2. Trip to the Files BOOT CODE (446 byte FAT1 FAT2
Partition 테이블에서 LBA_BEGIN값을 참조하여 해당 파티션의 PBR 위치를 파악. 즉, 디스크의 시작점으로 부터 0x1C6 바이트 뒤에 있는 4바이트 값이 실제 첫 번째 파티션의 주소다. BOOT CODE (446 byte Partition Table 1 (Valid) LBA_BEGIN Partition Table 2 (Invalid) Partition Table 3 (Invalid) Partition Table 4 (Invalid) 0xAA55 PBR FAT1 FAT2 little endian 이며, 섹터에 대한 오프셋이므로, PBR = 0x000009d8 * 512 = 0x13b000 즉, 파티션1의 실제 오프셋은 0x13B000 이다. RESERVED Area Root Entry Clusters
14
2. Trip to the Files FAT1 FAT2 Clusters PBR Root Entry
역할 OFFSET 값 한 섹터당 바이트수 0x0B 512로 고정 클러스터 당 섹터수 0x0D 보통 8 예약영역이 몇 섹터인지 0x0E 보통 0x20 FAT 의 개수 0x10 무조건 2 FAT 하나당 섹터수 0x24 하드마다 다름 루트엔트리의 위치 0x2c 보통 x 시그니쳐 0x1FE 0xAA55 고정 PBR RESERVED Area FAT1 FAT2 Root Entry Clusters 0x200 = 512 보통 8 이고, 클러스터 당 섹터이므로 1클러스터는 8섹터이고 1섹터는 512바이트이므로 1클러스터는 4096 바이트 FAT1 , FAT2 두개 예약 영역의 크기 0x9C4섹터 = 0x 바이트 FAT1의 크기 = 0x3B1E 섹터 = 0x763C00 바이트
15
2. Trip to the Files FAT1 FAT2 0x763C00 PBR의 주소 : 0x13B000
RESERVED Area PBR의 주소 : 0x13B000 Reserved Area 크기 : 0x138800 Root Entry FAT1 , FAT2의 크기 : 0xEC7800 0x113B000 Clusters 0x763C00 Root Entry의 위치 : PBR 주소 + Reserved Area 크기 + FAT1,FAT2크기 = 0x13B x xEC7800 = 0x113B000 FAT1의 위치 : PBR주소 + Reserved Area 크기 = 0x13B x = 0x273800
16
2. Trip to the Files 하나의 파일 / 디렉토리 엔트리 32바이트 맨 앞자리가 0xE5이므로 이 파일은 삭제된 파일 맨 앞자리가 0xE5가 아니므로 실제로 존재하는 파일임. 파일명은 TEST1.MP3와 TEST2.MP3. TEST1.MP3의 경우 시작 클러스터가 0x 이다.
17
2. Trip to the Files 하나의 파일 / 디렉토리 엔트리 32바이트 맨 앞자리가 0xE5이므로 이 파일은 삭제된 파일 맨 앞자리가 0xE5가 아니므로 실제로 존재하는 파일임. 파일명은 TEST1.MP3와 TEST2.MP3. TEST1.MP3의 경우 시작 클러스터가 0x 이다. 하지만 0과 1번 클러스터는 사용하지 않으므로 ( 루트엔트리 영역으로 사용됨 ) 실제론 0x66번째 클러스터에 TEST1.MP3의 첫번째 4096바이트가 존재한다. 그렇다면 두번째 4096바이트는??
18
2. Trip to the Files 0x273800 + ( 4 * 0x68) = 0x2739A0
FAT1 의 첫 8바이트 ( 첫 두개의 클러스터 정보는 사용되지 않는다. , 루트엔트리가 클러스터 두개를 예약해둠. ) 0x ( 4 * 0x68) = 0x2739A0 즉, 0x68 을 첫 시작 클러스터로 하는 TEST1.MP3는 0x68->0x69->0x6A->0x6B -> ……. -> 0xBD -> 0x0FFFFFFF(끝) 으로 이뤄져 있다. 이 리스트를 따라서 클러스터데이터를 모으면 파일완성.
19
3. Real Demo
Similar presentations