MMAP(2) | System Calls Manual | MMAP(2) |
mmap
—
#include <sys/mman.h>
void *
mmap
(void
*addr, size_t len,
int prot,
int flags,
int fd,
off_t offset);
mmap
function causes the pages starting at
addr and continuing for at most
len bytes to be mapped from the object described by
fd, starting at byte offset
offset. If len is not a multiple
of the pagesize, the mapped region may extend past the specified range. Any
such extension beyond the end of the mapped object will be zero-filled.
If addr is non-zero, it is used as a hint to
the system. (As a convenience to the system, the actual address of the
region may differ from the address supplied.) If addr
is zero, an address will be selected by the system. The actual starting
address of the region is returned. A successful mmap
deletes any previous mapping in the allocated address range.
The protections (region accessibility) are specified in the prot argument by OR'ing the following values:
PROT_EXEC
PROT_READ
PROT_WRITE
PROT_NONE
As a NetBSD extension, the
PROT_MPROTECT
macro can be used to request
additional permissions for later use with
mprotect
(2). For example
PROT_MPROTECT(PROT_READ)
requests that future
PROT_READ
mappings are allowed and can be enabled
using mprotect(2), but does
not currently grant read mappings to the returned memory segment. This is
necessary for switching pages between writable and executable when PaX
MPROTECT restrictions are in place. See
mremap(2) for a sample use
case.
PROT_WRITE
may imply
PROT_READ
, and PROT_READ
may
imply PROT_EXEC
. Portable programs should not rely on
these flags being separately enforceable.The flags parameter specifies the type of
the mapped object, mapping options and whether modifications made to the
mapped copy of the page are private to the process or are to be shared with
other references. Note that either MAP_SHARED
or
MAP_PRIVATE
must be specified. Sharing, mapping type
and options are specified in the flags argument by
OR'ing the following values:
MAP_ALIGNED(n)
_SC_PAGESIZE
request. The following constants are
defined for convenience:
MAP_ANON
MAP_ANON
regions, and must be specified as -1. The mapped memory will be zero
filled.MAP_FILE
SIGBUS
signal.MAP_FIXED
mmap
will fail. If
MAP_FIXED
is specified, addr
must be a multiple of the pagesize. Use of this option is
discouraged.MAP_HASSEMAPHORE
MAP_INHERIT
MAP_NORESERVE
MAP_REMAPDUP
MAP_RENAME
MAP_STACK
MAP_TRYFIXED
MAP_TRYFIXED
had not been specified. If
addr is NULL
, this flag is
ignored and the system will select a mapping address.MAP_WIRED
MAP_PRIVATE
MAP_SHARED
will be
seen.MAP_SHARED
The close(2) function does not unmap pages, see munmap(2) for further information.
The current design does not allow a process to specify the
location of swap space. In the future we may define an additional mapping
type, MAP_SWAP
, in which the file descriptor
argument specifies a file or device to which swapping should be done.
If MAP_FIXED
is not specified, the system
will attempt to place the mapping in an unused portion of the address space
chosen to minimize possible collision between mapped regions and the
heap.
mmap
returns a pointer to
the mapped region. Otherwise, a value of MAP_FAILED
is
returned and errno is set to indicate the error. The
symbol MAP_FAILED
is defined in the header
<sys/mman.h>
. No successful
return from mmap
() will return the value
MAP_FAILED
.
mmap
() will fail if:
EACCES
]PROT_READ
was specified as part of the
prot parameter and fd was not
open for reading.
The flags MAP_SHARED
and
PROT_WRITE
were specified as part of the
flags and prot parameters
and fd was not open for writing.
PaX mprotect restrictions prohibit the requested protection.
EBADF
]EINVAL
]MAP_FIXED
was specified and the addr parameter was not page
aligned or was outside of the valid address range for a process.
MAP_ANON
was specified and
fd was not -1.
ENODEV
]ENOMEM
]MAP_FIXED
was specified and the addr parameter wasn't
available.
MAP_ANON
was specified and
insufficient memory was available.
EOVERFLOW
]mmap
() function conforms to IEEE
Std 1003.1b-1993 (“POSIX.1b”).
mmap
() interface was first designed in
4.2BSD.
May 2, 2018 | NetBSD 9.2 |