Guía de seguimiento dinámico de Solaris

Estructura bufinfo_t

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.