Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
上記コピーオンライトモードの空間に対し、書き込みを行うと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関数) }
下図は、コピーオンライトモードで共有しているページに対し書き込みがあった場合の動作を示す。読み込み処理の場合はページを共有したまま行われる。
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:46:53, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members