본문 바로가기

보안/파일시스템

FAT

FAT

1. 정의 :

- 파일 할당 테이블(File Allocation Table, FAT)
- 디지털 카메라 메모리카드, 많은 컴퓨터 시스템에 널리 쓰이는 컴퓨터 파일 시스템 구조
- 비교적 간단 : 플로피 디스크, 플래시 메모리 카드, 디지털 카메라에서 흔하게 볼 수 있음
- 성능이 좋지 않음 
     - 단순한 자료 구조를 이용하고 조그마한 파일이 많이 있으면 디스크 공간을 잘 활용 못함

2. 기타 용어 : 

클러스터 :
- 하드디스크에 파일을 저장하는 논리적 단위.
-
파일은 기본적으로 하나 이상의 클러스터를 차지하게 됨
- 클러스터는 FAT에 의해 관리되므로 일렬로 저장될 필요가 없음
-  FAT16은 514 MB 크기가 최대이다 (2^16 * 8192 : 8192바이트가 최대 클러스터 크기)
- 2^16은 65536 이므로 FAT16은 최대 65536개의 클러스터를 저장할 수 있음
- 다음에 나온 FAT32 는 2테라 바이트까지 저장 가능

3. Physical Layout :

 -  FAT는 다음과 같은 파일 시스템을 가짐

 - 기본적으로 여기에 없는 Boot Record가 존재
     - 볼륨의 첫번째 섹터 또는 예약된 영역의 첫번째 섹터에 저장
     - 윈도우즈를 부팅하기 위한 기계어코드와 FAT 파일시스템의 여러 설정값들이 저장
     - BPB(Bios Parameter Block) 라고도 함.

-보통 차지하는 비중은 다음과 같음

4. Reserved Area

 - FAT16 
    - 예약된 영역의 크기 : 1섹터
    - 용도 :
        - 첫번째 섹터만 부트 레코드 저장
        - 나머지 섹터는 사용되지 않지만 0으로 초기화시킴

 - FAT32
    - 예약된 영역의 크기 : 32섹터
    - 용도 :
        - 첫번째 섹터에 부트 레코드 저장
        - 두번째 섹터에 FSInfo 구조체 저장
        - 여섯번째 섹터에 부트 레코드 사본 저장
        - 나머지 섹터는 사용되지 않지만 0으로 초기화시킴

 - Boot Sector : VBR(Volume Boot Record) 구조를 살펴보면 아래와 같음

 - Jump Boot Code : 
     - Offset : 0~ 2
     - Size : 3 Byte
     - Value : EB 3C 90
     - 설명 :  
        - 부트 코드로 점프하라는 명령어.
        - x86 계열 PC는 부팅 시 이 항목을 읽어서 부트 코드가 있는 영역으로 점프함.
        - 해당 볼륨을 이용해서 부팅할 일이 없으면 어떤 값이 와도 무방함.

 - OEM ID : 
     - Offset : 3~ 10
     - Size : 8 Byte
     - Value : 제한없음
     - 설명 :  
        - OEM 회사를 나타내는 문자열 (아무거나 적어도 됨)

 - Bytes Per Sector : 
     - Offset : 11 ~ 12
     - Size : 2 Byte
     - Value : 512
     - 설명 :  
        - 섹터 당 바이트 수
        - 512, 1024, 2048, 4096 만 가능
        - 512 추천

 - Sector Per Cluster : 
     - Offset : 13
     - Size : 1 Byte
     - Value : 32
     - 설명 :  
        - 클러스터 당 섹터 수
        - 0 보다 커야하고 2의 배수여야함
        - 클러스터 크기 = 
