uio Estrutura
Propósito
Descreve um buffer de memória a ser usado em uma transferência de dados.
Introdução
A estrutura de E/S ou uio do usuário é uma estrutura de dados descrevendo um buffer de memória para ser usado em uma transferência de dados. A estrutura uio é mais comumente usada nas interfaces de leitura e gravação para drivers de dispositivos suportando o caráter ou a E/S bruta. Ele também é útil em outras instâncias em que um buffer de entrada ou de saída pode existir em diferentes tipos de espaços de endereço, e no qual o buffer não é contíguo na memória virtual.
A estrutura uio é definida no arquivo /usr/include/sys/uio.h .
Descrição
A estrutura uio descreve um buffer que não é contíguo na memória virtual. Ele também indica o espaço de endereço no qual o buffer é definido. Quando usado na interface de leitura e gravação do dispositivo de caracteres, ele também contém as bandeiras do modo open-mode, juntamente com o deslocamento de leitura / gravação do dispositivo.
O kernel fornece serviços que acessam dados usando uma estrutura uio . Os serviços de kernel ureadc, uwritec, uiomovee uphysio todos executam transferências de dados para dentro ou para fora de um buffer de dados descrito por uma estrutura uio . O serviço kernel ureadc grava um caractere no buffer descrito pela estrutura uio . O serviço kernel uwritec lê um caractere do buffer. Esses dois serviços têm nomes opostos do que você esperaria, já que eles são nomeados para a ação do usuário iniciando a operação. Uma leitura por parte do usuário resulta assim em um driver de dispositivo escrevendo para o buffer, enquanto uma gravação resulta em uma leitura de driver do buffer.
O serviço kernel uiomove copia dados para ou a partir de um buffer descrito por uma estrutura uio de ou para um buffer no espaço de endereço do sistema. O serviço kernel uphysio é usado principalmente por drivers de dispositivos de bloqueio fornecendo suporte de E/S bruto. O serviço kernel uphysio converte a solicitação de leitura ou gravação de caracteres em uma solicitação de leitura ou gravação de bloco e envia para a rotina ddstrategy .
O buffer descrito pela estrutura uio pode consistir em múltiplas áreas não contíguas de memória virtual de comprimentos diferentes. Isso é alcançado descrevendo o buffer de dados com uma matriz de elementos, cada um dos quais consiste em um endereço de memória virtual e um comprimento de byte. Cada elemento é definido como umiovecelemento. A estrutura uio também contém um campo especificando o número total de bytes no buffer de dados descrito pela estrutura.
Outro campo na estrutura uio descreve o espaço de endereço do buffer de dados, que pode ser espaço do sistema, espaço do usuário ou espaço de memória cruzada. Se o espaço de endereço for definido como memória cruzada, uma matriz adicional de descritores de memória cruzada é especificada na estrutura uio para combinar com a matriz deiovecelementos.
A estrutura uio também contém um deslocamento de bytes (uio_offset). Este campo é um número inteiro de 64 bit (offset_t); ele permite que o sistema de arquivos envie solicitações de E/S para os pontos de entrada de leitura & gravação do driver de dispositivo que possuem deslocamentos lógicos além de 2 gigabytes. Os drivers de dispositivos devem usar o cuidado para não causar perda de significância, atribuando o deslocamento a uma variável 32 bit ou usando-a em cálculos que transbordam uma variável de 32 bit.
A rotina chamada (driver de dispositivo) é permitida para modificar campos nas estruturas uio e iovec à medida que a transferência de dados avança. A finaluio_residcontagem é de fato usada para determinar o quanto os dados foram transferidos. Portanto, esta contagem deve ser decretada, com cada operação, pelo número de bytes efetivamente copiados.
A estrutura uio contém os seguintes campos:
| autorização | Descrição |
|---|---|
| uio_iov | Um ponteiro para uma matriz de estruturas iovec descrevendo o buffer de usuário para a transferência de dados. |
| uio_xmem | Um ponteiro para uma matriz de estruturas xmem contendo os descritores de memória cruzada para a matriz iovec . |
| uio_iovcnt | O número de estruturas iovec ainda-para-serem-processadas na matriz apontada pelouio_iovponteiro. A contagem deve ser de pelo menos 1. Se a contagem for maior que 1, então um scatter-reunir dos dados deve ser realizado dentro ou fora das áreas descritas pelas estruturas iovec . |
| uio_iovdcnt | O número de estruturas iovec já processadas na matriz iovec . |
| uio_offset | O deslocamento de arquivo estabelecido por uma chamada anterior lseek, llseek subroutine. A maioria dos dispositivos de caracteres ignoram essa variável, mas alguns, como o pseudo-dispositivo /dev/mem , usam e mantêm. |
| uio_segflg | Uma sinalização indicando o tipo de buffer que está sendo descrito pela estrutura uio . Esta sinalização geralmente descreve se a área de dados está em espaço de usuário ou kernel ou está em memória cruzada. Consulte o arquivo /usr/include/sys/uio.h para uma descrição dos valores possíveis desta bandeira e seus significados. |
| uio_fmode | O valor do modo de arquivo que foi especificado na abertura do arquivo ou modificado pelo subroutine fcntl . Esta sinalização descreve os parâmetros de controle de arquivo. O arquivo /usr/include/sys/fcntl.h contém valores específicos para esta bandeira. |
| uio_resid | A contagem de bytes para a transferência de dados. Não deve exceder a soma de todos osiov_lenvalores na matriz de estruturas iovec . Inicialmente, esse campo contém a contagem total de bytes e, quando a operação for concluída, o valor deve ser decretado pelo número real de bytes transferidos. |
A estrutura iovec contém o endereço inicial e o comprimento de uma área de dados contíguos a serem utilizados em uma transferência de dados. A estrutura iovec é o tipo de elemento em uma matriz apontada pelouio_iovcampo na estrutura uio . Esta matriz pode conter qualquer número de estruturas iovec , cada uma das quais descreve uma única unidade de armazenamento contíguo. Realizadas em conjunto, essas unidades representam a área total em que, ou a partir da qual, os dados devem ser transferidos. Os comandosuio_iovcntcampo dá o número de estruturas iovec na matriz.
A estrutura iovec contém os seguintes campos:
| autorização | Descrição |
|---|---|
| iov_base | Uma variável na estrutura iovec contendo o endereço base da área de dados contíguos no espaço de endereço especificado pelouio_segflag. O comprimento da área de dados contíguos é especificado peloiov_len. |
| iov_len | Uma variável na estrutura iovec contendo o comprimento de byte da área de dados iniciando no endereço dado na variável iov_base . |