Mac OS Xのカーネル Xnuのメモ書き
最近更新したページ

Universal Page List


ページの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_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()
UPL内のページを仮想アドレス空間にマップするルーチン。

UPL_LITE形式のUPLの場合でも、ここでPageout Objectを作成する。
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を行なうため)。マップ後は図2のようになっているはず。


図2 Pageout Objectとアドレス空間の関係


最終更新 2006/06/22 16:58:32 - kztomita
(2006/06/13 16:12:46 作成)
添付ファイル
upl.png - kztomita
pageoutobject.png - kztomita