물리적 페이지를 해제하기 위해 mremap을 실행하시겠습니까?

물리적 페이지를 해제하기 위해 mremap을 실행하시겠습니까?

최근에 나는 Linux 커널 코드의 메모리 관리 부분을 읽고 있었습니다(내가 읽은 버전은 4.10입니다). 나는 mremap의 구현이 이상하다고 생각합니다.

간단히 말해서 기본적으로 다음을 수행하는 을 sys_mremap()호출합니다 .move_vma()

  1. copy_vma()
  2. move_page_tables()
  3. do_munmap()

1단계와 2단계는 이해하기 쉽습니다. 이전 메모리 맵에서 새 메모리 맵으로 복사하기만 하면 됩니다. 그러나 이 두 단계에서 새 메모리 맵에 복사할 때 구조 페이지의 참조 카운트가 증가하지 않습니다(소스 코드에서 찾지 못했습니다).

그런 다음 3단계에서 커널은 이전 매핑을 매핑 해제합니다. 각 vma와 각 페이지를 반복하고, 구조체 페이지의 참조 카운트를 줄이고, 마지막으로 tlb_flush_mmu_free()모든 페이지를 free로 호출합니다.

내 질문은 다음과 같습니다

  1. 커널이 이와 같이 mremap을 구현하는 경우 페이지에 대한 다음 액세스로 인해 페이지 오류가 발생합니까?
  2. 커널이 참조 카운트를 증가시키지 않는 이유는 무엇입니까 move_vma()? mremap 후에 페이지를 메모리에 유지하고 불필요한 페이지 오류를 발생시키지 않습니다.
  3. 익명 및 개인 매핑 페이지는 어떻습니까? 해당 페이지가 공개된 후 사용자는 어떻게 콘텐츠에 액세스할 수 있나요?

관련 정보