La estructura bufinfo_t es la abstracción que describe una solicitud de E/S. La memoria intermedia que corresponde a una solicitud de E/S es apuntada por args[0] en los sondeos start, done, wait-start y wait-done. La definición de la estructura bufinfo_t es la siguiente:
typedef struct bufinfo { int b_flags; /* flags */ size_t b_bcount; /* number of bytes */ caddr_t b_addr; /* buffer address */ uint64_t b_blkno; /* expanded block # on device */ uint64_t b_lblkno; /* block # on device */ size_t b_resid; /* # of bytes not transferred */ size_t b_bufsize; /* size of allocated buffer */ caddr_t b_iodone; /* I/O completion routine */ dev_t b_edev; /* extended device */ } bufinfo_t;
El miembro b_flags indica el estado de la memoria intermedia de E/S y consiste en un bitwise-or de distintos valores de estado. Los valores de estado válidos se encuentran en la Tabla 27–3.
Tabla 27–3 Valores b_flags
B_DONE |
Indica que la transferencia de datos ha finalizado. |
B_ERROR |
Indica un error de transferencia de E/S. Se configura junto con el campo b_error. |
B_PAGEIO |
Indica que la memoria intermedia se está utilizando en una solicitud de E/S paginada. Consulte la descripción del campo b_addr para obtener más información. |
B_PHYS |
Indica que la memoria intermedia se está utilizando para E/S físicas (directas) a un área de datos de usuario. |
B_READ |
Indica que los datos se van a leer desde un dispositivo periférico en una memoria principal. |
B_WRITE |
Indica que los datos se van a transferir de la memoria principal al dispositivo periférico. |
B_ASYNC |
La solicitud de E/S es asíncrona y no se le esperará. Los sondeos wait-start y wait-done no se activan para las solicitudes de E/S asíncronas. Tenga en cuenta que es posible que algunas E/S dirigidas para ser asíncronas no tengan B_ASYNC configurado: el subsistema de E/S asíncrono puede implementar la solicitud asíncrona haciendo que un subproceso trabajador independiente realice una operación de E/S síncrona. |
El campo b_bcount es el número de bytes que se van a transferir como parte de la solicitud de E/S.
El campo b_addr es la dirección virtual de la solicitud de E/S, a menos que B_PAGEIO esté configurado. La dirección es una dirección virtual del núcleo, a menos que B_PHYS esté configurado, en cuyo caso, será la dirección virtual de un usuario. Si B_PAGEIO está configurado, el campo b_addr contiene datos privados del núcleo. Se puede configurar exactamente uno de B_PHYS y B_PAGEIO o no se configurará ningún indicador.
El campo b_lblkno identifica a qué bloque lógico del dispositivo se va a acceder. El dispositivo define la asignación desde un bloque lógico a un bloque físico (como el cilindro, la pista, etc.)
El campo b_resid se configura con el número de bytes que no se transfieren debido a un error.
El campo b_bufsize contiene el tamaño de la memoria intermedia asignada.
El campo b_iodone identifica una rutina específica en el núcleo a la que se llama cuando la E/S finaliza.
El campo b_error puede mantener un código de error devuelto desde el controlador en caso de error de E/S. b_error se configura junto con el bit B_ERROR configurado en el miembro b_flags.
El campo b_edev contiene los números mayor y menor de dispositivo del dispositivo al que se ha accedido. Los consumidores pueden utilizar las subrutinas D getmajor() y getminor() para extraer los números de dispositivo mayor y menos del campo b_edev.