PHYSIO(9)

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

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

解説
physio() は通常、 文字型デバイスの read および write ルーチンから呼び出されるヘルパー関数で、 ユーザープロセスのバッファへの入出力を開始させます。 この関数は uio 構造体に記述されている転送が完了するまで、与えられた strategy ルーチンを 1 回以上呼び出します。 strategy を呼び出すごとの最大のデータ転送量は minphys ルーチンによって決定されます。 uio 構造体は通常ユーザー空間のアドレスを示すので、 physio() はプロセスをメモリ中にロックする必要があります。 これは、プロセスに P_PHYSIO フラグをセットすることで行ないます。 以前にエラー状態が検出された時を除いて、 physio() は常にリターンする前に全ての要求された転送が完了するまで待ちます。 全ての場合に、 bp に渡されるバッファは転送が完了するまでの期間中、ロック( “busy” にマーク)されます。

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

strategy
    それぞれのデータのかたまりをデバイスに入出力開始させるために呼ばれる デバイスの strategy ルーチン。

bp  strategy ルーチンで使用されるバッファ。 このバッファのフラグは strategy に渡される時に B_BUSY および B_PHYS がセットされます。 もし bp が NULL であれば、システムのプールから割り当てられます。

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

flags
    転送方向。 有効な設定は B_READ または B_WRITE のみ。

minphys
    デバイスの strategy ルーチンが取り扱う事ができる最大の転送サイズを 決定するために呼ばれる、デバイス固有のルーチン。

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

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

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