Sector Per Cluster *  Bytes Per Sector

 - Reserved Sector Count : 
     - Offset : 14 ~ 15
     - Size : 2 Byte
     - Value : FAT16 : 1,  FAT32 : 32
     - 설명 :  
        - 예약된 영역의 섹터 수
        - 최소 1개 이상의 섹터 이상(부트 레코드가 첫 번째 섹터에 있으므로)
        - Reserved area에 부트 레코드나 특별한 정보가 없다면 0으로 초기화

 - Number of FATs : 
     - Offset : 16
     - Size : 1 Byte
     - Value : 2
     - 설명 :  
        - 볼륨에 있는 FAT 영역의 수, 최소한 1 이상

 - Root Directory Entry Count : 
     - Offset : 17 ~ 18
     - Size : 2 Byte
     - Value : FAT16 : 512 ,FAT32 : 0
     - 설명 :  
        - 루트 디렉토리에 있는 엔트리 수용 개수

 - Total Sector 16 : 
     - Offset : 19 ~ 20
     - Size : 2 Byte
     - Value : FAT16 : 가변적, FAT32 : 0
     - 설명 :  
        - 볼륨 상의 총 섹터 수. (저장장치의 섹터 수 X)
        - 이 항목이 0이면 Total Sector 32는 0이 되어서는 안 된다.
        - FAT16이라도섹터 수가 0xFFFF 초과 시 Total Sector 32를 이용해야 한다.

 - Media : 
     - Offset : 21
     - Size : 1 Byte
     - Value : 0xF8
     - 설명 :  
        - 어떤 미디어에 저장되어 있는지 나타냄
        - 여기서 미디어란 동영상이 아니라 저장장치를 뜻함
        - USB를 포함한 고정식 디스크 같은 경우 F8이다.

 - FAT Size 16 : 
     - Offset : 22 ~ 23
     - Size : 2 Byte
     - Value : 
FAT16 : 가변적, FAT32 : 0
     - 설명 :  
        - FAT 영역의 1개의 섹터 수 (FAT영역이 2개라도 합친 값이 아닌 1개의 섹터 수 이다)
        - FAT32에서는 반드시 0이다.

 - Sector per Track : 
     - Offset : 24 ~ 25
     - Size : 2 Byte
     - Value : 63
     - 설명 : 
        - 저장장치의 트랙 당 섹터 수 
        - x86 프로세서 계열에서 발생하는 인터럽트(INT) 0x13을 위해 존재하는 항목
        - (Windows 계열에서는 더 이상 이 항목을 참조하지 않음)

 -Number of Heads : 
     - Offset : 26 ~ 27
     - Size : 2 Byte
     - Value : 255
     - 설명 : 
        - 저장장치의 헤더 수 
        - x86 프로세서 계열에서 발생하는 인터럽트(INT) 0x13을 위해 존재하는 항목
        - (Windows 계열에서는 더 이상 이 항목을 참조하지 않음)

 - Hidden Sector : 
     - Offset : 28 ~ 31
     - Size : 4 Byte
     - Value : 32
     - 설명 : 
        - 볼륨 앞에 존재하는 숨겨진 섹터 수를 저장
        - 파티션 되지 않은 볼륨에는 반드시 0
        - x86 프로세서 계열에서 발생하는 인터럽트(INT) 0x13을 위해 존재하는 항목
        - (Windows 계열에서는 더 이상 이 항목을 참조하지 않음)

 - Total Sector 32 : 
     - Offset : 32 ~ 35
     - Size : 4 Byte
     - Value : 가변적

     - 설명 :  
        - 볼륨 상에 있는 총 섹터 수
 (저장장치의 섹터 수 X)
        - FAT 32에서는 반드시 Total Sector 16을 이용하지 않고 이 값을 이용한다.
        - Total Sector 16과 이 값 둘 중에 어느 하나는 반드시 입력되어야 함



