Voltar à lista
Linux x86_64Memória#9

mmap

Mapeia um arquivo ou memória anônima diretamente no espaço de endereçamento do processo.

Descrição

Uma das syscalls mais versáteis do Linux: usada para carregar executáveis e bibliotecas compartilhadas, implementar alocadores de memória (malloc para blocos grandes), compartilhar memória entre processos (com MAP_SHARED) e mapear arquivos para acesso como se fossem memória comum.

Header: sys/mman.hman 2

Atenção

MAP_FIXED substitui silenciosamente qualquer mapeamento existente que se sobreponha ao intervalo solicitado — usar sem cuidado pode corromper outras alocações do processo.

Assinatura

void * mmap(
    void * addr,
    size_t length,
    int prot,
    int flags,
    int fd,
    off_t offset
);

Parâmetros

ParâmetroTipoDescrição
addrvoid *Endereço sugerido para o mapeamento, ou NULL para o kernel escolher.
lengthsize_tTamanho do mapeamento em bytes.
protintProteção de memória: combinação de PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE.
flagsintMAP_SHARED, MAP_PRIVATE, MAP_ANONYMOUS, MAP_FIXED, entre outras.
fdintDescritor do arquivo a mapear, ou -1 com MAP_ANONYMOUS.
offsetoff_tDeslocamento no arquivo onde o mapeamento começa (deve ser múltiplo do tamanho de página).

Registradores (x86_64)

RegistradorPapelArgumento
raxnúmero da syscall (chamada) / valor de retorno (após SYSCALL)
rdiargumento 1addrvoid *
rsiargumento 2lengthsize_t
rdxargumento 3protint
r10argumento 4flagsint
r8argumento 5fdint
r9argumento 6offsetoff_t

Valor de retorno

Endereço onde o mapeamento foi criado em sucesso; MAP_FAILED ((void *) -1) em erro, com errno definido.

Códigos de erro (errno)

EACCES(13)
Permissão negada.
EAGAIN(11)
Recurso temporariamente indisponível (tente novamente); também conhecido como EWOULDBLOCK.
EBADF(9)
Descritor de arquivo inválido.
EINVAL(22)
Argumento inválido.
ENOMEM(12)
Memória insuficiente para completar a operação.
ENODEV(19)
Dispositivo inexistente.
EPERM(1)
Operação não permitida (falta de privilégio).

Relacionadas