세리프 따라잡기

WEEK12 - PintOS Project4 - 정리 본문

SW사관학교 정글

WEEK12 - PintOS Project4 - 정리

맑은 고딕 2022. 6. 22. 00:55

git book 보고 정리한 내용!!

 


 

PROJECT4: FILE SYSTEM
Introduction

주로 filesys 디렉토리에서 작업

프로젝트2 또는 3에 프로젝트4를 빌드할 수 있음. 근데 vm을 비활성화하면 10퍼 크레딧이 차감된대.

우리 파일 시스템은 유닉스 계열과 유사한 인터페이스니까 creat, open, close, read, write, lseek, 그리고 unlink에 대해 유닉스 man page를 읽고 싶을 수 있는디, 호출이 다르대. 파일 시스템은 이런 작업을 디스크로 변환한다

그리고 모든 기본 기능은 Introduction의 위에 나열된 파일에서 사용할 수 있어, 근데 심각한 사항이 있음. 그게 뭐냐면 대부분의 filesys 작업 중에 이전 부분과 상호작용에 준비해야 한대. (무슨 말이지? 충돌??)

핀토스 여지껏 테스트를 한 번만 호출했는데, 파일 시스템 프로젝트에서는 핀토스를 두 번 한대
파일 시스템 안의 모든 파일과 디렉토리를 하나의 파일로 결합해서 

채점 스크립트는 2번째 실행에서 복사된 파일의 내용을 기반으로 파일 시스템의 정확성을 확인
테스트 t의 파일이름은 t.tar이란다

------------------------------
Indexed and Extensible Files

단일 


------------------------------
File Growth

확장 가능한 파일을 구현합니다. 기본 파일 시스템에서는 파일이 생성될 때 파일 크기가 지정됩니다. 그러나 대부분의 최신 파일 시스템에서 파일은 처음에 크기 0으로 생성된 다음 파일 끝에서 쓰기가 이루어질 때마다 확장됩니다. 파일 시스템에서 이를 허용해야 합니다.

파일이 파일 시스템의 크기(메타데이터 제외)를 초과할 수 없다는 점을 제외하고는 파일 크기에 미리 결정된 제한이 없어야 합니다. 이것은 루트 디렉토리 파일에도 적용되며, 이제 초기 제한인 16개 파일을 초과하여 확장할 수 있습니다.

사용자 프로그램은 현재 EOF(파일 끝) 이상을 검색할 수 있습니다. 탐색 자체는 파일을 확장하지 않습니다. EOF 이후의 위치에 쓰기는 파일을 기록 중인 위치로 확장하고 이전 EOF와 쓰기 시작 사이의 간격은 0으로 채워야 합니다. EOF 이후 위치에서 시작하는 읽기는 바이트를 반환하지 않습니다.

EOF를 훨씬 초과하여 작성하면 많은 블록이 완전히 0이 될 수 있습니다. 일부 파일 시스템은 이러한 암시적으로 0인 블록에 대해 실제 데이터 블록을 할당하고 씁니다. 다른 파일 시스템은 명시적으로 기록될 때까지 이러한 블록을 전혀 할당하지 않습니다. 후자의 파일 시스템은 "희소 파일"을 지원한다고 합니다. 파일 시스템에서 두 할당 전략 중 하나를 채택할 수 있습니다.



--------------------------------------------
(uint8_t *) fat_fs->fat = 4바이트?
fat_fs->bs.fat_sectors = 4바이트????

bytes_left가 512보다 크면 disk_read를 하고 bytes_read에 512를 더해줘
bytes_read = 512값

bounce라는 변수는 512만큼 malloc
만약 bounce null이라면 패닉
아니면 읽어서 memcopy를 하고 사용한 bounce (malloc해준거) free로 풀어줌

-------------------------------------------
Subdirectories (하위 디렉토리)

-계층적 이름 공간을 구현합니다.- 기본 파일 시스템에서 모든 파일은 단일 디렉토리에 있습니다. 디렉토리 항목이 파일이나 다른 디렉토리를 가리킬 수 있도록 수정하십시오.

디렉토리가 다른 파일과 마찬가지로 원래 크기 이상으로 확장될 수 있는지 확인하십시오.

기본 파일 시스템은 파일 이름에 14자 제한이 있습니다. 개별 파일 이름 구성 요소에 대해 이 제한을 유지하거나 선택에 따라 확장할 수 있습니다. 전체 경로 이름은 14자보다 훨씬 길어야 합니다.

-각 프로세스에 대해 별도의 현재 디렉토리를 유지하십시오.- 시작할 때 루트를 초기 프로세스의 현재 디렉터리로 설정합니다. 한 프로세스가 fork 시스템 호출로 다른 프로세스를 시작하면 자식 프로세스는 부모의 현재 디렉터리를 상속합니다. 그 후 두 프로세스의 현재 디렉토리는 독립적이므로 자신의 현재 디렉토리를 변경해도 다른 프로세스에는 영향을 미치지 않습니다. (이것이 유닉스에서 cd ​​명령이 외부 프로그램이 아닌 내장 쉘인 이유입니다.)

호출자가 파일 이름을 제공하는 모든 위치에서 절대 또는 상대 경로 이름을 사용할 수 있도록 기존 시스템 호출을 업데이트하십시오. 디렉토리 구분 문자는 슬래시('/')입니다. '.'랑 '..' 특별한 파일 이름 또한 지원해야 한다. (unix와 동일한 의미를 갖는?)

디렉토리도 열 수 있도록 열린 시스템 호출을 업데이트하십시오. 기존 시스템 호출 중 닫기만 디렉터리에 대한 파일 설명자를 수락하면 됩니다.

일반 파일 외에 빈 디렉터리(루트 제외)를 삭제할 수 있도록 시스템 호출 제거를 업데이트합니다. 디렉토리는 파일이나 하위 디렉토리('.' 및 '..' 제외)를 포함하지 않는 경우에만 삭제할 수 있습니다. 프로세스에 의해 열려 있거나 프로세스의 현재 작업 디렉토리로 사용 중인 디렉토리의 삭제를 허용할지 여부를 결정할 수 있습니다. 허용되는 경우 파일('.' 및 '..' 포함)을 열거나 삭제된 디렉터리에 새 파일을 만들려는 시도는 허용되지 않아야 합니다. 다음과 같은 새 시스템 호출을 구현합니다.

bool chdir (const char *dir);
프로세스의 현재 작업 디렉터리를 상대 또는 절대 디렉터리로 변경합니다. 성공하면 true를, 실패하면 false를 반환합니다.

bool mkdir (const char *dir);
상대 또는 절대일 수 있는 dir이라는 디렉터리를 만듭니다. 성공하면 true를, 실패하면 false를 반환합니다. dir이 이미 존재하거나 dir의 마지막 이름 외에 디렉터리 이름이 이미 존재하지 않는 경우 실패합니다. 즉, mkdir("/a/b/c")은 /a/b가 이미 있고 /a/b/c가 없는 경우에만 성공합니다.

Comments