본문 바로가기

CS

Pintos Project 4: File Systems

 우리가 기존에 했던 방식은 비트맵을 사용하여 구현 하였다. 따라서 기존에 구현된 파일시스템 관련 하수들을 다 FAT 방식으로 바꿔야 한다. FAT은 연결리스트 형태로 구현하면 된다 .그전에 어디서부터 시작되나 보자.  시작은 일단 init.c에서 disk_init()과 filesys_init()에서 시작된다. filesys_init 들어가 보면 파일 시스템 모듈을 initialize 하는 곳이라고 나와있다.

이 함수에서 다시 차례로 fat_init 해주고 인자로 받은 format 확인해서 재포맷하기위해 do_format도 해준다 do_format함수에서 파일 시스템을 포맷해주는 함수이다. fat_init 함수를 보면 부트 섹터에서 읽어와서 fat_fs구조체의 부트섹터에 할당해준다. 그리고 do_format 함수에서는 fat_create함수를 호출하는데, 다시 이 함수는 fat_boot_create함수와 우리가 첫 번째로  수행해야 할 과제에서 작성할 fat_fs_init을 작성한다.

그리고 fat table 과 루트 디렉터리를 만들어준다. 그 뒤 함수들을 구현하면서 더 알아보자, 그전에 fat_open과 fat_close 까지는 봐보자 , fat_open 은 512바이트씩 디스크에서 fat table을 가져온다. fat_close  반대로 디스크에 다시 적어주고, 디스크 섹터도 다시 디스크에 내려준다.

이제 구현해야할 fas_fs_init을 보자 깃북에는 'Initialize FAT file system. You have to initialize fat_length and data_start field of fat_fs. fat_length stores how many clusters in the filesystem and data_start stores in which sector we can start to store files 라 나와있다' fat_length 에는 클러스터의 수와 data_start에는 데이터 블록 시작 지점을 정해 줘야 한다. 우리가 위에서 부트섹터를 받아왔으니 여기서 데이터를 가져와서 설정해 주면 된다.

fat 나머지 부분들도 작성해 준다. fat_create_chain 같은 경우 clst가 0으로 주어지면 새로운 체인을 만들어서 연결한다. fat_remove_chain 은 주어진 클러스터에서 모든 연결된 클러스터를 없애야 한다.

그 뒤 inode 부분이 bitmap 형식으로 되어 있으니 관련된 함수들을 전부 바꿔줘야 한다.

map_allocation대신에 fat_allocate를 작성해 주어야한다. 데이터 블록의 시작 섹터에 새로운 체인을 만들어서 연결시켜준다

나머지 inode 부분도 작성해 주면 된다. ㅎ

그리고 filesys.c 부분도 fat을 사용해서 구현해 주어야 한다. 또한 여기서  extensible 한 파일들을 만들기 위해 수정해줘야 한다. 파일이 늘어날때 chain에 추가해 주면된다 받은 파일명의 파일을 만들기 위해서는 일단 path를 알아야 하기 때문에 path parsing 하는 함수를 만들어 줘야한다. 

찾은 path의 디렉터리에 클러스터를 만들어서 inode를 만들고 찾은 디렉터리에 추가시켜준다. open과 remove도 비슷하게 작성해 준다. ㅎ 두번째 장인 Subdirectories 과제 까지 생각해서 작성해 줘야 한다. 'Update the remove system call so that it can delete empty directories (other than the root) in addition to regular files. Directories may only be deleted if they do not contain any files or subdirectories (other than '.' and '..'). You may decide whether to allow deletion of a directory that is open by a process or in use as a processs current working directory. If it is allowed, then attempts to open files (including '.' and '..') or create new files in a deleted directory must be disallowed. Implement the following new system calls:' 깃북에서 보면  디렉터리에 파일이나 하위 디렉터리가 없을때 삭제 할 수 있다고 나와있고, 현재 사용중이거나 열려있는 디렉터리를 삭제할지도 결정 해야한다. 이에따른 몇가지 시스템 콜들을 작성해야 한다. 그리고 symlink 까지 작성해야 한다. 일단은 여기까지 정리하자.

 

 

'CS' 카테고리의 다른 글

크래시 일관성 : FSCK와 저널링  (0) 2021.10.28
파일 시스템 구현  (0) 2021.10.26
RAID  (0) 2021.10.26
하드 디스크 드라이브  (0) 2021.10.25
입/출력 장치 개념  (2) 2021.10.25