PHYSIO(9) BSD Kernel Developer's Manual PHYSIO(9)
physio -- initiate I/O on raw devices
physio(void (*strategy)(struct buf *), dev_t dev, int flags,
void (*minphys)(struct buf *), struct uio *uio);
physio() is a helper function typically called from character device read
and write routines to start I/O on a user process buffer. It calls back
on the provided strategy routine one or more times to complete the trans-
fer described by uio. The maximum amount of data to transfer with each
call to strategy is determined by the minphys routine. Since uio nor-
mally describes user space addresses, physio() needs to lock the appro-
priate data area into memory before each transaction with strategy (see
the uvm_vslock() and uvm_vsunlock() functions in uvm(9)). physio()
always awaits the completion of the entire requested transfer before
returning, unless an error condition is detected earlier.
In all cases, a temporary buffer is allocated from a system pool. This
buffer will have the B_BUSY, B_PHYS, and B_RAW flags set when passed to
the strategy routine.
A break-down of the arguments follows:
The device strategy routine to call for each chunk of data to
initiate device I/O.
dev The device number identifying the device to interact with.
flags Direction of transfer; the only valid settings are B_READ or
A device specific routine called to determine the maximum trans-
fer size that the device's strategy routine can handle.
uio The description of the entire transfer as requested by the user
process. Currently, the results of passing a uio structure with
the 'uio_segflg' set to anything other than UIO_USERSPACE, are
If successful, physio() returns 0. EFAULT is returned if the address
range described by uio is not accessible by the requesting process.
physio() will return any error resulting from calls to the device strat-
egy routine, by examining the B_ERROR buffer flag and the 'b_error'
field. Note that the actual transfer size may be less than requested by
uio if the device signals an ``end of file'' condition.
BSD September 22, 2010 BSD