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
<aside>
💡 FAT_FS 구조체의 fat_length
와 data_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;
}
FAT 테이블의 각 클러스터가 할당되었는지 여부를 관리하는 fat_bitmap
비트맵을 만들어준다. 마치 FFS에서 우리가 많이 본 데이터 영역 비트맵과 같은 역할을 해 준다.
이제 이 비트맵 테이블을 통해 디스크 내에서 비어 있는 클러스터를 파악할 수 있고, 우리가 데이터를 할당해줄 수 있다.
fat.c에 선언
struct bitmap* fat_bitmap;