Skip to content

mmap {pintos}{swjungle}


요약#

file-mapped virtual memory. 파일을 읽을 때 뒤늦게 가상주소와 파일 페이지가 담긴 커널가상주소 매핑을 시도하라. 파일을 수정할 때 커널 메모리에 수정만 해놓고 바로 파일에 수정사항을 보내지 말라. unmap, swapped out 상황에 dirty한 경우에만 내려보내자.

void *mmap (void *addr, size_t length, int writable, int fd, off_t offset);
  • 실패하는 케이스:
    • 인자에 addr이 PG_SIZE로 나누어 떨어지지 않는 경우
    • overlap with other reserved pages
  • length가 딱 떨어지지 않으면 페이지 로드할 때 비는 공간을 0으로 채워넣되, write back 시에 해당 부분을 제외하고 내려보내야 한다.

유저는 malloc을 사용할 수 없지만 addr을 채워넣어야 하기 때문에 유저 가상주소를 직접 작성하여 넣어주어야 한다(...) 리눅스처럼 똑똑하게 NULL이 들어가면 알아서 메모리 할당해주지 않는다는 점 알아둘 것.

void munmap (void *addr);
  • implicit unmap
    • process exit
  • munmap doesn't actually unmaps space, until implicit/explicit unmapping
  • file_reopen: mapping과 별개의 파일을 열기위해 사용.
  • 두 프로세스가 같은 파일을 매핑하는데 동일한 프레임 (inode?)을 참조함.

Closing or removing a file does not unmap any of its mappings
파일을 닫거나 지우는 행위가 unmap을 하지 않습니다.

fd가 닫혀있어도 munmap을 호출하지 않는 이상, mmapped address에 매핑은 살아있구나