[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; // 클러스터 크기 (바이트 단위)
🔄 파일 할당 원리
-
파일 저장 과정
- 빈 클러스터 찾기: FAT 테이블에서 값이 0x000인 빈 클러스터를 찾는다.
- 데이터 저장: 해당 클러스터에 파일 데이터를 저장한다.
- FAT 테이블 업데이트: 클러스터들의 연결 정보를 기록하여 파일이 저장된 위치를 연결한다.
- 디렉토리 엔트리 생성: 루트 디렉토리에 파일 정보(파일명, 시작 클러스터 등)를 추가한다.
-
파일 읽기 과정
- 파일 찾기: 루트 디렉토리에서 파일명을 검색한다.
- 시작 클러스터 확인: 디렉토리 엔트리에서 파일의 시작 클러스터 번호를 읽는다.
- 클러스터 체인 따라가기: 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