컴퓨터 시스템/OS

컴퓨터 시스템/OS [WIL] 컴퓨터 운영체제 ' File System' (pintos project 4) - 작성 중

Campkim 2021. 10. 30. 02:33

pintos 마지막 주차다. 마지막 주차인데 구현할게 많은데 다른 주차에 대비해서 시간이 많지 않은 것 같다. 

제대로 공부하고 배운내용을 잘 정리할 수 있을지 잘모르겠다 우선 의식의 흐름대로 배운걸 작성해야 할 것 같다.

 

오늘은 일단 시작 전에 테스트 케이스가 어떻게 돌아가는지 확인하고 수정해보려고 돌려봤는데.. 

1 - 3주차까지 통과시켜놓았던 테스트 케이스가 다시 모두 fail 나는 것을 확인했다.

핀토스 part 4 초기 상황

이 부분만 보면 파일시스템이 뭔가 제대로 작동하지 않고 있다는 추론이 가능했다. 

4일차 최종.... 또 만나자 핀토스......

파일시스템에 대해 자료를 찾아 공부하고 FAT 시스템이 작동하게끔 코드를 수정하니 기존에 pass하던 test case들이 통과됨을 확인했다. 돌아가다가 멈추는 경우와 애초에 안돌아가는 것을 디버그하는 것은 좀 느낌이 다른 것 같다. 쉽지않았다. 

 

참고로 현대 파일시스템은 EXT4 / NTFS 파일시스템을 사용한다. 운영체제마다 다르다.

 

FAT 파일시스템 구현에 앞서 기존 File system 이 어떻게 작동하는 구조였고 핀토스에서 FAT 파일 시스템은 어떻게 작동하는지 이해가 필요했다. 

 

미래에 누군가 작성한 방대한 코드들이 나에게 주어지고 그것을 이해해야 한다면, 해당 코드의 자료구조들의 유기적 관계를 먼저 파악해야한다. 핀토스를 하면서 배운점 중 하나다.

 

핀토스 파일 시스템은 아래와 같이 구성되어 있었다. 

 

우선 'open_inodes'라는 이름의 쓰레드(프로세스)간에 공유되는 list 자료구조가 있다.

그 안에 list element로 inode가 관리된다. inode는 각 파일들의 metadata를 의미한다. 

실제 데이터로 inode의 member인 inode_disk가 있다. 이 구조체가 디스크의 데이터 블록 중 어떤 위치에 해당 파일의 시작부분이 존재하는지, 파일의 사이즈는 어느정도인지 등 정보를 저장하고 있다. 

struct inode_disk {
	disk_sector_t start;                /* First data sector. */
	off_t length;                       /* File size in bytes. */
	unsigned magic;                     /* Magic number. */
	uint32_t unused[125];               /* Not used. */
};


/* In-memory inode. */
struct inode {
	struct list_elem elem;              /* Element in inode list. */
	disk_sector_t sector;               /* Sector number of disk location. */
	int open_cnt;                       /* Number of openers. */
	bool removed;                       /* True if deleted, false otherwise. */
	int deny_write_cnt;                 /* 0: writes ok, >0: deny writes. */
	struct inode_disk data;             /* Inode content. */
};

여기까지 보면 위의 정보로 disk의 data block 영역에서 필요한 data를 찾을 수 있을 것만 같지만 불가능하다.

파일은 디스크 데이터 영역에 연속적으로 존재하고 있지 않다. 연속적으로 존재하면 편하겠지만 연속적으로 존재할 경우, 파일사이즈를 늘리기 어렵기도하고 외부 단편화의 문제점까지 있다. 

이러한 이유로 데이터들은 최소 섹터에서 클러스터(=블록)단위로 다양한 위치에 비연속적으로 존재하고 있다.

 

이 데이터블록들의 위치를 파악 할 수 있어야 하는데, 파일시스템마다 이 부분을 관리하는 방법이 다르다. 

 

http://forensic.korea.ac.kr/DFWIKI/index.php/%EA%B5%AC%EC%A1%B0%EB%B6%84%EC%84%9D/FAT

 

구조분석/FAT - Digital Forensic Wikipedia

Reserved Area[편집] 이 영역은 미래를 위해 예약해 놓은 영역이다. 보통 FAT16인 경우에는 1섹터를, FAT32인 경우에는 32섹터를 할당한다. Reserved Area의 구조는 아래 그림과 같다. Boot Record[편집] 이 영역

forensic.korea.ac.kr

핀토스 part 4에서는 FAT(File Allocation Table)을 통해 파일시스템을 구현해야한다.

FAT는 무려 '빌게이츠'가 22세에 1년정도 개발하여 만들었다고한다...... 

/* Should be less than DISK_SECTOR_SIZE */
struct fat_boot {   	/* 부트섹터? */
	unsigned int magic;
	unsigned int sectors_per_cluster; /* Fixed to 1 */
	unsigned int total_sectors;
	unsigned int fat_start;   /* Sector# FAT exist in DISK  // disk상 offset 같은놈임*/  
	unsigned int fat_sectors; /* Size of FAT in sectors. */
	unsigned int root_dir_cluster;
};

/* FAT FS */
struct fat_fs {
	struct fat_boot bs;
	unsigned int *fat;
	unsigned int fat_length;
	disk_sector_t data_start;
	cluster_t last_clst;
	struct lock write_lock;
};

부팅 흐름을 따라가보면, FAT File system은 DISK의 BOOT_SECTOR에서 기본정보를 불러오고, fat_boot 구조체를 초기화한다. 이 구조체에 FAT에 관한 갖가지 기초정보들이 들어있고 filesystem 구조체에 table이 존재한다. 

 

 

나중에 이어서 작성하기...

핀토스 각 자료구조