VOP_GETPAGES(9) | FreeBSD Kernel Developer's Manual | VOP_GETPAGES(9) |
名称
VOP_GETPAGES, VOP_PUTPAGES — ファイルから VM ページへの読み込みまたは書き込み書式
#include < sys/param.h>#include < sys/vnode.h>
#include < vm/vm.h>
int
VOP_GETPAGES( struct vnode *vp, vm_page_t *ma, int count, int reqpage, vm_ooffset_t offset);
int
VOP_PUTPAGES( struct vnode *vp, vm_page_t *ma, int count, int sync, int *rtvals, vm_ooffset_t offset);
解説
VOP_GETPAGES() メソッドは、通常のファイルによって裏付けられる仮想メモリのページの読み込みのために呼び出されます。他の隣接したページが同じファイルの隣接領域によって裏付けられるなら、 VOP_GETPAGES() は、同様にそれらのページを読み込むために要求されますが、そうするように義務付けられません。 VOP_PUTPAGES() メソッドは、逆を行います。すなわち、仮想メモリの隣接した汚い (dirty) ページを書き込みます。(呼び出しの) 入口で、vnode のロックは、保持されますが、ページキューも VM オブジェクトのロックも保持されません。両方のメソッドは、成功とエラーで返るときの両方とも同じ状態で返ります。
引数は、次の通りです:
- vp
- アクセスするファイル。
- ma
- 読み込まれるか、または書き込まれるファイルの連続する領域を表わすページの配列の最初の要素へのポインタ。
- count
- 配列のページに読み込まれるべきであるバイト数。
- sync
- 書き込みが同期されるべきであるなら、 VM_PAGER_PUT_SYNC。
- rtvals
- VOP_PUTPAGES() によって書き込まれる各ページの状態を示している VM システムの結果のコードの配列。
- reqpage
- 要求されたページのページ配列のインデックス。すなわち、このメソッドの実装が扱わなければならない、1 つのページ。
- offset
- マップされたページが始まるファイルのオフセット。
VOP_PUTPAGES() メソッドの状態は、配列 rtvals[] のページごとを基本として返されます。指定できる状態の値は、次の通りです:
- VM_PAGER_OK
- ページは、成功して書き込まれました。実装は、クリーンなものとしてページをマークするために vm_page_undirty(9) を呼び出さなければなりません。
- VM_PAGER_PEND
- ページは、非同期に書き込まれるようにスケジュールされました。書き込みが完了するとき、完了したコールバックは、ビジーフラグをクリアし、このページを待っている (ウェートしている) 他のスレッドを起こすために、 vm_object_pip_wakeup(9) と vm_page_sunbusy(9) を呼び出すべきであり、さらに vm_page_undirty(9) も呼び出すべきです。
- VM_PAGER_BAD
- ページは、裏付けられているファイルの終りを完全に越えました。この状態は、vnode のファイルシステムが正確に実装されているなら、起こり得るべきではありません。
- VM_PAGER_ERROR
- 根本的な記憶メディアまたはプロトコルのエラーのために、ページを書き込むことができませんでした。
- VM_PAGER_FAIL
- VM_PAGER_ERROR と同じように処理されました。
- VM_PAGER_AGAIN
- ページは、この要求によって扱われませんでした。
VOP_GETPAGES() メソッドは、 vm_page_free(9) を呼び出すことによって、うまく取り扱えない、 ma 中のあらゆるページを解放すると予想されます。成功するとき、 VOP_GETPAGES() は、適切に有効なビットを設定しなければなりません。 VOP_GETPAGES() は、 reqpage ビジーを保持しなければなりません。他のすべての成功して扱われたページをアンビジーとし、適切なページの (複数の) キューに、それらを置かなければなりません。例えば、 VOP_GETPAGES() は、(必要なビットが設定されるなら) ページを活性化するか、または (そうでなければ) それを非活性化して、現在、フォルト (fault) されているページを待っているあらゆるスレッドを起こすために最終的に vm_page_xunbusy(9) を呼び出します。
戻り値
成功して ma[reqpage] を読み込むなら、 VOP_GETPAGES() は、 VM_PAGER_OK を返します。そうでなければ、 VM_PAGER_ERROR を返します。慣例によって、 VOP_PUTPAGES() の返り値は、 rtvals[0] です。関連項目
vm_object_pip_wakeup(9), vm_page_free(9), vm_pagge_sunbusy(9), vm_page_undirty(9), vm_page_xunbusy(9), vnode(9)作者
このマニュアルページは、 によって書かれ、その後 によって大幅に書き直されました。September 27, 2003 | FreeBSD |