- 익명 페이지와 달리 메모리 매핑된 페이지는 파일 기반 매핑임 = file-backed page 할당
- anon와 file-backed의 차이
- 페이지의 콘텐츠 일부 기존 파일의 데이터를 미러링
- 페이지 폴트가 발생하면 물리적 프레임이 즉시 할당, 내용이 파일→ 메모리로 복사
- 메모리 매핑된 페이지가 unmapped, swapped out되면 콘텐츠의 모든 변경 사항이 파일에 반영
mmap
and munmap
System Call
- vm 시스템은 mmap 영역에서 페이지를 lazy load하고, mmap된 파일 자체를 매핑을 위한 백업 저장소로 사용
vm/file.c
에 정의된 do_mmap
, do_munmap
을 구현하여 사용
mmap
in syscall.c
: 매핑한 페이지에 대한 적합도 체크 함수, 파일의 유효성도 체크해야함
void *mmap (void *addr, size_t length, int writable, int fd, off_t offset);
- fd로 열린 파일의 offset byte부터 length byte 만큼을 프로세스의 가상주소공간의 addr에 매핑
- 전체 파일은 addr에서 시작하는 연속 가상 페이지에 매핑
- 파일 길이가 PGSIZE의 배수인 경우 길이만큼 페이지를 할당
- 파일 길이(length)가 PGSIZE의 배수가 아닌 경우,
최종 매핑된 페이지의 일부 바이트가 파일 끝을 넘어
stick out
됨
→ 일단 파일 길이만큼 연속적으로 페이지가 매핑이 되지만, 마지막 페이지는 무조건 빈공간이 남음, page_fault가 발생하면 이 바이트를 0으로 설정초기화하고, 페이지를 디스크에 다시 쓸 때 버린다
- 성공 시 이 함수는 파일이 매핑된 가상 주소를 반환
- 실패 시 파일을 매핑하는 데 유효한 주소가 아닌 NULL을 반환해야함
mmap
호출이 실패되는 경우
- fd로 열린 파일의 길이가 0바이트인 경우, addr == NULL일 경우, 실패해야함
→ Linux에서 addr가 NULL이면 커널은 매핑을 생성할 적절한 주소를 찾지만(addr에서 mmap시도할수있음),
PintOS에서는 null인 경우 mmap는 실패해야함
- 가상 유저 page 시작 주소(addr)이 page-aligned되지 않았을 경우
- 파일의 시작점(offset)이 page-aligned되지 않았을 경우
- 기존 매핑된 페이지 집합(=SPT에 존재하는 페이지)과 겹치는 경우
- 콘솔 입출력과 연관된 파일 디스크립터 값(STDIN(0), STDOUT(1))일 경우
- file-backed page도 lazy load로 구현되어야 함 ⇒
vm_alloc_page_with_initializer
or vm_alloc_page
를 사용하여 페이지 개체 생성
do_mmap
in file.c
: 실질적 가상 페이지 할당 함수 file-backed 전용 load_segment 함수
void * do_mmap (void *addr, size_t length, int writable, struct file *file, off_t offset);
addr
: 페이지 시작 주소
length
: 매핑할 파일의 크기