FAT 16 만 해당

 - Drive Number : 
     - Offset : 36
     - Size : 1 Byte
     - Value : 0x80

     - 설명 :  
        - 플로피 드라이브 0x0
        - 그 외의 대부분의 저장장치 0x80
        - x86 프로세서 계열에서 발생하는 인터럽트(INT) 0x13을 위해 존재하는 항목
        - (Windows 계열에서는 더 이상 이 항목을 참조하지 않음)

 - Reserved1
     - Offset : 37
     - Size : 1 Byte
     - Value : 0

     - 설명 :  
        - Windows NT 계열에서 쓰기 위해 만등 항목

        - 항상 0이다

 - Boot Signature
     - Offset : 38
     - Size : 1 Byte
     - Value : 0x29

     - 설명 :  
        - 확장 부트 서명

        - 여기서 끝이 아닌 이 항목 아래에 세 가지 항목이 추가 되었음을 의미
        - 항상 0x29이다

 - Volume ID
     - Offset : 39 ~ 42
     - Size : 4 Byte
     - Value : 가변적

     - 설명 :  
        - 볼륨 시리얼 번호
        - 고유의 임의의 시리얼 번호를 생성해서 기록

 - Volume Label
     - Offset : 43 ~ 53
     - Size : 11 Byte
     - Value : 가변적

     - 설명 :  
        - 볼륨 레이블
        - Windows에서 디스크 이름으로 쓰임
        - 루트 디렉토리에도 존재 ( 따라서 변경될 시 2곳 모두 바꾸어주어야 한다.)
        - 볼륨 레이블이 없을 경우 "NO NAME    "

 - File System Type
     - Offset : 54 ~ 61
     - Size : 8 Byte
     - Value : "FAT 16   ", 
"FAT 32   ", "FAT   " 중 적절한 문자열
     - 설명 :  
        - 파일 시스템 형식
        - 하지만 이 형식을 보고 FAT16인지 FAT32인지 판단하면 안된다.



FAT32 만 해당

 - FAT Size 32
     - Offset : 36 ~ 39
     - Size : 4 Byte
     - Value : 가변적

     - 설명 :  
        - FAT 영역의 섹터 수 
        - 1개의 FAT 영역의 섹터수를 적어야 한다.

 - Ext Flags 
     - Offset : 40 ~ 41
     - Size : 2 Byte
     - Value : 0x00

     - 설명 :  
        - FAT 테이블을 조작하려는 것에 대한 여러 설정 값
        - 여러개의 FAT 영역을 사용할 경우 설정 값

 - File System Version 
     - Offset : 42 ~ 43
     - Size : 2 Byte
     - Value : 0x00

     - 설명 :  
        - 상위 바이트 : 주 버전
        - 하위 바이트 : 부 버전
        - 지금까지 나온 버전은 전부 0x00

 - Root Directory Cluster 
     - Offset : 44 ~ 47
     - Size : 2 Byte
     - Value : 2

     - 설명 :  
        - 루트 디렉토리의 클러스터 값
        - 루트 디렉토리의 시작 위치를 적는다. (FAT32는 루트디렉토리가 어느 곳에 와도 상관없음)
        - 보통 2

 - File System Information
     - Offset : 48 ~ 49
     - Size : 2 Byte
     - Value : 2

     - 설명 :  
        - FSInfo 구조체가 어디에 저장되어 있는지 가리킴
        - 보통 볼륨의 2번 섹터

 - Boot Record Backup Sector
     - Offset : 50 ~ 51
     - Size : 2 Byte
     - Value : 6

     - 설명 :  
        - 부트 레코드 백업 위치
        - 보통 볼륨의 6번 섹터
        - 만약 0일 경우 백업을 하지 않겠다는 의미

 - Reserved 
     - Offset : 52 ~ 63
     - Size : 12 Byte
     - Value : 0

     - 설명 :  
        - 미래를 위해 예약된 영역
        - 0으로 채워져야함

 - Drive Number 
     - Offset : 64
     - Size : 1 Byte
     - Value : 0

     - 설명 :  
        - 미래를 위해 예약된 영역
        - 0으로 채워져야함
        - x86 프로세서 계열에서 발생하는 인터럽트(INT) 0x13을 위해 존재하는 항목
        - (Windows 계열에서는 더 이상 이 항목을 참조하지 않음)

 - Reserved1
     - Offset : 65
     - Size : 1 Byte
     - Value : 0

     - 설명 :  
        - Windows NT 계열에서 사용하려고 만든 항복
        - 0으로 채워져야함

