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 2Atençã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âmetro | Tipo | Descrição |
|---|---|---|
| addr | void * | Endereço sugerido para o mapeamento, ou NULL para o kernel escolher. |
| length | size_t | Tamanho do mapeamento em bytes. |
| prot | int | Proteção de memória: combinação de PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE. |
| flags | int | MAP_SHARED, MAP_PRIVATE, MAP_ANONYMOUS, MAP_FIXED, entre outras. |
| fd | int | Descritor do arquivo a mapear, ou -1 com MAP_ANONYMOUS. |
| offset | off_t | Deslocamento no arquivo onde o mapeamento começa (deve ser múltiplo do tamanho de página). |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | addrvoid * |
| rsi | argumento 2 | lengthsize_t |
| rdx | argumento 3 | protint |
| r10 | argumento 4 | flagsint |
| r8 | argumento 5 | fdint |
| r9 | argumento 6 | offsetoff_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).