Universal Page List
Rev.28を表示中。最新版はこちら。
ページのRead/Writeをする時にPagerやファイルシステム間でデータの引渡しに使われているPage Listデータ構造。I/Oが完了したら、commitかabortをしてVM Objectのページの状態を実体に合わせる(PageOutしたならm->pageoutをTRUEにするなど)。
図1 UPLの構造
[関連関数]
vm_object_upl_request()
指定VM Objectのoffsetからsize分に関するページのUPLを構築する。VM
Object配下のページはcleaning:TRUE,dirty:TRUE,precious:FALSEにする。
UPL_SET_LITEが指定されていたら、UPL_LITE形式のUPLを作成する(図1)。これは、末尾にページ数分のビットマップが付いた形式で、commit/abort処理が終ったページのビットを落すようになっている。
UPL_SET_LITE指定がなければ非UPL_LITE形式のUPLが作成される。また、この時VM ObjectをshadowしたPageout Object(*1)が作成される。Pageout Object配下のページはprivate:TRUE,pageout:TRUEで初期化される。
UPL_COPYOUT_FROMが指定されていた場合はPageOut要求のUPLを作成する。
PageinのUPLを作る際、ページがまだ割り当ててなかったらページを割り当てる(absent:TRUEとなる)。
UPL_SET_LITEが指定されていたら、UPL_LITE形式のUPLを作成する(図1)。これは、末尾にページ数分のビットマップが付いた形式で、commit/abort処理が終ったページのビットを落すようになっている。
UPL_SET_LITE指定がなければ非UPL_LITE形式のUPLが作成される。また、この時VM ObjectをshadowしたPageout Object(*1)が作成される。Pageout Object配下のページはprivate:TRUE,pageout:TRUEで初期化される。
UPL_COPYOUT_FROMが指定されていた場合はPageOut要求のUPLを作成する。
PageinのUPLを作る際、ページがまだ割り当ててなかったらページを割り当てる(absent:TRUEとなる)。
upl_create(flags, size)
size(Byte)分のUPLを作成する。
upl_destroy()
UPLを解放する。commitかabort後に行なう。
upl_commit()
実行した処理に応じてvm_pageの状態を更新する。
upl_abort()
エラー種別に応じてvm_pageを更新する。
ubc_upl_commit()
ubc_upl_abort()
ubc_upl_map()
UPL内のページをカーネル空間にマップする。
実際の処理はvm_map_enter_upl()で行なう。
実際の処理はvm_map_enter_upl()で行なう。
vm_map_enter_upl()
UPL内のページを仮想アドレス空間にマップするルーチン。
UPL_LITE形式のUPLの場合でも、ここでPageout Objectを作成する。
Pageout Objectを含む新たなRegionが作成されvm_mapに挿入される。
PTEを設定してUPL内のページを新しく作成したRegionにマップさせる。
この作成されたRegionのプロテクションはRead/Write可能になっている。
Pageout Objectを含む新たなRegionが作成されvm_mapに挿入される。
PTEを設定してUPL内のページを新しく作成したRegionにマップさせる。
この作成されたRegionのプロテクションはRead/Write可能になっている。
(*1) Pageout Object
Pagein/out対象のページをshadowするVM Object。Pagein/outのI/OはPageout Objectの方を経由して行なわれる。これは、わざわざPageout Objectを作っていそこからアクセスするのは元のVM Objectが属するRegionのプロテクションを変えないようにするためだと思われる。
Pageout Objectは、ubc_upl_map()でUPLのページをカーネル空間にマップする際に仮想アドレス空間(vm_map)と関連づけられる。ubc_upl_map()(正確にはvm_map_enter_upl())はUPLのページをマップするための新しいRegionを確保して、そこにPageout Objectを対応づけている。また、この新しく確保されたRegionのプロテクションはRead/Write共に可能(Pagein/outを行なうため)。