최근에 나는 Linux 커널 코드의 메모리 관리 부분을 읽고 있었습니다(내가 읽은 버전은 4.10입니다). 나는 mremap의 구현이 이상하다고 생각합니다.
간단히 말해서 기본적으로 다음을 수행하는 을 sys_mremap()
호출합니다 .move_vma()
copy_vma()
move_page_tables()
do_munmap()
1단계와 2단계는 이해하기 쉽습니다. 이전 메모리 맵에서 새 메모리 맵으로 복사하기만 하면 됩니다. 그러나 이 두 단계에서 새 메모리 맵에 복사할 때 구조 페이지의 참조 카운트가 증가하지 않습니다(소스 코드에서 찾지 못했습니다).
그런 다음 3단계에서 커널은 이전 매핑을 매핑 해제합니다. 각 vma와 각 페이지를 반복하고, 구조체 페이지의 참조 카운트를 줄이고, 마지막으로 tlb_flush_mmu_free()
모든 페이지를 free로 호출합니다.
내 질문은 다음과 같습니다
- 커널이 이와 같이 mremap을 구현하는 경우 페이지에 대한 다음 액세스로 인해 페이지 오류가 발생합니까?
- 커널이 참조 카운트를 증가시키지 않는 이유는 무엇입니까
move_vma()
? mremap 후에 페이지를 메모리에 유지하고 불필요한 페이지 오류를 발생시키지 않습니다. - 익명 및 개인 매핑 페이지는 어떻습니까? 해당 페이지가 공개된 후 사용자는 어떻게 콘텐츠에 액세스할 수 있나요?