- Boot Signature
     - Offset : 66
     - Size : 1 Byte
     - Value : 0x29

     - 설명 :  
        - 확장 부트 서명

        - 여기서 끝이 아닌 이 항목 아래에 세 가지 항목이 추가 되었음을 의미
        - 항상 0x29이다

 - Volume ID
     - Offset : 67 ~ 70
     - Size : 4 Byte
     - Value : 가변적

     - 설명 :  
        - 볼륨 시리얼 번호
        - 고유의 임의의 시리얼 번호를 생성해서 기록

 - Volume Label
     - Offset : 71 ~ 81
     - Size : 11 Byte
     - Value : 가변적

     - 설명 :  
        - 볼륨 레이블
        - Windows에서 디스크 이름으로 쓰임
        - 루트 디렉토리에도 존재 ( 따라서 변경될 시 2곳 모두 바꾸어주어야 한다.)
        - 볼륨 레이블이 없을 경우 "NO NAME    "

 - File System Type
     - Offset : 54 ~ 61
     - Size : 8 Byte
     - Value :
"FAT32   "
     - 설명 :  
        - 파일 시스템 형식
        - 그냥 FAT32   라고 적음



공통

 - Signature

     - Offset : 508 ~ 511
     - Size : 4 Byte
     - Value : 0xAA550000 

     - 설명 :  
        - 부트 레코드가 손상되었는지 판단하기 위한 용도.
        - 다른 값이 적혀 있을 시 망가졌다고 판단.



참고

 - 문자열을 입력하는 곳의 빈칸은 0x0이 아닌 스페이스를 나타내는 0x20으로 입력해야 한다.



정리



 - FSinfo(file system information) 섹터 :구조를 살펴보면 아래와 같음


 - Lead Signature
     - Offset : 0 ~ 3
     - Size : 4 Byte
     - Value : 0x41615252

     - 설명 :  
        - FSinfo 섹터라는 것을 표시해줌
        - 값이 무조건 0x41615252이다.

 - Reserved1
     - Offset : 4 ~ 483
     - Size : 479 Byte
     - Value : 0

     - 설명 :  
        - 예약된 영역

 - Struct Signature
     - Offset : 484 ~ 487
     - Size : 4 Byte
     - Value : 0x61417272

     - 설명 :  
        - FSinfo 섹터라는 것을 표시해줌
        - 값이 무조건 0x61417272이다.

 - Free Cluster Signature
     - Offset : 488 ~ 491
     - Size : 4 Byte
     - Value : 가변적

     - 설명 :  
        - 볼륨 상에 존재하는 빈 클러스터의 수 저장
        - 정확한 값이 아니므로 참고로만 이용
        - 만약 값이 0xFFFFFFFF 라면 알 수 없는 상태

 - Free Cluster Signature
     - Offset : 492 ~ 495
     - Size : 4 Byte
     - Value : 가변적

     - 설명 :  
        - 해당 볼륨에 보다 빨리 빈 클러스터가 있는지 알아내기 위한 항목
        - 마지막으로 할당된 클러스터의 값이 여기 저장됨
        - 정확한 값이 아니므로 참고로만 이용
        - 만약 값이 0xFFFFFFFF 라면 아무것도 갱신된 사항이 없다는 의미
            - 빈 클러스터를 찾기 위해선 처음부터 찾기 시작해야 한다.

 - Reserved2
     - Offset : 496 ~ 507
     - Size : 12 Byte
     - Value : 0

     - 설명 :  
        - 예약된 영역

5. FAT Area

- 정의
    - Fila Allocation Table
    - 데이터 영역에 저장된 파일들의 클러스터 할당 관계를 보여주는 테이블

- 연결방식

- FAT영역 시작 부분

- FAT영역 시작 부분 예제


'보안 > 파일시스템' 카테고리의 다른 글

EXT4 (Extended File System 4)의 소개  (0) 2015.04.02
NTFS 파일 시스템  (0) 2015.03.19