[[PageNavi(internal22-navi)]]
{{{ comment
h2w-title:コピーオンライト
}}}
= コピーオンライト = #SECTION04350000000000000000
上記コピーオンライトモードの空間に対し、書き込みを行うとCPU例外が発生する. このときlinuxはdo_wp_page関数を呼び出す. この関数では物理ページの複製を作成し, この例外を発生した空間を管理するPTEはこれを参照するように設定し直す. (書き込み可に設定する).ただし,例外が発生した時点で同じ物理ページを参照するプロセスが他にいない場合は, 単にPTEを書き込み可に変更するのみである. (readアクセスによりdo_no_pageされたばかりの空間、コピーオンライトモードの空間に対し後からアクセスした場合。)
{{{
do_wp_page(タスク、仮想空間管理構造体vm_area_struct、アドレス、....)
{
空き領域から新しいページを確保しておく(__get_free_page関数)
古い物理ページのアドレスをもとめておく(pte_page関数)
if(このページがスワップキャッシュで、かつ参照する唯一のプロセスなら) {
スワップキャッシュからページを削除
(※スワップキャッシュに関しては後述)
}
if(このページを参照する唯一のプロセスなら) {
PTEを書きこみ可とする(pte_mkwrite関数)
PTEのdirtyのビットも立てておく(pte_mkdirty関数)
実際のページテーブルに登録(set_pte関数)
return
}
古いページから新しいページにデータをコピーする(copy_cow_page関数)
書きこみ可、dirtyビットオン、で新しいページを指すpteを作成する。
(pte_mkwrite関数、pte_mkdirty関数、mk_pte関数)
このpteを実際のページテーブルに登録する(set_pte関数)
}
}}}
下図は、コピーオンライトモードで共有しているページに対し書き込みがあった場合の動作を示す。読み込み処理の場合はページを共有したまま行われる。
[[Embed(internal22-images:img65.gif)]]
----
''(NIS)HirokazuTakahashi [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1
[[PageNavi(internal22-navi)]]