コピーオンライト

上記コピーオンライトモードの空間に対し、書き込みを行うと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関数)
}

下図は、コピーオンライトモードで共有しているページに対し書き込みがあった場合の動作を示す。読み込み処理の場合はページを共有したまま行われる。

img72.gif

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1