PHYSIO(9) | FreeBSD Kernel Developer's Manual | PHYSIO(9) |
名称
physio — 生 (raw) デバイスで I/O を開始する書式
#include < sys/param.h>#include < sys/systm.h>
#include < sys/bio.h>
#include < sys/buf.h>
int
physio( struct cdev *dev, struct uio *uio, int ioflag);
解説
physio() は、ユーザプロセスのバッファで I/O を開始するためのキャラクタデバイス read() と write() ルーチンから通常、呼び出されるヘルパ関数です。各呼び出しで転送するデータの最大の量は、 dev->si_iosize_max によって決定されます physio() 呼び出しは、I/O 要求を strategy() 要求に変換し、新しい要求をプロセスのためのドライバの strategy() ルーチンへ渡します。uio は、通常ユーザ空間のアドレスを記述するので、 physio() は、それらのページをメモリにロックする必要があります。これは、適切なページに対して vmapbuf() を呼び出すことによって行われます。 physio() は、エラー状態が以前に検出されないなら、返る前にすべての要求された転送の完了を常に待ちます。
引数の内訳は、次の通りです:
- dev
- やりとりするデバイスを識別するデバイス番号。
- uio
- ユーザプロセスによって要求される全体の転送の記述。現在、 UIO_USERSPACE 以外のあらゆるものに設定される uio_segflg がある uio 構造体を渡す結果は、未定義です。
- ioflag
- physio() を呼び出している read() または write() 関数からの ioflag 引数。
戻り値
成功するなら、 physio() は、0 を返します。 uio によって記述されたアドレス範囲が要求しているプロセスによってアクセス可能でないなら、 EFAULT が返されます。 physio() は、 B_ERROR バッファフラグと b_error フィールドを調査することによって、デバイスの戦略ルーチンへの呼び出しからのあらゆるエラーの結果を返します。実際の転送サイズは、デバイスか“end of file”状態のシグナルを発生するなら、 uio によって要求されたサイズ未満であることにことに注意してください。歴史
physio マニュアルページは、 FreeBSD で適用するためのわずかな変更とともに、もともと NetBSD からのものです。physio 呼び出しは、より高い I/O とページングの性能を提供するために完全に書き直されました。
January 19, 2012 | FreeBSD |