コピーオンライト

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

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

img65.gif

(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1