The
physio()
is a helper function typically called from character device
read()
and
write()
routines to start I/O on a user process buffer.
The maximum amount of data to transfer with each call
is determined by
dev->si_iosize_max.
The
physio()
call converts the I/O request into a
strategy()
request and passes the new request to the driver's
strategy()
routine for processing.
Since
uio
normally describes user space addresses,
physio()
needs to lock those pages into memory.
This is done by calling
vmapbuf()
for the appropriate pages.
physio()
always awaits the completion of the entire requested transfer before
returning, unless an error condition is detected earlier.
A break-down of the arguments follows:
| dev
|
| |
The device number identifying the device to interact with.
|
| 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 undefined.
|
| ioflag
|
| |
The ioflag argument from the
read()
or
write()
function calling
physio().
|