Mac OS Xのカーネル Xnuのメモ書き

Universal Page List


Rev.27を表示中。最新版はこちら

作成中

ページの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)。これは、末尾にページ数分のビットマップが付いた形式で、commit/abort処理が終ったページのビットを落すようになっている。

UPL_SET_LITE指定がなければ非UPL_LITE形式のUPLが作成される。また、この時VM ObjectをshadowしたPageout Objectが作成される。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にマップさせる。


Pageout Object
Pageout Objectは、ubc_upl_map()でUPLをカーネル空間にマップする際に使用される。UPLをマップする仮想アドレス領域(Region)にPageout Objectが対応づけられる。Pagein/outのI/OはこのRegionから行なわれる。
このRegionはRead/Write共に可能。Pagein/outを行なう際にここから行なうため。


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


最近更新したページ