web-dev-qa-db-ja.com

Linuxはどのようにして物理アドレスを(場合によっては複数の)仮想アドレスに変換しますか?

私の理解では、Linuxが物理ページフレームをRAMにスワップイン/スワップアウトする場合、この物理ページにマッピングされるすべての仮想ページに有効なビットを設定する必要があります。仮想ページを物理ページフレームにマッピングすることは教科書で十分に説明されているようですが、カーネルはどのようにして物理ページフレームからすべての仮想ページを見つけるのでしょうか。 Linuxソースコードでの実際の実装をいただければ幸いです。

2
Eric Stdlib

メモリの各物理ページは、 struct page を使用してカーネルで追跡されます。これにより、カーネルは各ページの使用方法を記述できます。特に、匿名およびファイルベースのマッピングの場合、 mapping フィールドは、マップされたオブジェクトを記述するために使用される address_space 構造を指します。

特定の物理ページを使用して仮想マッピングを検索する必要があるコードの場合、カーネルは一連の 逆マッピング関数 を提供します。これらにより、匿名マッピングとファイルバックマッピングの逆マッピングを実行できます。たとえば、 try_to_unmap は、特定の物理ページの使用を探してマップをウォークし、マップを解除できるようにします。 shrink_page_listプロセスにマップされているページのマップを解除する必要があると判断した場合はtry_to_unmap を呼び出します。

4
Stephen Kitt