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


8

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

pmap -x `pidof bash`

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

/ proc / pid / smaps もチェックしましたが、そのページは「Private Dirty」と記述されています。

回答:


7

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

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

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

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


まだ確認していませんが、PIC以外の共有オブジェクトを使用して、読み取り専用の実行可能なプライベートダーティページを取得することもできます。それがPIC共有オブジェクトが事実上ほとんど必要になった理由だと思います。
Andrew Henle 2017年

2

Gillesがリストするケースに加えて:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.