Memory Mapped Files
이 섹션에서는 메모리 매핑 페이지(memory-mapped pages)를 구현합니다. 익명 페이지(anonymous pages)와 달리 메모리 매핑 페이지(memory-mapped pages)는 파일 백업 매핑(file-backed mappings)입니다. 페이지의 콘텐츠는 일부 기존 파일의 데이터를 미러링합니다. page fault가 발생하면 즉시 물리적 프레임이 할당되고 콘텐츠가 파일에서 메모리로 복사됩니다. 메모리 매핑된 페이지(memory-mapped pages)가 매핑 해제되거나 교체되면 콘텐츠의 모든 변경 사항이 파일에 반영됩니다.
mmap and munmap System Call
메모리 매핑된 파일(memory mapped files)에 대한 두 가지 시스템 호출인 mmap 및 munmap을 구현합니다. VM 시스템은 mmap 영역에서 페이지를 느리게 로드하고 mmaped file 자체를 매핑을 위한 백업 저장소로 사용해야 합니다. 이 두 system call을 구현하려면 vm/file.c에 정의된 do_mmap 및 do_munmap을 구현하고 사용해야 합니다.
void *mmap (void *addr, size_t length, int writable, int fd, off_t offset);
- offset 바이트에서 시작하여 fd로 열린 파일을 프로세스의 가상 주소 공간인 addr에 length 바이트로 매핑합니다. 전체 파일은 addr에서 시작하는 연속적인 virtual pages 로 매핑됩니다. 파일 길이가 PGSIZE의 배수가 아닌 경우 최종 매핑된 페이지의 일부 바이트가 파일 끝을 넘어 '튀어나오게' 됩니다. 페이지에 오류가 발생하면 이 바이트를 0으로 설정하고 페이지가 디스크에 다시 기록될 때 이 바이트를 삭제합니다. 성공하면 이 함수는 파일이 매핑된 virtual address를 반환합니다. 실패하면 파일을 매핑할 수 있는 유효한 주소가 아닌 NULL을 반환해야 합니다.
A call to mmap may fail if the file opened as fd has a length of zero bytes. addr이 페이지 정렬되지 않았거나 매핑된 페이지 범위가 스택 또는 실행 파일 로드 시 매핑된 페이지를 포함하여 매핑된 페이지의 기존 세트와 겹치는 경우 실패해야 합니다. Linux에서는 addr이 NULL이면 커널이 매핑을 생성할 적절한 주소를 찾습니다. 간단하게 하기 위해, 주어진 주소로 mmap을 시도하면 됩니다. 따라서 일부 핀토스 코드는 가상 페이지 0이 매핑되지 않은 것으로 가정하므로 addr이 0이면 실패해야 합니다. length 가 0이면 mmap도 실패해야 합니다. 마지막으로 콘솔 입력 및 출력을 나타내는 파일 기술자는 매핑할 수 없습니다.
메모리 매핑된 페이지(Memory-mapped pages)도 익명 페이지와 마찬가지로 지연 방식으로 할당해야 합니다. vm_alloc_page_with_initializer 또는 vm_alloc_page를 사용하여 페이지 객체를 만들 수 있습니다.
void munmap (void *addr);
-지정된 주소 범위 addr에 대한 매핑을 언매핑하며, 이 주소는 아직 매핑이 언매핑되지 않은 동일한 프로세스에서 이전에 mmap을 호출하여 반환한 가상 주소여야 합니다.
프로세스가 exit 되거나 다른 방법으로 종료될 때 모든 매핑은 암시적으로 매핑 해제됩니다. 매핑이 암시적이든 명시적이든 매핑이 해제되면 프로세스가 쓴 모든 페이지가 파일에 다시 쓰여지며, 쓰지 않은 페이지는 다시 쓰여서는 안 됩니다. 그러면 해당 페이지는 프로세스의 가상 페이지 목록에서 제거됩니다.
파일을 닫거나 제거해도 해당 매핑은 해제되지 않습니다. 일단 생성된 매핑은 유닉스 규칙 (Unix convention) 에 따라 munmap이 호출되거나 프로세스가 종료될 때까지 유효합니다. 자세한 내용은 열린 파일 제거하기를 참조하세요(Removing an Open File ). 각 매핑에 대해 파일에 대한 별도의 독립적인 참조를 얻으려면 file_reopen 함수를 사용해야 합니다.
두 개 이상의 프로세스가 동일한 파일을 매핑하는 경우 프로세스들이 일관된 데이터를 볼 필요는 없습니다. Unix는 두 매핑이 동일한 물리적 페이지를 공유하도록 하여 이 문제를 처리하며, mmap 시스템 호출에는 클라이언트가 페이지가 공유인지 비공개인지(즉, 쓰기 시 복사)를 지정할 수 있는 인수도 있습니다.
필요에 따라 vm/vm.c에서 vm_file_init 및 vm_file_initializer를 수정할 수 있습니다.
void vm_file_init (void);
- 파일 백업 페이지 하위 시스템(the file-backed page subsystem)을 초기화합니다. 이 기능에서는 파일 백업 페이지(file backed page)와 관련된 모든 것을 설정할 수 있습니다.
bool file_backed_initializer (struct page *page, enum vm_type type, void *kva);
- file-backed page를 초기화합니다. 이 함수는 먼저 page-> operations에서 파일 백업 페이지에 대한 핸들러를 설정합니다. 페이지 구조체(page struct)의 일부 정보를, 예를 들어 메모리를 백업하는 파일과 같은 것을 업데이트해야 하는 선택을 할 수도 있습니다.
static void file_backed_destroy (struct page *page);
- 관련 파일을 닫아 파일 백업 페이지(file backed page)를 삭제합니다. 콘텐츠가 더러워진(dirty ) 경우 변경 내용을 파일에 다시 써야 합니다. 이 함수에서 페이지 구조체(page struct)를 해제할 필요는 없습니다. 이 작업은 file_backed_destroy의 호출자가 처리해야 합니다.
'크래프톤 정글 > 핀토스(week08-13)' 카테고리의 다른 글
Project 1 : Threads - Introtuction (급조번역(23.6.22).신용하지 말것- 수정중) (0) | 2023.06.23 |
---|---|
Project 3 : Virtual Memory - Swap In/Out(기입완료-수정중) (0) | 2023.06.22 |
Project 3 : Virtual Memory - Stack Growth (기입완료-수정중) (0) | 2023.06.20 |
Project 3 : VIRTUAL MEMORY - Anonymous Page(기입 완료- 수정중) (0) | 2023.06.17 |
Project 3 : VIRTUAL MEMORY - Memory Management (기입완료-수정중) (0) | 2023.06.16 |