Guia de rastreamento dinâmico Solaris

Argumentos

Os tipos de argumento dos testes io são listados na Tabela 27–2. Os argumentos são descritos na Tabela 27–1.

Tabela 27–2 Argumentos do teste io.

Teste 

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 teste io possui argumentos que consistem em um ponteiro para uma estrutura buf(9S), um ponteiro para devinfo_t e um ponteiro para fileinfo_t . Essas estruturas são descritas com mais detalhes nesta seção.

Estrutura bufinfo_t

A estrutura bufinfo_t é a abstração que descreve uma solicitação de E/S. O buffer que corresponde a uma solicitação de E/S é apontado por args[0] nos testes start, done, wait-start e wait-done. A definição da estrutura bufinfo_t é a seguinte:

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;

O membro b_flags indica o estado do buffer de E/S e consiste em um operador bit a bit de diferentes valores de estado. Os valores de estado válidos estão na Tabela 27–3.

Tabela 27–3 Valores de b_flags

B_DONE

Indica que a transferência de dados foi concluída. 

B_ERROR

Indica um erro de transferência de E/S. É definido junto com o campo b_error.

B_PAGEIO

Indica que o buffer está sendo usado em uma solicitação de E/S paginada. Veja a descrição do campo b_addr para obter mais informações.

B_PHYS

Indica que o buffer está sendo usado para E/S física (direta) para uma área de dados do usuário. 

B_READ

Indica que os dados devem ser lidos a partir do dispositivo periférico para a memória principal. 

B_WRITE

Indica que os dados devem ser transferidos a partir da memória principal para o dispositivo periférico. 

B_ASYNC

A solicitação de E/S é assíncrona, e não será aguardada. Os testes wait-start e wait-done não são acionados em solicitações de E/S assíncronas. Observe que algumas E/Ss direcionadas para ser assíncronas podem não ter B_ASYNC definida: o subsistema de E/S assíncrona pode implementar a solicitação assíncrona fazendo com que um segmento de trabalho separado realize uma operação de E/S síncrona.

O campo b_bcount é o número de bytes a ser transferido como parte da solicitação de E/S.

O campo b_addr é o endereço virtual da solicitação de E/S, a menos que B_PAGEIO esteja definida. O endereço é um endereço virtual do kernel a menos que B_PHYS esteja definida. Nesse caso, é um endereço virtual do usuário. Se B_PAGEIO estiver definida, o campo b_addr contém dados privados do kernel. Exatamente um de B_PHYS e B_PAGEIO pode ser definido, ou nenhum dos sinalizadores será definido.

O campo b_lblkno identifica qual bloco lógico no dispositivo será acessado. O mapeamento de um bloco lógico para um bloco físico (como o cilindro, a trilha e assim por diante) é definido pelo dispositivo.

O campo b_resid é definido como o número de bytes não transferidos devido a um erro.

O campo b_bufsize contém o tamanho do buffer alocado.

O campo b_iodone identifica uma rotina específica no kernel que é chamada quando a E/S está concluída.

O campo b_error pode conter um código de erro retornado do driver no caso de um erro de E/S. b_error é definido com o conjunto de bits B_ERROR no membro b_flags.

O campo b_edev contém os números principal e secundário do dispositivo acessado. Os consumidores podem usar as sub-rotinas de D getmajor() e getminor() para extrair os números principal e secundário do dispositivo do campo b_edev.

devinfo_t

A estrutura devinfo_t fornece informações sobre um dispositivo. A estrutura devinfo_t correspondente ao dispositivo de destino de uma E/S é apontada por args[1] nos testes start, done, wait-start e wait-done. Os membros de devinfo_t são os seguintes:

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;

O campo dev_major é o número principal do dispositivo. Consulte getmajor(9F) para obter mais informações.

O campo dev_minor é o número secundário do dispositivo. Consulte getminor(9F) para obter mais informações.

O campo dev_instance é o número da instância do dispositivo. A instância de um dispositivo é diferente do número secundário. O número secundário é uma abstração gerenciada pelo driver do dispositivo. O número da instância é uma propriedade do nó do dispositivo. Você pode exibir números de instância de um nó de dispositivo com prtconf(1M).

O campo dev_name é o nome do driver de dispositivo que gerencia o dispositivo. Você pode exibir nomes de driver de dispositivo com a opção -D para prtconf(1M).

O campo dev_statname é o nome do dispositivo conforme informado por iostat(1M). Esse nome também corresponde ao nome de uma estatística do kernel conforme informado por kstat(1M). Esse campo é fornecido para que um resultado iostat ou kstat anormal possa rapidamente ser correlacionado a uma atividade de E/S verdadeira.

O campo dev_pathname é o caminho total do dispositivo. Esse caminho pode ser especificado como um argumento para prtconf(1M) a fim de obter informações detalhadas sobre o dispositivo. O caminho especificado por dev_pathname inclui componentes que expressam o nó do dispositivo, o número de instância e o nó menor. Entretanto, todos esses três elementos não são necessariamente expressados no nome da estatística. Para alguns dispositivos, o nome da estatística consiste no nome do dispositivo e no número da instância. Para outros dispositivos, o nome consiste no nome do dispositivo e no número do nó secundário. Como resultado, dois dispositivos que possuam o mesmo dev_statname podem diferir no dev_pathname .

fileinfo_t

A estrutura fileinfo_t fornece informações sobre um arquivo. O arquivo ao qual uma E/S corresponde é apontado por args[2] nos testes start, done, wait-start e wait-done. A presença de informações do arquivo depende do sistema de arquivos fornecer essas informações ao distribuir solicitações de E/S. Alguns sistemas de arquivos, especialmente de terceiros, podem não fornecer essas informações. Além disso, solicitações de E/S podem surgir de um sistema de arquivos para o qual não existam informações do arquivo. Por exemplo, uma E/S para os metadados do sistema de arquivos não será associada a um arquivo. Finalmente, alguns sistemas de arquivos altamente otimizados podem agregar E/S de arquivos separados em uma única solicitação de E/S. Nesse caso, o sistema de arquivos pode fornecer as informações de arquivo seja para o arquivo que representa a maioria da E/S ou para o arquivo que representa uma parte da E/S. De forma alternativa, o sistema de arquivos pode não fornecer as informações de arquivo nesse caso.

A definição da estrutura fileinfo_t é a seguinte:

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;

O campo fi_name contém o nome do arquivo mas não inclui componentes do diretório. Se nenhuma informação do arquivo for associada a uma E/S, o campo fi_name será definido como a seqüência <none>. Em alguns casos raros, o nome de caminho associado a um arquivo pode ser desconhecido. Nesse caso, o campo fi_name será definido como a seqüência <unknown>.

O campo fi_dirname contém somente o componente de diretório do nome do arquivo. Assim como com fi_name, essa seqüência pode ser definida como <none> se nenhuma informação de arquivo estiver presente, ou <unknown> se o nome de caminho associado ao arquivo não for conhecido.

O campo fi_pathname contém o nome de caminho completo para o arquivo. Assim como com fi_name, essa seqüência pode ser definida como <none> se nenhuma informação de arquivo estiver presente, ou <unknown> se o nome de caminho associado ao arquivo não for conhecido.

O campo fi_offset contém o deslocamento no arquivo, ou -1 se a informação do arquivo não estiver presente ou se o deslocamento não estiver especificado pelo sistema de arquivos.