Linux でメモリ マップド ページと匿名ページを理解できません。誰かが例を挙げて説明してもらえますか? それらに関連するカーネル データ構造は何ですか?
3 に答える
私が理解しているように、匿名ページには名前付きのファイルシステムソースがないため、名前が付けられていますが、マップされたページは具体的なファイルのマッピングです。たとえば、任意のユーザー空間プロセスで単純な malloc 操作を使用して匿名ページを取得できます...
カーネル構造について: 明らかにstruct pageですが、anonymos ページの場合はstruct anon_vmaが page- >mapping に配置され、マップされたページの場合はstruct address_spaceが具体的な inode に接続されます。
メモリ マップド ページの意味がわかりません。だから私はそれについて話すつもりはありません。
匿名ページに関しては、通常、カーネルがページ フレームの再利用を行うときに参照されます。匿名ページのインスタンスには、プロセスのスタック、ヒープ、共有メモリ、および変更された共有ライブラリが含まれます。Linux では、すべての動的共有ライブラリは、次のようなシステム コールを介してプロセスの仮想メモリ アドレス空間にマップされます。
firo@linux-6qg8:~> strace -e mmap,openat ls 2>&1 |grep -A1 libc.so
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
mmap(NULL, 3906144, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
MAP_PRIVATEed ファイル/ライブラリに属するページへの書き込みは、ファイル バックエンド ページから匿名ページへの変更をトリガーします。
定義上、匿名ページ (匿名メモリとも呼ばれます) は、カーネルがページ フレームの再利用を行うときにスワップされるバックエンド デバイスを持たない一種のページです。これが、Linux がスワップ領域をサポートする理由です。
匿名ページに関連するカーネル データ構造には 2 種類あります。
匿名ページを再利用するには、カーネルは匿名ページを使用して PTE (ページ テーブル エントリ) を変更しているすべてのプロセスを認識している必要があります。これをリバース マッピングまたは rmap と呼びます。
struct address_space は、リバース マッピングを維持するために共有メモリによって使用されます。
struct anon_vma は、残りの匿名ページで逆マッピングを維持するために使用されます。
カーネルは、LRU アルゴリズムを使用してページ フレームを再利用します。カーネル 5.0 以降の場合、struct pglist_data の struct lruvec を確認してください