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. |