Universal Page List
Rev.24を表示中。最新版はこちら。
作成中ページのRead/Writeをする時にPagerやI/O処理部間でデータの引渡しに使われている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)。指定がなければ非UPL_LITE形式のUPLが作成される。また、この時VM ObjectをshadowしたPageout Objectが作成される。
UPL_COPYOUT_FROMが指定されていた場合はPageOut要求のUPLを作成する。
PageinのUPLを作る際、ページがまだ割り当ててなかったらページを割り当てる(absent:TRUEとなる)。
UPL_SET_LITEが指定されていたら、UPL_LITE形式のUPLを作成する(図1)。指定がなければ非UPL_LITE形式のUPLが作成される。また、この時VM ObjectをshadowしたPageout Objectが作成される。
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_LITE形式のUPLの場合でも、ここでPageout Objectが作成される。
Pageout Objectを含む新たなRegionが作成されvm_mapに挿入される。
Pageout Objectを含む新たなRegionが作成されvm_mapに挿入される。