MAP_SWAP, PAGEZERO, VM_MEMORY_, hardened_runtime_entitlements| MMAP(2) | System Calls Manual | MMAP(2) |
NAME
mmap — allocate
memory, or map files or devices into memory
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include
<sys/mman.h>
void *
mmap(void
*addr, size_t len,
int prot,
int flags,
int fd,
off_t offset);
DESCRIPTION
The
mmap()
system call 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 offset or
len is not a multiple of the pagesize, the mapped
region may extend past the specified range. Any extension beyond the end of
the mapped object will be zero-filled.
The addr argument is used by the system to
determine the starting address of the mapping, and its interpretation is
dependent on the setting of the MAP_FIXED flag. If MAP_FIXED is specified in
flags, the system will try to place the mapping at the
specified address, possibly removing a mapping that already exists at that
location. If MAP_FIXED is not specified, then the system will attempt to use
the range of addresses starting at addr if they do not
overlap any existing mappings, including memory allocated by
malloc(3) and other such allocators. Otherwise, the system
will choose an alternate address for the mapping (using an implementation
dependent algorithm) that does not overlap any existing mappings. In other
words, without MAP_FIXED the system will attempt to
find an empty location in the address space if the specified address range
has already been mapped by something else. If addr is
zero and MAP_FIXED is not specified, then an address will be selected by the
system so as not to overlap any existing mappings in the address space. In
all cases, the actual starting address of the region is returned. If
MAP_FIXED is specified, a successful mmap deletes any
previous mapping in the allocated address range. Previous mappings are never
deleted if MAP_FIXED is not specified.
The protections (region accessibility) are specified in the prot argument by or'ing the following values:
PROT_NONE- Pages may not be accessed.
PROT_READ- Pages may be read.
PROT_WRITE- Pages may be written.
PROT_EXEC- Pages may be executed.
Note that, due to hardware limitations, on some platforms PROT_WRITE may imply PROT_READ, and PROT_READ may imply PROT_EXEC. Portable programs should not rely on these flags being separately enforceable.
When the hardened runtime is enabled (See the links in the
SEE ALSO section), the protections cannot
be both PROT_WRITE and
PROT_EXEC without also having the flag
MAP_JIT and the process possessing the
com.apple.security.cs.allow-jit entitlement
The flags argument 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 (copy-on-write) or are to be shared with other references. Sharing, mapping type and options are specified in the flags argument by or'ing the following values:
MAP_ANONYMOUS- Synonym for
MAP_ANON. MAP_ANON- Map zero-filled anonymous memory not associated with any specific file.
The offset argument is ignored.
Mac OS X specific: the fd used for creating
MAP_ANONregions can be used to pass some Mach VM flags, and can be specified as -1 if no such flags are associated with the region. Mach VM flags are defined in<mach/vm_statistics.h>and the ones that currently apply tommapare:VM_FLAGS_PURGABLE to create Mach purgable (i.e. volatile) memory.
VM_MAKE_TAG(tag) to associate an 8-bit tag with the region.
<mach/vm_statistics.h>defines some preset tags (with a VM_MEMORY_ prefix). Users are encouraged to use tags between 240 and 255. Tags are used by tools such as vmmap(1) to help identify specific memory regions. MAP_FILE- Mapped from a regular file. (This is the default mapping type, and need not be specified.)
MAP_FIXED- Do not permit the system to select a different address than the one
specified. If the specified address cannot be used,
mmap() will fail. IfMAP_FIXEDis specified, addr must be a multiple of the pagesize. If aMAP_FIXEDrequest is successful, the mapping established bymmap() replaces any previous mappings for the process' pages in the range from addr to addr + len. Use of this option is discouraged. MAP_HASSEMAPHORE- Notify the kernel that the region may contain semaphores and that special handling may be necessary.
MAP_PRIVATE- Modifications are private (copy-on-write).
MAP_SHARED- Modifications are shared.
MAP_NOCACHE- Pages in this mapping are not retained in the kernel's memory cache. If the system runs low on memory, pages in MAP_NOCACHE mappings will be among the first to be reclaimed. This flag is intended for mappings that have little locality and provides a hint to the kernel that pages in this mapping are unlikely to be needed again in the near future.
MAP_JIT- Allow mapping pages both
PROT_WRITEandPROT_EXECwhen the hardened runtime is enabled. Without this flag an attempt to create a mapping with bothPROT_WRITEandPROT_EXECset will fail withMAP_FAILEDon macOS. A writable, but not executable mapping is returned on iOS, watchOS and tvOS.Usage of this flag requires the caller to have the
com.apple.security.cs.allow-jitentitlement on macOS. MAP_32BIT- Directs
mmap() to place the mapping into the first 4 Gigabytes of the process's address space. If there is no free virtual address space in this range,mmap() will returnMAP_FAILED.Note that in order for this flag to yield addresses below 4GiB, the program's PAGEZERO must be reduced in size, since the default PAGEZERO size for 64-bit programs is at least 4GiB.
Conforming applications must specify either MAP_PRIVATE or MAP_SHARED.
The close(2) system call 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.
RETURN VALUES
Upon successful completion, mmap() returns
a pointer to the mapped region. Otherwise, a value of
MAP_FAILED is returned and
errno is set to indicate the error.
ERRORS
The mmap() system call will fail if:
- [
EACCES] - The flag
PROT_READwas specified as part of the prot argument and fd was not open for reading. The flagsMAP_SHAREDandPROT_WRITEwere specified as part of the flags and prot argument and fd was not open for writing. - [
EBADF] - The fd argument is not a valid open file descriptor.
- [
EINVAL] MAP_FIXEDwas specified and the addr argument was not page aligned, or part of the desired address space resides out of the valid address space for a user process.- [
EINVAL] - flags does not include either MAP_PRIVATE or MAP_SHARED.
- [
EINVAL] - flags includes bits that are not part of any valid flags value.
- [
EINVAL] - The len argument was negative or zero. Historically, the system call would not return an error if the argument was zero. See other potential additional restrictions in the COMPATIBILITY section below.
- [
EINVAL] - The offset argument was not page-aligned based on the page size as returned by getpagesize(3).
- [
ENODEV] MAP_ANONhas not been specified and the file fd refers to does not support mapping.- [
ENOMEM] MAP_FIXEDwas specified and the addr argument was not available.MAP_FIXEDwas specified and the address range specified exceeds the address space limit for the process.MAP_ANONwas specified and insufficient memory was available.- [
ENXIO] - Addresses in the specified range are invalid for fd.
- [
EOVERFLOW] - Addresses in the specified range exceed the maximum offset set for fd.
ENTITLEMENTS
The following entitlements only have an effect when the hardened runtime is enabled.
com.apple.security.cs.allow-jit- A Boolean value that indicates whether the app may create writable and
executable memory using the
MAP_JITflag. com.apple.security.cs.allow-unsigned-executable-memory- A Boolean value that indicates whether the app may create writable and
executable memory without the restrictions imposed by using the
MAP_JITflag. com.apple.security.cs.disable-executable-page-protection- A Boolean value that indicates whether to disable all code signing protections while launching an application, and during its execution.
LEGACY SYNOPSIS
#include
<sys/types.h> #include
<sys/mman.h>
The include file
<sys/types.h> is
necessary.
COMPATIBILITY
mmap() now returns with
errno set to EINVAL in places that historically
succeeded. The rules have changed as follows:
- The flags parameter must specify either MAP_PRIVATE or MAP_SHARED.
- The len parameter must not be 0.
- The off parameter must be a multiple of pagesize, as
returned by
sysconf().
On macOS 10.14 Mojave the hardened runtime restricts pages from
having both the PROT_WRITE and
PROT_EXEC protections without the caller also
setting the MAP_JIT flag and
possessing the com.apple.security.cs.allow-jit
entitlement.
SEE ALSO
madvise(2), mincore(2), minherit(2), mlock(2), mprotect(2), msync(2), munlock(2), munmap(2), shmat(2), getpagesize(3)
Apple Developer Documentation
https://developer.apple.com/documentation/security/hardened_runtime_entitlements
| February 14, 2020 | macOS 26.4 |