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