struct fat_fs & struct fat_boot

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;    /* 디스크에서 루트 디렉토리가 저장된 클러스터의 번호 */
};

fat_init()

<aside> 💡 FAT 파일 시스템 fat_fs을 메모리에 할당한 후 FAT에 대한 정보들을 초기화한다.

</aside>

디스크의 Boot Sector의 데이터를 읽어와 메모리에 올리게 되는데, 이 때 부트 섹터의 정보들은 FAT 파일 시스템 구조체 안의 FAT_BOOT 구조체에 저장된다.

그 후 FAT 필드 중 fat_lengthdata_startfat_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_create()

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_create()

fat_boot_create()fat_fs_init()를 이용해 FAT 파일시스템의 boot block 내용과 필드들을 초기화한다.