FAT 파일 시스템을 아래 그림과 같이 구현한다.

FAT Filesystem(디스크)

fat_start = 1
total_sectors = 8
fat_sectors = 3
data_start = 4
fat_length = 4 -> FAT table의 인덱스 개수

				+-------+-------+-------+-------+-------+-------+-------+-------+
				|Boot   |       FAT Table       |          Data Blocks          |
		    |Sector |       |       |       |       |       |       |       |
				+-------+-------+-------+-------+-------+-------+-------+-------+
sector :    0       1       2       3       4       5       6       7     
cluster:                                    1       2       3       4

fat_fs_init() 구현

<aside> 💡 FAT_FS 구조체의 fat_lengthdata_start 필드를 초기화해준다.

</aside>

fat_length : FAT 테이블의 인덱스 개수 = 파일 시스템 내 데이터 영역의 클러스터의 개수

data_start : 파일 시스템 내에서 데이터 블록 영역의 시작 클러스터 번호

클러스터란 디스크 내에서 저장을 위해 할당하는 데이터 단위를 의미한다. 따라서 데이터 블록 영역이 시작되면서부터 클러스터가 1번을 시작으로 할당된다고 생각하면 편할 듯 하다.

fat_length가 FAT 테이블의 인덱스 개수임에 주의하자. 얼핏 생각했을 땐 디스크 내에서 FAT 테이블이 차지하는 섹터의 개수로 오해할 수 있다. 디스크 내 FAT 테이블의 크기는 fat_sectors로 이미 fat_boot_create() 등에서 초기화해준다.

즉 이 함수는 해당 FAT 테이블의 데이터 영역 시작 섹터를 알려주고 FAT 테이블의 총 인덱스 길이를 정함으로써 FAT 테이블을 만들 수 있는 발판을 마련한다.

void fat_fs_init (void) {
	fat_fs->data_start = fat_fs->bs.fat_start + fat_fs->bs.fat_sectors;
	fat_fs->fat_length = sector_to_cluster(disk_size(filesys_disk)) - 1;
}

filesys/fat.c/sector_to_cluster() 구현

클러스터 번호에서 섹터 번호를 구한다. 클러스터 번호는 데이터 영역이 시작하는 섹터부터 1로 정해 놓는다.

cluster_t sector_to_cluster (disk_sector_t sector) {
	ASSERT(sector >= fat_fs->data_start);

	return sector - fat_fs->data_start + 1;
}

struct bitmap* fat_bitmap & get_empty_cluster() 구현

FAT 테이블의 각 클러스터가 할당되었는지 여부를 관리하는 fat_bitmap 비트맵을 만들어준다. 마치 FFS에서 우리가 많이 본 데이터 영역 비트맵과 같은 역할을 해 준다.

이제 이 비트맵 테이블을 통해 디스크 내에서 비어 있는 클러스터를 파악할 수 있고, 우리가 데이터를 할당해줄 수 있다.

fat.c에 선언

struct bitmap* fat_bitmap;