4

Linux にプロセスがあり、そこからfork()別の同一のプロセスがあるとします。ing の後fork、元のプロセスがメモリへの書き込みを開始すると、Linux のコピー オン ライトメカニズムによって、フォークされたプロセスが使用するものとは異なる一意の物理メモリ ページがプロセスに与えられます。

実行のある時点で、元のプロセスのどのページが書き込み時にコピーされたかを知るにはどうすればよいですか?

SIGSEGV シグナル ハンドラーを使用して、最初からすべてのページへの読み取り専用アクセスを許可したくありません。これは、望ましくないオーバーヘッドを誘発するためです。

4

2 に答える 2

3

システムコールのトレース - fork()、clone():

copy_process()->copy_mm()->dup_mm()->dup_mmap()-->ここで、VMA ごとに VMA を通過して「コピー オン ライト」としてマークするアルゴリズムを見つけることができます。

http://www.cs.columbia.edu/~krj/os/lectures/L17-LinuxPaging.pdf

http://www.cs.columbia.edu/~junfeng/13fa-w4118/lectures/l20-adv-mm.pdf

基本的に (スライドを参照)、PTE が書き込み不可 (ハードウェア ベース) で、VMA が書き込み可能 (ソフトウェア ベース) とマークされている場合、それはメモリがコピー オン ライトであることを意味します。

そのためのカーネル モジュールをいつでも作成できます。

于 2016-04-11T04:04:15.897 に答える
0

おそらく、いくらかのオーバーヘッドを受け入れる必要があります。

特権がある場合は、/proc/self/pagemap (64 ビット、オフセット 8*(addr / PAGE_SIZE)) をプリロードして、PFN (下位 54 ビット) を取得できます。次に、/proc/kpagecount でその PFN を調べて、ページが共有されているかどうかを確認します。

権限がない場合は、親子のページマップで PFN を比較できます。

マッピング内のページのいずれかが共有されているかどうかは、Pss (比例セット サイズ) と /proc/smaps 内の合計サイズを比較することでわかります。

于 2012-06-02T04:48:55.727 に答える