PHYSIO(9)

名称
physio - ロウデバイスの入出力の開始

書式
<sys/param.h> <sys/systm.h> <sys/bio.h> <sys/buf.h> int physio(dev_t dev, struct uio *uio, int ioflag)

解説
physio() は通常、 文字型デバイスの read() および write() ルーチンから呼び出されるヘルパー関数で、 ユーザプロセスのバッファへの入出力を開始させます。 呼び出しごとの最大のデータ転送量は dev->si_iosize_max によって決定されます。 physio() の呼び出しは入出力要求を strategy() 要求に変換し、その処理のため新しい要求をドライバの strategy() ルーチンに渡します。

uio 構造体は通常ユーザ空間のアドレスを示すので、 physio() はこれらのページをメモリ中にロックする必要があります。 これは適切なページに対する vmapbuf() を呼び出すことで行われます。 以前にエラー状態が検出された時を除いて、 physio() は常にリターンする前に全ての要求された転送が完了するまで待ちます。

引数の詳細を下記に示します。

dev デバイスを識別するために関連付けられたデバイス番号。

uio ユーザプロセスから要求された転送全体の記述。 現在は、 uio 構造体の uio_segflg フラグに UIO_USERSPACE 以外の値をセットして渡した場合の結果は未定義です。

ioflag
    physio() を呼び出している read() または write() 関数からの ioflag 引数。

戻り値
成功すれば physio() は 0 を返します。 uio 構造体に示されているアドレス範囲が要求したプロセスから アクセスできない場合には EFAULT を返します。 physio() はデバイスの strategy ルーチンを呼んだ結果として発生する あらゆるエラーを B_ERROR バッファフラグおよび b_error フィールドを調査して返します。 デバイスが “end of file” の状態を示している時には、実際の転送サイズは uio 構造体で要求しているサイズよりも小さくなる事に注意してください。

関連項目
read(2), write(2)

歴史
physio のマニュアルページは元々は NetBSD のもので、 FreeBSD に適応させるために少しの変更があります。

physio の呼び出しは、より高い入出力およびページングのパフォーマンスのために、 完全に書き直されています。