fat_fs는 FAT 파일 시스템의 정보를 담고 있는 구조체다. 파일 시스템 맨 첫 블록은 Boot Block으로, 맨 처음 컴퓨터가 실행을 시작하거나 재부팅할 때 실행되는 부트스트랩 프로그램 및 초기 변수들을 담고 있다.
/* FAT 파일 시스템의 정보를 담고 있는 구조체 */
struct fat_fs {
struct fat_boot bs; /* Boot block. 디스크 섹터 크기보다 작아야 함(Atomicity를 위해?) */
unsigned int *fat; /* FAT 테이블의 시작 주소 */
unsigned int fat_length; /* FAT 파일 시스템을 이루는 클러스터의 개수 */
disk_sector_t data_start; /* 데이터 블록 영역의 시작 섹터 번호 */
cluster_t last_clst; /* ?? */
struct lock write_lock;
};
struct fat_boot {
unsigned int magic; /* 해당 파일 시스템이 오염되었는지를 확인하는 기준점 */
unsigned int sectors_per_cluster; /* Fixed to 1 */
unsigned int total_sectors;
unsigned int fat_start;
unsigned int fat_sectors; /* Size of FAT in sectors. */
unsigned int root_dir_cluster; /* 디스크에서 루트 디렉토리가 저장된 클러스터의 번호 */
};
<aside> 💡 FAT 파일 시스템 fat_fs을 메모리에 할당한 후 FAT에 대한 정보들을 초기화한다.
</aside>
디스크의 Boot Sector의 데이터를 읽어와 메모리에 올리게 되는데, 이 때 부트 섹터의 정보들은 FAT 파일 시스템 구조체 안의 FAT_BOOT
구조체에 저장된다.
그 후 FAT 필드 중 fat_length
와 data_start
는 fat_fs_init()
함수에서 초기화해준다.
FAT_BOOT_SECTOR의 값은 0이다. 즉, FAT 파일 시스템에서 맨 첫 블록(섹터)는 부트 섹터가 차지하고 있다는 것을 알 수 있다.
void fat_init (void) {
fat_fs = calloc (1, sizeof (struct fat_fs)); /* FAT 메모리 할당 */
if (fat_fs == NULL)
PANIC ("FAT init failed");
// Read boot sector from the disk to main memory struct fat_fs->fat_boot
unsigned int *bounce = malloc (DISK_SECTOR_SIZE);
if (bounce == NULL)
PANIC ("FAT init failed");
disk_read (filesys_disk, FAT_BOOT_SECTOR, bounce);
memcpy (&fat_fs->bs, bounce, sizeof (fat_fs->bs));
free (bounce);
// 만약 Boot Block의 정보가 오염되었다면 다시 새로 초기화해준다.
if (fat_fs->bs.magic != FAT_MAGIC)
fat_boot_create ();
fat_fs_init ();
}
FAT의 섹터 개수를 정하고 Boot Block에 대한 정보를 초기화한다.
fat_sectors는 FAT 테이블이 차지하는 디스크 섹터 개수를 의미한다.
이를 보면 FAT 파일 시스템의
void fat_boot_create (void) {
unsigned int fat_sectors =
(disk_size (filesys_disk) - 1)
/ (DISK_SECTOR_SIZE / sizeof (cluster_t) * SECTORS_PER_CLUSTER + 1) + 1;
fat_fs->bs = (struct fat_boot){
.magic = FAT_MAGIC,
.sectors_per_cluster = SECTORS_PER_CLUSTER,
.total_sectors = disk_size (filesys_disk), /* FAT 파일 시스템의 전체 디스크 섹터 개수 */
.fat_start = 1, /* FAT 테이블이 시작되는 디스크 섹터 번호 */
.fat_sectors = fat_sectors, /* FAT 테이블이 차지하는 디스크 섹터 개수 */
.root_dir_cluster = ROOT_DIR_CLUSTER, /* 루트 디렉토리의 클러스터 번호 */
};
}
fat_boot_create()
와 fat_fs_init()
를 이용해 FAT 파일시스템의 boot block 내용과 필드들을 초기화한다.