[Operating Systems] FAT12 파일 시스템 구조 분석

FAT12 파일 시스템의 구체적인 구조와 파일 할당 테이블이 어떻게 동작하는지 분석해보고자 한다.


💾 FAT12 파일 시스템이란?

FAT12는 12비트를 사용해서 클러스터를 관리하는 간단한 구조의 파일 시스템이다.

주로 플로피 디스크 같은 소용량 저장 매체에서 사용되었으며, 구조가 단순해서 파일 시스템의 기본 원리를 학습하기에 적합하다.

  • 12비트 클러스터 주소: 최대 4,096개의 클러스터 관리 가능
  • 소용량 최적화: 1.44MB 플로피 디스크 등에 적합
  • 단순한 구조: 이해하기 쉬운 선형적 레이아웃

🏗️ FAT12 물리적 구조

FAT12는 디스크를 4개의 주요 영역으로 나누어 관리한다.

부트 섹터, FAT 영역, 루트 디렉토리, 데이터 영역 이렇게 4가지 주요 영역이 있다.

🚀 부트 섹터 (Boot Sector)

첫 번째 섹터에 위치하며, 파일 시스템의 기본 정보를 포함한다.

const bootSector = {
  bytesPerSector: 512, // 섹터당 바이트 수
  sectorsPerCluster: 1, // 클러스터당 섹터 수
  numberOfFATs: 2, // FAT 테이블 개수
  rootEntries: 224, // 루트 디렉토리 최대 엔트리
  totalSectors: 2880, // 전체 섹터 수
};

📋 FAT 영역 (File Allocation Table)

각 클러스터의 사용 상태와 연결 정보를 관리하는 테이블이다.

const fatTable = [
  0xff0, // 클러스터 0: 예약됨
  0xfff, // 클러스터 1: 예약됨
  0x003, // 클러스터 2: 다음 클러스터는 3번
  0xfff, // 클러스터 3: 파일의 마지막 클러스터
  0x000, // 클러스터 4: 빈 클러스터
];

특수 값들:

  • 0x000: 빈 클러스터 (사용 가능)
  • 0xFF8-0xFFF: 파일의 마지막 클러스터
  • 0x002-0xFEF: 다음 클러스터 번호

📁 루트 디렉토리 (Root Directory)

최상위 디렉토리의 파일과 폴더 목록을 저장한다. 각 파일마다 32바이트 엔트리를 가진다.

const directoryEntry = {
  filename: "HELLO   ", // 8바이트: 파일명
  extension: "TXT", // 3바이트: 확장자
  attributes: 0x20, // 1바이트: 파일 속성
  startCluster: 0x0003, // 2바이트: 시작 클러스터 번호
  fileSize: 1024, // 4바이트: 파일 크기
};

💿 데이터 영역 (Data Area)

실제 파일 내용이 저장되는 영역으로, 클러스터 단위로 관리된다.


🔗 클러스터와 섹터

  • 섹터: 디스크에서 데이터를 읽고 쓰는 가장 작은 물리적 단위로, 일반적으로 512바이트 크기이다.
  • 클러스터: 파일 시스템에서 파일 저장 단위로 사용하는 논리적 단위이며, 하나 이상의 섹터로 구성된다.
const SECTOR_SIZE = 512; // 섹터 크기 (바이트 단위)
const SECTORS_PER_CLUSTER = 1; // 클러스터 당 섹터 수
const CLUSTER_SIZE = SECTOR_SIZE * SECTORS_PER_CLUSTER; // 클러스터 크기 (바이트 단위)

🔄 파일 할당 원리

  • 파일 저장 과정

    1. 빈 클러스터 찾기: FAT 테이블에서 값이 0x000인 빈 클러스터를 찾는다.
    2. 데이터 저장: 해당 클러스터에 파일 데이터를 저장한다.
    3. FAT 테이블 업데이트: 클러스터들의 연결 정보를 기록하여 파일이 저장된 위치를 연결한다.
    4. 디렉토리 엔트리 생성: 루트 디렉토리에 파일 정보(파일명, 시작 클러스터 등)를 추가한다.
  • 파일 읽기 과정

    1. 파일 찾기: 루트 디렉토리에서 파일명을 검색한다.
    2. 시작 클러스터 확인: 디렉토리 엔트리에서 파일의 시작 클러스터 번호를 읽는다.
    3. 클러스터 체인 따라가기: FAT 테이블을 참조해 연결된 모든 클러스터의 데이터를 순서대로 읽는다.
    function readFile(filename) {
      // 1. 디렉토리에서 파일 찾기
      const entry = findFileInDirectory(filename);
    
      // 2. 클러스터 체인 따라가며 데이터 읽기
      let content = "";
      let currentCluster = entry.startCluster;
    
      while (currentCluster < 0xff8) {
        content += readClusterData(currentCluster);
        currentCluster = fatTable[currentCluster]; // 다음 클러스터
      }
    
      return content;
    }
    

Leave a comment