VOP_GETPAGES()
メソッドは、通常のファイルが背後にある仮想メモリのページの読み込み
のために、呼び出されます。
他の隣接したページの背後に同じファイルの隣接した領域がある場合には、
VOP_GETPAGES()
は同様にそれらのページを読み込ませるために要求されますが、そうすることが
必須なわけではありません。
VOP_PUTPAGES()
メソッドは反対のことを行います。
すなわち、仮想メモリの隣接したダーティなページを書き出させます。
入る時に、vnode のロックは保持されますが、ページキューと VM オブジェクトの
ロックはどちらも保持されません。
両方のメソッドは、成功して戻る時とエラーで戻る時と両方とも、
そのままの状態で戻ります。
引数は以下の通りです。
vp
|
|
アクセスするファイル。
|
m
|
|
読み込まれるまたは書き込まれるべきファイルの連続した領域を表現する
連続したページの配列の最初の要素へのポインタです。
|
count
|
|
その配列の中のページ数です。
|
sync
|
|
書き込みが同期されるべき場合には
VM_PAGER_PUT_SYNC
です。
|
rtvals
|
|
VOP_PUTPAGES()
によって書き込まれたそれぞれのページの状態を示している VM システムの
結果コードの配列です。
|
reqpage
|
|
ページ配列の中の要求されたページのインデックスです。
すなわち、このメソッドの実装が取り扱わなければならない、1 ページです。
|
offset
|
|
ファイルの中のそのマップされたページが始まる場所へのオフセットです。
|
VOP_PUTPAGES()
メソッドの状態は、配列
rtvals[]
の中に、個々のページごとに返されます。
起こり得る状態値は以下の通りです。
VM_PAGER_OK
|
そのページは成功して書き込まれました。
実装はそのページがクリーンであることを記録するために
vm_pager_undirty(9)
を呼び出さなければなりません。
|
VM_PAGER_PEND
|
そのページは非同期に書き込まれるようにスケジュールされました。
書き込みが完了した時には、完了コールバックはビジーフラグをクリアし、
このページをウェイトしている他のスレッドを起こすために、
vm_object_pip_wakeup(9)
および
vm_page_io_finish(9)
を呼び出すべきです。
さらに
vm_page_undirty(9) [英語]
を呼び出します。
|
VM_PAGER_BAD
|
このページは完全に背後にあるファイルの終端を越えていました。
その vnode のファイルシステムが正しく実装されている場合には、
この状態は起こり得るべきではありません。
|
VM_PAGER_ERROR
|
|
下位の保存メディアまたはプロトコルのエラーのため、
このページは書き込まれることが出来ませんでした。
|
VM_PAGER_FAIL
|
VM_PAGER_ERROR
と同様に取り扱われました。
VM_PAGER_ERROR
|
VM_PAGER_AGAIN
|
|
そのページはこの要求によって取り扱われませんでした。
|