Guía de seguimiento dinámico de Solaris

Argumentos

Los tipos de argumento para los sondeos io se enumeran en la Tabla 27–2. Los argumentos se describen en la Tabla 27–1.

Tabla 27–2 Argumentos de sondeos io

Sondeo 

args[0]

args[1]

args[2]

start

struct buf *

devinfo_t *

fileinfo_t *

done

struct buf *

devinfo_t *

fileinfo_t *

wait-start

struct buf *

devinfo_t *

fileinfo_t *

wait-done

struct buf *

devinfo_t *

fileinfo_t *

Cada sondeo io tiene argumentos que consisten en un puntero a una estructura buf(9S), un puntero a un devinfo_t y un puntero a un fileinfo_t. Estas estructuras se describen con mayor detalle en esta sección.

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.

devinfo_t

La estructura de devinfo_t proporciona información sobre un dispositivo. La estructura de devinfo_t que corresponde al dispositivo de destino de una E/S es apuntada por args[1] en los sondeos start, done, wait-start y wait-done. Estos son los miembros de devinfo_t:

typedef struct devinfo {
	int dev_major;                  /* major number */
	int dev_minor;                  /* minor number */
	int dev_instance;               /* instance number */
	string dev_name;                /* name of device */
	string dev_statname;            /* name of device + instance/minor */
	string dev_pathname;            /* pathname of device */
} devinfo_t;

El campo dev_major es el número mayor del dispositivo. Consulte getmajor(9F) para obtener más información.

El campo dev_minor es el número menor del dispositivo. Consulte getminor(9F) para obtener más información.

El campo dev_instance es el número de instancia del dispositivo. La instancia de un dispositivo es diferente al número menor. El número menor es una abstracción administrada por el controlador del dispositivo. El número de instancia es una propiedad del nodo del dispositivo. Es posible mostrar los número de instancia del nodo del dispositivo con prtconf(1M).

El campo dev_name es el nombre del controlador del dispositivo que administra el dispositivo. Es posible mostrar los nombres del controlador del dispositivo con la opción -D en prtconf(1M).

El campo dev_statname es el nombre del dispositivo tal como informa iostat(1M). Este nombre también corresponde al nombre de una estadística de núcleo como ha informado kstat(1M). Este campo se proporciona de forma que la salida aberrante de iostat o kstat se puede correlacionar rápidamente a la actividad de E/S real.

El campo dev_pathname es la ruta completa del dispositivo. Esta ruta se puede especificar como argumento para prtconf(1M) con el fin de obtener información detallada sobre el dispositivo. La ruta especificada por dev_pathname incluye componentes que expresan el nodo del dispositivo, el número de instancia y el nodo menor. Sin embargo, estos tres elementos no se expresan necesariamente en el nombre de estadística. En algunos dispositivos, el nombre de estadística consta del nombre del dispositivo y el número de instancia. En otros, el nombre es el nombre del dispositivo y el número del nodo menor. En consecuencia, dos dispositivos que tengan el mismo dev_statname podrían diferir en su dev_pathname .

fileinfo_t

La estructura de fileinfo_t proporciona información sobre un archivo. El nombre de archivo al que corresponde una E/S es apuntado por args[2] en los sondeos start, done, wait-start y wait-done. La presencia de información de archivo está sujeta al sistema de archivos que proporciona esta información al distribuir solicitudes de E/S. Algunos sistemas de archivos, especialmente sistemas de archivos de terceros, no pueden proporcionar esta información. Además, las solicitudes de E/S pueden emanar de un sistema de archivos del que no exista información de archivos. Por ejemplo, las E/S a los meta dados de un sistema de archivos no se asociarán con ningún archivo. Por último, algunos sistemas de archivos altamente optimizados pueden agregar E/S de archivos separados en una sola solicitud de E/S. En este caso, es posible que el sistema de archivos proporcione información del archivo que representa la mayor parte de la E/S o del archivo que representa parte de la E/S. Asimismo, es posible que el sistema de archivos no proporcione ninguna información sobre los archivos.

La definición de la estructura de fileinfo_t es la siguiente:

typedef struct fileinfo {
	string fi_name;                 /* name (basename of fi_pathname) */
	string fi_dirname;              /* directory (dirname of fi_pathname) */
	string fi_pathname;             /* full pathname */
	offset_t fi_offset;             /* offset within file */
	string fi_fs;                   /* filesystem */
	string fi_mount;                /* mount point of file system */
} fileinfo_t;

El campo fi_name contiene el nombre del archivo, pero no incluye ningún componente de directorio. Si no se asocia información de archivo a una E/S, el campo fi_namese configurará en la cadena <none>. En algunos casos aislados, es posible que el nombre de ruta asociado a un archivo sea desconocido. En este caso, el campo fi_name se configurará en la cadena <unknown>.

El campo fi_dirname contiene únicamente el componente de directorio del nombre de archivo. Al igual que en fi_name, esta cadena se puede configurar en <none> si no hay información de archivo, o en <unknown> si el nombre de ruta asociado al archivo es desconocido.

El campo fi_pathname contiene el nombre de ruta completo al archivo. Al igual que en fi_name, esta cadena se puede configurar en <none> si no hay información de archivo, o en <unknown> si el nombre de ruta asociado al archivo es desconocido.

El campo fi_offset contiene el desplazamiento dentro del archivo, o -1 si no hay información de archivo o si el sistema de archivos no especifica el desplazamiento.