FAT와 File growth를 구현한 후, 유저 프로그램을 실행하는 테스트 케이스가 계속 실패하였다. 원인은 파일 시스템을 포맷하는 과정에서 루트 디렉토리를 생성하지 않았기 때문이었다.
유저 프로그램을 실행하기 위해서 해당 프로그램의 이름과 disk inode가 어떻게 디렉토리 엔트리에 저장되는지 흐름을 파악해보며 이를 해결하였다.
/* Pintos main program. */
int
main (void) {
...
#ifdef FILESYS
/* Initialize file system. */
disk_init ();
filesys_init (format_filesys);
...
}
핀토스 부팅을 위해 init.c의 main함수가 실행되면, disk_init()과 filesys_init(format_filesys)함수가 호출된다.
void filesys_init(bool format)
{
...
#ifdef EFILESYS
fat_init();
if (format)
do_format();
fat_open();
...
}
filesys_init에서 파일 시스템을 초기화한다. 포맷을 위한 변수 format_filesys를 인수로 넣어줌으로써 파일 시스템을 포맷한다. 아래 그림은 위 함수의 진행 과정을 그림으로 나타낸 것이다.
fat_init 함수에서는 메모리에 fat_fs라는 구조체를 할당하고 디스크의 부팅 섹터로부터 fat에 대한 메타 데이터를 읽어온다. 이후 옆의 그림과 같이 초기화를 진행한다.
do_format 함수가 실행되면, 먼저 fat_create 함수가 호출된다. fat_create 함수에서는 메모리에 fat를 할당하고, 루트 디렉토리를 위한 클러스터를 할당한다. 이후 disk의 루트 디렉토리에 해당하는 섹터를 0으로 초기화한다.
루트 디렉토리를 생성하기 위해 dir_create 함수를 호출한다. 이는 inode_create 함수를 호출하며, 먼저 메모리에 디스크 아이노드 구조체를 할당한다. 여기서 디렉토리 엔트리 섹터를 fat로부터 할당받아 start에 저장하고, 16개 엔트리의 총 바이트 수를 length에 저장한다. 이후 해당 아이노드에 대한 정보를 디스크의 루트 디렉토리 섹터에 쓰기 작업을 실행한다.
fat_close 함수를 통해 변경 사항이 있는 fat의 정보를 디스크에 업데이트한다.
이후, fat_open 함수를 통해 디스크에서 fat를 메모리로 로드하여 응용 프로그램의 데이터를 디스크에 저장하는 과정에서 fat의 변경을 가능하게 한다.
파일시스템 초기화가 완료되면, 응용 프로그램의 데이터를 디스크에 저장하는 과정이 시작된다. run_actions 함수에서 fsutil_put 함수를 호출되고, 이는 filesys_create 함수를 호출한다. filesys_create 함수의 인자로 args-none과 사이즈 51296바이트가 들어온 상황을 가정해보자.
먼저 dir_open_root 함수를 통해 루트 디렉토리에 대한 disk inode를 메모리에 할당한 in-memory inode로 가져온다. 이후 메모리에 할당한 디렉토리 구조체에 in-memory inode를 참조한다.
또한, args-none 아이노드를 저장하기 위한 섹터를 fat로부터 할당받는다. 이후 inode_create 함수에서 args-none 아이노드를 메모리에 할당한다. 그리고 데이터를 저장하기 위한 섹터를 fat로부터 할당받고 이를 start에 저장하면서 파일 사이즈도 함께 저장한다. 아이노드를 저장하기 위해 할당받은 섹터에 쓰기 작업을 실행한다.
마지막으로 dir_add 함수가 실행되면, 디렉토리 엔트리 섹터로 접근하여 하나의 엔트리에 file name과 해당 파일의 disk inode가 위치한 섹터를 저장한다.
'SW사관학교 정글 > 정글 TIL' 카테고리의 다른 글
[Pintos Project] Virtual Memory - Copy on write (0) | 2022.12.13 |
---|---|
[Pintos Project] Virtual Memory - Lazy Loading (0) | 2022.12.13 |
[Pintos Project] User Programming - Argument Passing (1) | 2022.11.29 |
[Pintos Project] Alarm Clock and Priority Scheduling (6) | 2022.11.17 |
[WEEK 04] 다이나믹 프로그래밍(Dynamic Programming) (1) | 2022.10.15 |