일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- multi-oom
- 아직도 실험 중
- Project 1
- PINTOS
- 핀토스 프로젝트
- 파란 장미
- 핀토스 프로젝트 2
- 핀토스 프로젝트 4
- 바빠지나?
- 끝
- 내일부터
- 일지 시작한 지 얼마나 됐다고
- 노가다
- 글리치
- 글루민
- botw
- 셋업
- 자 이제 시작이야
- 핀토스 프로젝트 3
- 마일섬
- 제발흰박
- alarm clock
- 가테
- 황금 장미
- 핀토스 프로젝트 1
- Today
- Total
거북이의 쉼터
(2022.03.29) Subdirectories 가이드라인 (1) 본문
다음으로 진행할 것은 subdirectory이다. 지금까지의 핀토스 파일 작업은 모두 단일 root 디렉토리 아래에서만 이루어졌다. 어떻게 버텼냐... 이제 드디어 단일 root directory에서 벗어나, 하위 디렉토리를 생성하고, 해당 디렉토리로 이동하여 작업을 진행할 수 있다.
각 프로세스는 해당 프로세스가 진행되는 고유한 디렉토리인 current working directory, 줄여서 cwd를 가지고 있어야 한다. 이를 가져야만 상대 주소로 파일을 열거나, 닫거나, 지울 때 어떤 파일이 참조되는지를 알 수가 있다. 지금까지는 디렉토리가 루트 디렉토리 하나 뿐이라 어떤 프로세스에서 상대 주소로, 또는 절대 주소로 파일을 사용하더라도 티가 안 났으나, 이제는 상황이 달라졌다.
이제 입력으로 들어오는 파일 경로 길이의 제한을 없애야 한다. 각 파일의 길이 제한인 14 Byte는 남겨놔도 상관없으나, 해당 길이들을 조합하면 그 길이는 14 Byte보다 확실히 길어질 수 있기 때문에 이를 처리하는 방안을 생각해야 한다. 또한 cwd를 구현한 이후에는 절대 경로가 들어오든, 상대 경로가 들어오든, 파일 경로를 파싱하여 올바른 파일을 찾아낼 수 있어야 한다.
파일을 파싱할 때 고려할 세부 사항이 FAQ와 해당 매뉴얼에 설명되어 있다.
- . 와 .. 은 Unix 시스템과 같이 현재 현재 디렉토리와 부모 디렉토리로 취급할 것
- 디렉토리 구분자는 /로 고정된다. \은 고려하지 않아도 됨
- a//b 같이 /가 중복해서 나올 경우에는 a/b와 같이 / 하나로 취급할 것
- /../x 같이 root directory의 상위 디렉토리에 접근하는 경우, root directory의 부모 디렉토리는 root이므로 /x로 처리할 것
- 파일 경로가 /로 끝나는 경우에는 모두 쳐내거나, 디렉토리의 경우에는 허용할 것 (두 가지 안 모두 통용)
해당 과정이 끝나면 기존 syscall을 조금 손 봐야 한다. open의 경우 directory도 열 수 있도록 해야 한다. 이렇게 열린 디렉토리 fd의 경우, 현존하는 syscall 중 close만이 불리는 것이 허용된다. remove의 경우에는 빈 디렉토리도 삭제할 수 있도록 만들어야 한다. 디렉토리가 비었다는 것은 . 과 .. 을 제외한 다른 파일, 또는 디렉토리가 내부에 없다는 것이다. 삭제하려는 디렉토리가 open에 의해 열려있거나, cwd로서 활용되는 경우에 삭제할 수 있을지 여부는 재량에 맡긴다고 한다. 단, 삭제하는 것이 허용된다면, 삭제가 완료된 뒤에는 . 나 .. 에 접근하는 것이나, 내부에 새로운 파일을 만드는 것이 불허된다. 편의상 삭제하려고 할 때, 이용 중이라면 삭제를 막는 것이 간단해보인다.
마지막으로 해당 system call 5개를 새롭게 구현하면 끝이다.
bool chdir (const char *dir);
현재 프로세스의 cwd를 입력으로 들어온 dir로 바꾼다. 입력으로 들어오는 dir은 상대주소, 절대주소 중 아무거나 들어올 수 있다.
bool mkdir (const char *dir);
dir에 해당하는 하위 디렉토리를 생성한다. 해당 과정에서는 최종적으로 만드는 디렉토리 외에는 모두 만들어져 있어야 성공한다. 예를 들어 /a/b/c를 만들 때, /a와 /a/b 디렉토리가 모두 존재해야 해당 syscall이 성공적으로 /a/b/c를 만들 수 있다.
bool readdir (int fd, char *name);
주어진 fd는 반드시 directory를 연 fd이어야 한다. 성공적으로 끝날 경우, 해당 디렉토리 내의 파일 이름이 모두 name 안에 들어가며 true를 반환한다. 해당 디렉토리 안에 아무것도 없다면 false를 반환한다. . 과 .. 은 name 안에 포함되어서는 안 된다. directory.c에 있는 dir_readdir 함수를 사용하여 이를 기반으로 구현하면 될 것이다.
bool isdir (int fd);
입력으로 들어온 fd가 directory를 가리킬 경우 true를, 아닐 경우 false를 반환한다. 이는 현재 file 구조상 가능할 것 같지 않으므로, struct 내에 디렉토리인지 나타내는 field를 추가해야 할 것이다.
int inumber (int fd);
해당 fd와 연결된 파일을 나타낼 수 있는 값인 inumber를 반환해야 한다. 해당 값은 파일이 존재하는 한, 계속 동일하게 유지되어야 하며, 유일한 값이어야 한다. 핀토스에서는 파일의 메타 데이타가 위치한 섹터 번호가 이러한 기능을 할 수 있기에 이를 반환하기로 한다. inode.c의 inode_get_inumber를 활용해서 구현하자.
매뉴얼에서 구현하라고 하는 내용은 얼추 끝났다. 설계는 바로 다음 포스팅에서 다뤄보자. 사실 아직 매뉴얼이 완전히 끝난 것도 아니다. soft link를 만드는 symlink 함수를 구현하는 것이 남은 매뉴얼에 해당하는 내용이다. 이것도 K-핀토스로 개조되면서 새롭게 생긴듯하다. 해당 내용은 설계가 끝난 뒤, 그 다음 포스트에서 마저 살펴보도록 하자.
'코딩 삽질 > KAIST PINTOS (CS330)' 카테고리의 다른 글
(2022.04.02) Subdirectories 구현 (0) | 2022.04.02 |
---|---|
(2022.03.29) Subdirectories 가이드라인 (2) (0) | 2022.03.29 |
(2022.03.29) Indexed & Extensible 구현 (2) (0) | 2022.03.29 |
(2022.03.28) Indexed & Extensible 구현 (1) (0) | 2022.03.28 |
(2022.03.27) Indexed & Extensible 가이드라인 (2) (0) | 2022.03.27 |