mmap
시스템 콜을 호출한다는 것은 특정 가상메모리 주소 공간(페이지)에 특정 파일의 일부를 매핑시키겠다는 것
❓ 매핑이란 : 결국 이 가상주소 공간의 페이지에 파일을 올리겠다는 것 → 페이지에 접근하므로써 파일에 접근하겠다는 의미. 접근 후에는 가상메모리에 쓰기를 함으로써 파일에 쓸 수 있게 된다
mmap 으로 매핑한 내용은 munmap
으로 매핑을 해제하게 된다. 매핑 해제 시 가상메모리에 쓰기가 발생한다면 다시 파일에 ‘쓰기’를 함으로서 파일에 변경 내용을 반영하게 된다.
유저의 mmap
호출 → … → syscall_handler → mmap_handler
💡 mmap 된 페이지는 ?
VM_FILE
타입의 페이지로서, 매핑한 파일의 데이터를 미러링
하고 있다.
: mmap은 vm_alloc_page_with_initialize 함수를 호출해서 VM_FILE의 uninit 페이지를 생성한 후, 페이지 폴트가 발생했을 때 물리메모리 할당 후 (해당 물리메모리로) 파일 내용을 복사하게 된다 (lazy load 방식)
unmapped 되거나 (munmap 호출 또는 exit 발생으로 spt_kill이 발생한 경우), swapped out 되면 모든 변경사항이 파일에 반영되어야 한다.
pml4_is_dirty()
함수로 체크file_write_at()
함수로 쓰기필요한 사전 작업
💡 mmap 시스템콜
💡 do_mmap 함수
💡 file_backed_swap_in 함수
munmap이 발생하는 두 가지 경우
munmap 시스템 콜 호출→ … → syscall_handler → munmap_handler → do_munmap
실행