最近、私はLinuxカーネルコードのメモリ管理部分を読んでいました(私が読んだバージョンは4.10です)。私はmremapの実装が奇妙だと思います。
簡単に言うと、基本的には次のことを行いますsys_mremap()
。move_vma()
copy_vma()
move_page_tables()
do_munmap()
ステップ1と2は理解しやすいです。古いメモリマップから新しいメモリマップにコピーするだけです。ただし、これらの2つのステップで新しいメモリマップにコピーすると、構造ページの参照カウントは増加しません(ソースコードに見つかりませんでした)。
ステップ3で、カーネルは以前のマッピングをマッピング解除します。各vmaと各ページを繰り返し、構造体ページの参照カウントを減らし、最後にtlb_flush_mmu_free()
すべてのページをfreeとして呼び出します。
私の質問は次のとおりです
- カーネルがこのようにmremapを実装している場合、次のページへのアクセスによってページエラーが発生しますか?
- カーネルが参照カウントを増やさないのはなぜですか
move_vma()
? mremap 後にページをメモリに保持し、不要なページエラーを発生させません。 - 匿名と個人マッピングのページはどうですか?そのページが公開された後、ユーザーはどのようにコンテンツにアクセスできますか?