* 뇌피셜이 난무할 수 있습니다.
* 개인 공부 용도로 작성하였습니다.
참고자료
Project 4: File Systems
Introduction
-
앞전의 2개의 과제에서는 파일 시스템이 어떻게 구현되어 있는지 걱정하지 않고, 파일 시스템을 추상적으로 광범위하게 사용하였다.
-
이번 과제에서는 이 파일 시스템을 개선할 것이다. filesys
디렉토리에서 주로 작업할 것이다.
-
프로젝트 2 혹은 프로젝트 3에서 이번 과제가 동작하도록 할 것이다. 두 경우 모두 프로젝트 2에서 만든 기능들이 제대로 작동해야 한다. 추가적으로, 프로젝트 3에서 이번 과제가 돌아가게 하려면 당연히 프로젝트 3가 제대로 구현되었어야 한다.
Indexed and Extensible Files
cluster_t fat_fs_init (void)
- fat_fs_init
- FAT file system을 초기화해야한다. 그 중에서도 fat_fs 구조체의 멤버인 fat_length와 data_start를 초기화 해줘야 한다.
- fat_length는 파일 시스템에서 cluster가 얼마나 있는지를 저장한다.(정확하게 cluster가 뭔지 헷갈린다... sector가 모인 게 cluster이지 않았나?)
- data_start는 파일들을 저장시키기 시작할 sector를 저장하고 있는 자료구조이다. fat에서 data block이 시작되는 sector index를 저장하고 있는다.
- fat_fs->bs 혹은 이 함수에서 다른 데이터들을 유용하게 활용할 수도 있다.(하라는 거여... 말라는 거여...!)
cluster_t fat_create_chain (cluster_t clst)
- fat_create_chain
- clst에 빈 클러스터를 이어 붙여 chain을 늘린다.
- 만약 clst가 0이면 새로운 chain을 생성한다.(그러면 clst는 갯수를 말하는 건가?)
- 새로 할당된 cluster의 cluster number를 반환한다.
void fat_remove_chain (cluster_t clst, cluster_t pclst)
- fat_remove_chain
- chain에서, clst부터 시작하여 cluster를 제거한다. pclst는 clst 직전의 클러스터여야 한다.
- 즉, chain을 제거하고 나면 마지막 클러스터는 pclst가 된다.
void fat_put (cluster_t clst, cluster_t val)
- fat_put
- 클러스터 number clst가 val을 가르키도록 수정한다.
- FAT의 각 entry들은 chain 안에서 다음 클러스터를 가르킨다.
- 연결들을 수정할 때 사용된다.
cluster_t fat_get (cluster_t clst)
- fat_get
- 주어진 클러스터 clst가 가르키는 클러스터 번호를 반환다.(진짜 뭔 말이지 ㅎㅎㅎ)
disk_sector_t cluster_to_sector (cluster_t clst)
- cluster_to_sector
- 클러스터 number clst에 해당하는 sector number로 변환하고, 그 sector number를 반환한다.
File Growth
- 파일들의 확장이 가능하도록 구현한다.
- 현재 핀토스에서는 파일이 생성되면 파일 사이즈가 정해져 있고 늘어날 수는 없다.
- 하지만 현대 파일 시스템에서는 맨 처음에 사이즈가 0인 상태로 파일이 생성되고, 파일의 끝에서 write가 실행될 때마다(write로 인해 파일의 끝이 늘어나야 할 때) 파일의 크기는 확장된다.
- 핀토스에서도 이것이 가능하도록 구현해야 한다.
- 어느 파일이 파일 시스템의 크기를 넘을 수 없다는 제한 사항을 제외하고는, 파일 크기의 확장에 있어 제한선이 존재해서는 안된다.(무슨 말인지 정확히는 와닿지 않는다. 파일들을 관리하는 파일 시스템보다 오히려 파일의 크기가 커지면 안된다는 말 같기는 하다)
- 이는 root directory file에도(root directory 또한 하나의 파일이다) 적용된다.
- 이 root directory file은 원래 16개의 파일만 포함할 수 있었으나, 이번에는 확장시켜야 한다.(do_format 함수를 보면 16개의 파일 entry를 포함하는 directory를 만들게 되는 dir_create(ROOT_DIR_SECTOR, 16) 함수가 포함되어 있다)
- 사용자 프로그램은 EOF(end-of-file)을 넘어서도 탐색이 가능하다.
- 하지만 탐색 자체가 파일을, 파일의 크기를 확장시키진 않는다.
- EOF에서 write를 하는 것은, 즉 파일의 끝에서 write를 하는 것은 파일의 크기를 늘리는 동시에, EOF를 write하고 있는 지점으로 확장시키게 된다.
- 만약 EOF에서 write를 시작한 것이 아니라, seek를 통해 position을 EOF 뒤로 넘기고 write를 하게 되면 사이의 공간이 덩그러니 남게 되는데, 이는 0으로 설정해줘야 한다.
- EOF 뒤에는 데이터가 없으니(쓰레기 값이 존재할 듯 하다), 우리가 읽으려는(원하는) 데이터가 아니니 0 bytes가 반환되도록 해야 한다.
- EOF를 훨씬 넘어서 write를 하게 되면 많은 block들의 데이터들이 0으로 설정되게 된다.
- 어떤 파일 시스템들은, 이러한 block들이 어차피 암묵적으로 0이 되어 쓰이지 않으니, 여기에다 write가 되게 하는 등 재활용하기도 한다.
- 물론 어떤 파일 시스템들은 이 block들에 명시적으로 write를 실행할 때까지 그냥 놔두기도 한다.
off_t inode_write_at (struct inode *inode, const void *buffer_, off_t size, off_t offset)
- inode_write_at
- buffer에서 size 바이트 만큼의 데이터를, inode의 offset부터 size 바이트만큼 write 한다.
Bitmap 함수
bool bitmap_test (const struct bitmap *b, size_t idx)
- bitmap_test
- b라는 bitmap에서 idx라는 index의 비트가 무엇으로 설정되어 있는지, 그 값을 반환한다.
- 즉 bitmap에서 idx의 비트가 0이면 0을, 1이면 1을 반환해준다.
- bitmap[idx]가 0 혹은 1이라는 것을 알 수 있다.
size_t bitmap_scan_and_filp (struct bitmap *b, size_t start, size_t cnt, bool value)
- bitmap_scan_and_filp
- 비트맵 자료구조인 b에서 start index부터 value(true or false)로 설정되어 있는 cnt개의 비트를 확인 후, 그 비트를 filp시킨다.(그 index, 즉 비트의 값이 true이면 false로, false이면 true로 바꾼다)
- 그 후, 그렇게 바꾼 것들의 처음 비트의 index를 반환한다.