본문 바로가기

(비정기) Dlbo's Post

파일시스템 - 03. FAT 12, FAT 16! FAT 엔트리 부분?

포스트가 쪼까 늦었네요; 아마 다음 포스트는 대략 금요일이나 토요일즈음 올라가지 싶습니다.

------------------------------------------------------------------------------------------------------------------

FAT12와 FAT16은 FAT엔트리가 각각 12, 16비트로 구성된 파일시스템입니다.

12비트로 구성된 FAT12는 주로 용량이 적은 플로피디스켓에, 16비트로 구성된 FAT16은 윈도95, 98시절 사용하던 소용량의

하드디스크에 쓰이던 파일 시스템이지요.

두 시스템이 공통적으로 갖는 부분은 "최초 1섹터인 512바이트가 부트 코드 블록" 이라는 겁니다.(사실 FAT계열은 다 이래요;)

이 부분은 BPB(Bios Parameter Block)으로도 불리우며, 이 자리에 어떤 OS를 메모리에 올릴 지, 부팅시 어떤 동작을 할 지가

쓰이게 됩니다.

최초 1섹터 BPB에 기록된 내용을 FAT16을 기준으로 보자면 아래와 같은 내용이 됩니다.

  1. 0~2비트 : 점프 부트 코드 - OS가 있다면 OS의 시작코드로 점프하라는 의미의 명령어가 자리잡고 있습니다.
  2. 3~10비트 : OEMName - OS, 혹은 하드디스크의 이름이 기입되는 부분입니다.
  3. 11~12비트 : 섹터의 크기 - 1개 섹터에 몇 바이트가 들어가는지를 의미하며, 일반적으로 512를 기입합니다. 윈도우에 인식되려면 512를 기입하며, 1024, 2048, 4096까지 기입 가능합니다.
  4. 13비트 : 클러스터의 크기 - 1개 클러스터에 몇개의 섹터가 들어가느냐를 표기합니다. 일반적으로 32를 넣으며, 2의 배수를 넣어야 합니다.
  5. 14~15비트 : 예약된 섹터의 개수 - FAT엔트리가 나오기 전 까지 일정 부분은 0으로 초기화 되어 있어야 함을 의미합니다.
  6. 16비트 : FAT엔트리의 개수 - FAT엔트리 집합은 2개 이상이어야 엔트리 부분이 고장나더라도 다른 사본을 이용해 간접 접근이 가능합니다. 보통 2의 값을 넣습니다.
  7. 17~18비트 : 루트 디렉터리의 크기 - FAT12, 16은 이 영역에 설정한 만큼만 루트 디렉터리에 저장이 가능합니다. FAT32 이후로는 이 영역이 0이 되어야 하며, 보통 FAT16의 경우는 512를 기록합니다.

FAT시리즈 파일시스템의 공통된 부분은 여기까지입니다.

이후의 FAT 영역(FAT 엔트리 집합)은 FAT 엔트리와 클러스터 크기, 하드디스크의 용량에 의해 크기가 결정되며, 이를 BPB에서 설정하지요.

FAT영역이 끝나는 순간부터가 실질적으로 하드디스크에서 쓸 수 있는 용량부분이라고 보면 됩니다.

파일의 이름이나 용량 등에 관한 정보는 모두 FAT엔트리에 보관되며, 하드디스크의 실제 쓸 수 있는 클러스터 영역에는 파일의

실제 내용만 기입되고, FAT 엔트리의 내용에 따라 OS나 프로그램이 파일을 읽어들이게 되지요.

저번 포스트나 이 포스트의 초반부에 말했듯, FAT12는 이 엔트리가 12비트로, FAT16은 16비트로 설정되어 있습니다.

특별한점은, FAT12의 경우 이도저도 아닌 애매한 12비트로 되어 있기 때문에 3바이트(24비트)단위로 읽어들여서 2개 엔트리로

파싱해 사용해야 한다는 점이 있습니다.

FAT16의 경우는 2바이트로 바로 불러들여서 1개 단위로 처리가 가능하지요.

이러한 FAT 엔트리들은....

참 신기하게도 2번부터 시작합니다. -_-

0번 엔트리의 위치에 Media Type, 즉 "이게 뭔 종류느냐"를 표기하고, 1번 엔트리에는 파티션 타입을 담는 내용이 들어옵니다.

이후 2번 엔트리가 실질적 하드디스크의 첫 위치를 표기하게 되지요. 일반적으로 2번 엔트리가 하드디스크의 루트 디렉터리를 가르키게 됩니다.

참고

위 링크를 타고 가면 엔트리에 들어가는 내용중, 여러 클러스터에 걸치게 되는 파일은 엔트리에 나온 다음 클러스터 번호를 타고

이동하며 체크한다는 내용이 있습니다.

FAT16 기준 0x0000이 들어가 있다면 빈 클러스터, 0x0001, 0xFFF0~0xFFF6이 들어있다면 예약된 클러스터이며

0x0002~ 0xEEEF라면 다음 엔트리에 연결된 클러스터 번호를 의미합니다.

0xFFF7은 불량 클러스터를 의미하며, 배드 섹터가 위치한 클러스터입니다.

0xFFF8 이후의 값은 EoC(End of Cluster)로, 이 파일의 끝이 이 클러스터에 존재한다는 의미입니다.

이런 시스템 형태로 인해 FAT의 경우 1 클러스터의 512 바이트중 1바이트짜리 파일이라면 어쩔 수 없이 512바이트를 사용하게

되어 있지요.

엔트리 부분은 이러하게 생겼답니다.

-------------------------------------------------------------------------------------------------------------------

뭔가 여전히 허술하다는 느낌을 지울 수가 없네요.

-_-;

다음번엔 FAT 영역이 끝난 직후인 데이터 영역에서 데이터를 찾는 방법과 FAT 엔트리의 상세 내용을 쓰도록 하겠습니다.