io_map_init Serviço do kernel

Propósito

Cria e inicializa um segmento de mapeamento de E/S.

Sintaxe

#include <sys/adspace.h>
#include <sys/vm_types.h>

io_handle_t io_map_init (io_map_ptr, page_offset, io_handle)
struct io_map *io_map_ptr;
vpn_t page_offset;
io_handle_t io_handle;

struct io_map {
        int key;                         /* structure version number */
        int flags;                       /* flags for mapping */
        int32long64_t size;             /* size of address space needed */
        int bid;                         /* bus ID */
        long long busaddr;              /* bus address */
};

Descrição

O serviço kernel io_map_init criará um segmento para estabelecer uma tradução virtual inibida de cache para a região de endereço de ônibus definida pelo conteúdo da estrutura io_map . O parâmetro bandeiras da estrutura io_map pode ser usado para customizar o mapeamento como fazer a região ler-apenas, usando a sinalização IOM_RDONLY .

O serviço kernel io_map_init retorna uma alça de um tipo opaco io_handle_t para ser usado nas chamadas futuras io_map ou io_unmap . Todos os serviços que utilizam o io_handle retornado por io_map_init devem utilizar a alça a partir da chamada mais recente. Usar uma alça antiga é um erro de programação.

O parâmetro tipo vpn_t representa o deslocamento de número da página virtual para permitir que o responsável pela chamada especifique onde, no segmento virtual, para mapear esta região. O deslocamento não deve entrar em conflito com um mapeamento anterior no segmento. O ouvinte deve mapear a região de E/S crítica mais acessada e de desempenho em vpn_t deslocamento 0 para o segmento. Isso se deve ao fato de que as chamadas io_map subsequentes usando este io_handle retornarão um endereço efetivo representando o início do segmento (ou seja, deslocamento de página 0). O driver de dispositivo é responsável por gerenciar vários deslocamentos no segmento. Uma única página de endereço de memória de barramento pode ser mapeada várias vezes em diferentes deslocamentos vpn_t dentro do segmento.

O parâmetro io_handle_t é útil quando o responsável pela chamada deseja anexar um novo mapeamento a um segmento existente. Para a criação inicial de um novo segmento de E/S, este parâmetro deve ser NULL. Para mapeamentos anexados para o mesmo segmento, este parâmetro é o io_handle_t retornado da última chamada bem-sucedida io_map_init . Se o mapeamento falhar por qualquer motivo (conflitos de deslocamento com mapeamento prévio, ou não mais espaço no segmento), NULL é retornado. Neste caso, o io_handle_t anterior ainda é válido. Se bem-sucedido, o io_handle_t retornado deverá ser usado em todas as chamadas futuras. Dessa forma, um driver de dispositivo pode gerenciar diversos espaços de endereço de E/S de um único adaptador dentro de um único segmento de endereço virtual, exigindo que o driver faça apenas um único anexo, io_map, para ganhar a destinação a todos os mapeamentos.

Parâmetros

Item Descrição
io_map_ptr Pointer para io_map estrutura descrevendo a região de endereço para mapear.
page_offset Deslocamento de página para o qual mapear a região especificada no segmento de endereço virtual.
io_handle Para a primeira chamada, este parâmetro deve ser NULL. Ao incluir em um mapeamento existente, este parâmetro é o io_handle recebido em uma chamada de sucesso anterior para io_map_init.

Ambiente de Execução

O serviço kernel io_map_init pode ser chamado apenas do ambiente de processo.

Valores De Retorno

Item Descrição
io_handle_t Uma alça opaca para o segmento de E/S mapeada na memória virtual que deve ser usada em chamadas subsequentes para este serviço.
NULL Falha ao criar ou anexar mapeamento.