物理ページを解放するためにmremapを実行しますか?

物理ページを解放するためにmremapを実行しますか?

最近、私はLinuxカーネルコードのメモリ管理部分を読んでいました(私が読んだバージョンは4.10です)。私はmremapの実装が奇妙だと思います。

簡単に言うと、基本的には次のことを行いますsys_mremap()move_vma()

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

ステップ1と2は理解しやすいです。古いメモリマップから新しいメモリマップにコピーするだけです。ただし、これらの2つのステップで新しいメモリマップにコピーすると、構造ページの参照カウントは増加しません(ソースコードに見つかりませんでした)。

ステップ3で、カーネルは以前のマッピングをマッピング解除します。各vmaと各ページを繰り返し、構造体ページの参照カウントを減らし、最後にtlb_flush_mmu_free()すべてのページをfreeとして呼び出します。

私の質問は次のとおりです

  1. カーネルがこのようにmremapを実装している場合、次のページへのアクセスによってページエラーが発生しますか?
  2. カーネルが参照カウントを増やさないのはなぜですかmove_vma()? mremap 後にページをメモリに保持し、不要なページエラーを発生させません。
  3. 匿名と個人マッピングのページはどうですか?そのページが公開された後、ユーザーはどのようにコンテンツにアクセスできますか?

関連情報