ページイン

一度スワップアウトされたページへのアクセスが発生すると、CPU例外が発生する。このときlinuxはdo_swap_page関数を呼び出す。

この関数では、例外を発生した空間に対するスワップ上のブロックの内容を空き物理ページに読み込み、その物理ページをこの空間を管理するpteに登録する。

do_swap_page(タスク、仮想空間管理構造体vm_area_struct, アドレス、....)
{
        swapキャッシュを検索(lookup_swap_cache関数)
        if (swapキャッシュ上にない) {
                swapデバイスからswapキャッシュに読み込む.
                    (swapin_readahead関数、read_swap_cache関数)
        }
        swapデバイス上の領域の参照数を1減らす(swap_free関数)
        if (書き込みアクセスで、かつ共有領域でない) {
                swapキャッシュから削除(delete_from_swap_cache_nolock関数)
                書きこみ可、dirtyビットオン、でページを指すpteを作成する。
                   (pte_mkwrite関数、pte_mkdirty関数、mk_pte関数)
        } else {
                ページを指すpteを作成する(mk_pte関数)
        }
        pteを実際のページテーブルに登録(set_pte関数)
}

下図は、スワップアウトされたページに再びアクセスを開始した場合の動きを示している。スワップアウトされたページにアクセスのあった場合、そのブロックに対応するページがswapキャッシュ上にない場合、まずswapキャッシュ上にブロックを読み込みその後でそのページをPTEに登録する。

img75.gif

readアクセスによりswapinされたページ、writeアクセスであるがコピーオンライトモードで共有されたページは、PTEのWビットを落してマップする。

do_swap_page処理のコードからだけでは分かりにくいが、pte_mkwrite関数で明示的にWビットを立てない限り立たないようなアルゴリズムになっている。

コピーオンライトのページは引続き発生する例外の延長でdo_wp_page関数が呼び出され、その処理でのページの複製処理が行われる。


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