Skip site navigation (1)Skip section navigation (2)

FreeBSD Man Pages

Man Page or Keyword Search:
Man Architecture
Apropos Keyword Search (all sections) Output format
home | help
PHYSIO(9)              FreeBSD Kernel Developer's Manual             PHYSIO(9)

     physio - initiate I/O on raw devices

     #include <sys/param.h>
     #include <sys/systm.h>
     #include <sys/buf.h>

     physio(dev_t dev, struct uio *uio, int ioflag);

     The 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
     transfer described by uio.  The maximum amount of data to transfer with
     each call to strategy is determined by the minphys routine.  Since uio
     normally describes user space addresses, physio() needs to lock the
     process into memory.  This is done by setting the P_PHYSIO flag on the
     process.  physio() always awaits the completion of the entire requested
     transfer before returning, unless an error condition is detected earlier.
     In all cases, the buffer passed in bp is locked (marked as ``busy'') for
     the duration of the entire transfer.

     A break-down of the arguments follows:

             The device strategy routine to call for each chunk of data to
             initiate device I/O.

     bp      The buffer to use with the strategy routine.  The buffer flags
             will have B_BUSY, and B_PHYS set when passed to the strategy
             routine.  If NULL, a buffer is allocated from a system pool.

     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
             transfer 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
     strategy 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.

     read(2), write(2)

FreeBSD 11.0-PRERELEASE          June 15, 1996         FreeBSD 11.0-PRERELEASE


Want to link to this manual page? Use this URL:

home | help