1 .\" Copyright (c) 1991, 1993
2 .\" The Regents of the University of California. All rights reserved.
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\" notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\" notice, this list of conditions and the following disclaimer in the
11 .\" documentation and/or other materials provided with the distribution.
12 .\" 4. Neither the name of the University nor the names of its contributors
13 .\" may be used to endorse or promote products derived from this software
14 .\" without specific prior written permission.
16 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 .\" @(#)mmap.2 8.4 (Berkeley) 5/11/95
29 .\" $FreeBSD: src/lib/libc/sys/mmap.2,v 1.56 2007/01/09 00:28:15 imp Exp $
36 .Nd allocate memory, or map files or devices into memory
42 .Fn mmap "void *addr" "size_t len" "int prot" "int flags" "int fd" "off_t offset"
46 system call causes the pages starting at
48 and continuing for at most
50 bytes to be mapped from the object described by
52 starting at byte offset
58 is not a multiple of the pagesize, the mapped region may extend past the
60 Any extension beyond the end of the mapped object will be zero-filled.
64 argument is used by the system to determine the starting address of the mapping,
65 and its interpretation is dependent on the setting of the MAP_FIXED flag.
66 If MAP_FIXED is specified in
68 the system will try to place the mapping at the specified address,
70 mapping that already exists at that location.
71 If MAP_FIXED is not specified,
72 then the system will attempt to use the range of addresses starting at
74 if they do not overlap any existing mappings,
75 including memory allocated by
77 and other such allocators.
79 the system will choose an alternate address for the mapping (using an implementation
81 that does not overlap any existing
86 the system will attempt to find an empty location in the address space if the
87 specified address range has already been mapped by something else.
90 is zero and MAP_FIXED is not specified,
91 then an address will be selected by the system so as not to overlap
92 any existing mappings in the address space.
94 the actual starting address of the region is returned.
95 If MAP_FIXED is specified,
98 deletes any previous mapping in the allocated address range.
99 Previous mappings are never deleted if MAP_FIXED is not specified.
101 The protections (region accessibility) are specified in the
105 the following values:
107 .Bl -tag -width PROT_WRITE -compact
109 Pages may not be accessed.
113 Pages may be written.
115 Pages may be executed.
118 Note that, due to hardware limitations, on some platforms PROT_WRITE may
119 imply PROT_READ, and PROT_READ may imply PROT_EXEC. Portable programs
120 should not rely on these flags being separately enforceable.
122 When the hardened runtime is enabled
128 the protections cannot be both
132 without also having the flag
134 and the process possessing the
135 .Dv com.apple.security.cs.allow-jit
140 argument specifies the type of the mapped object, mapping options and
141 whether modifications made to the mapped copy of the page are private
142 to the process (copy-on-write) or are to be shared with other references.
143 Sharing, mapping type and options are specified in the
147 the following values:
148 .Bl -tag -width MAP_HASSEMAPHORE
153 Map anonymous memory not associated with any specific file.
157 Mac OS X specific: the file descriptor used for creating
159 regions can be used to pass some Mach VM flags, and can
160 be specified as \-1 if no such flags are associated with
161 the region. Mach VM flags are defined in
162 .In mach/vm_statistics.h
163 and the ones that currently apply
168 VM_FLAGS_PURGABLE to create Mach purgable (i.e. volatile) memory.
170 VM_MAKE_TAG(tag) to associate an 8-bit tag with the region.
172 .In mach/vm_statistics.h
173 defines some preset tags (with a VM_MEMORY_ prefix).
174 Users are encouraged to use tags between 240 and 255.
175 Tags are used by tools such as
177 to help identify specific memory regions.
179 Mapped from a regular file. (This is
180 the default mapping type, and need not be specified.)
182 Do not permit the system to select a different address than the one
184 If the specified address cannot be used,
191 must be a multiple of the pagesize.
194 request is successful, the mapping established by
196 replaces any previous mappings for the process' pages in the range from
202 Use of this option is discouraged.
203 .It Dv MAP_HASSEMAPHORE
204 Notify the kernel that the region may contain semaphores and that special
205 handling may be necessary.
207 Modifications are private (copy-on-write).
209 Modifications are shared.
211 Pages in this mapping are not retained in the kernel's memory cache.
212 If the system runs low on memory, pages in MAP_NOCACHE mappings will be among
213 the first to be reclaimed.
214 This flag is intended for mappings that have little locality and
215 provides a hint to the kernel that pages in this mapping are unlikely to be needed
216 again in the near future.
218 Allow mapping pages both
222 when the hardened is runtime enabled. Without this flag an attempt to create a
229 on macOS. A writable, but not executable mapping
230 is returned on iOS, watchOS and tvOS.
232 Usage of this flag requires the caller to have the
233 .Dv com.apple.security.cs.allow-jit
234 entitlement on macOS.
238 to place the mapping into the first 4 Gigabytes of the process's address space. If
239 there is no free virtual address space in this range,
244 Note that in order for this flag to yield addresses below 4GiB, the program's
245 PAGEZERO must be reduced in size, since the default PAGEZERO size for 64-bit
246 programs is at least 4GiB.
249 Conforming applications must specify either MAP_PRIVATE or MAP_SHARED.
253 system call does not unmap pages, see
255 for further information.
257 The current design does not allow a process to specify the location of
259 In the future we may define an additional mapping type,
262 the file descriptor argument specifies a file or device to which swapping
265 Upon successful completion,
267 returns a pointer to the mapped region.
268 Otherwise, a value of
272 is set to indicate the error.
282 was specified as part of the
286 was not open for reading.
291 were specified as part of the
297 was not open for writing.
302 is not a valid open file descriptor.
305 was specified and the
307 argument was not page aligned, or part of the desired address space
308 resides out of the valid address space for a user process.
311 does not include either MAP_PRIVATE or MAP_SHARED.
314 includes bits that are not part of any valid flags value.
319 was negative or zero. Historically, the system call would not return an error
320 if the argument was zero.
321 See other potential additional restrictions in the
322 COMPATIBILITY section below.
327 was not page-aligned based on the page size as returned by getpagesize(3).
330 has not been specified and the file
332 refers to does not support mapping.
335 was specified and the
337 argument was not available.
339 was specified and the address range specified exceeds the address space
340 limit for the process.
342 was specified and insufficient memory was available.
344 Addresses in the specified range are invalid for
347 Addresses in the specified range exceed the maximum offset
352 The following entitlements only have an effect when the hardened runtime is
355 .It Dv com.apple.security.cs.allow-jit
356 A Boolean value that indicates whether the app may create writable and
357 executable memory using the
360 .It Dv com.apple.security.cs.allow-unsigned-executable-memory
361 A Boolean value that indicates whether the app may create writable and
362 executable memory without the restrictions imposed by using the
365 .It Dv com.apple.security.cs.disable-executable-page-protection
366 A Boolean value that indicates whether to disable all code signing
367 protections while launching an application, and during its execution.
370 .Fd #include <sys/types.h>
371 .Fd #include <sys/mman.h>
380 set to EINVAL in places that historically succeeded.
381 The rules have changed as follows:
386 parameter must specify either MAP_PRIVATE or MAP_SHARED.
390 parameter must not be 0.
394 parameter must be a multiple of pagesize,
399 On macOS 10.14 Mojave the hardened runtime restricts pages from having both
404 protections without the caller also setting the
408 .Dv com.apple.security.cs.allow-jit
421 .Ss Apple Developer Documentation
422 https://developer.apple.com/documentation/security/hardened_runtime_entitlements