web-dev-qa-db-ja.com

読み取り専用メモリマップ領域にダーティページがあるのはなぜですか?

(たとえば)次のコマンドを実行して、メモリマップページのリストを取得します。

pmap -x `pidof bash`

私はこの出力を得ました: enter image description here 一部の読み取り専用ページが「ダーティ」としてマークされている、つまり、ライトバックが必要なページが書き込まれているのはなぜですか?それらが読み取り専用の場合、プロセスはそれらに書き込むことができないはずです...(提供されている例では、ダーティページは常に4 KBですが、異なる値を持つ他のケースが見つかりました)

/ proc /pid/ smapsも確認しましたが、そのページは「プライベートダーティー」と記述されています。

8
RicoRico

ダーティページは、必ずしもライトバックを必要としません。ダーティページは、カーネルが最後にクリーンとしてマークしてから書き込まれたページです。データを常に元のファイルに保存する必要はありません。

ページは非公開であり、共有されていないため、元のファイルに保存されません。ダーティページを読み取り専用ファイルでバックアップすることは不可能です。ページをRAMから削除する必要がある場合、ページはスワップに保存されます。

読み取り専用、プライベート、ダーティであるが、メモリマップファイルの範囲内にあるページは、通常、実行時に初期化する必要がある定数を含むが、初期化後に変更されないデータページです。たとえば、ポインタを埋め込む静的データが含まれる場合があります。ポインター値はプログラムまたはライブラリーがマップされているアドレスに依存するため、プログラムの開始後に計算する必要があり、この段階ではページが読み取り/書き込み可能です。ポインタが計算された後、プログラムのこのインスタンスではページのコンテンツは変更されないため、ページを読み取り専用に変更できます。コードフラグメントの例については、 stosbによる「ダーティメモリページのハンティング」 を参照してください。

まれに、読み取り専用、実行可能、プライベート、ダーティページが表示される場合があります。これらは、コードとデータをより自由に混合する一部のリンカー、またはジャストインタイムコンパイルで発生します。

ケースに加えて Gilles リスト:

プロセスがフォークすると、カーネルはダーティページをすべて読み取り専用としてマークし、親子で共有されます。プロセスの1つがページに書き込むと、例外が発生し、カーネルがページをコピーして書き込み可能としてマークします。これにより、最終的にどちらのプロセスでも変更されないページをコピーする作業が節約されます。 (この状況では、ページはハードウェアで読み取り専用としてマークされていますが、カーネルによって書き込み可能であると認識されています。)

2